コンテンツにスキップ

プロジェクトビルド中に SourceMap をアップロードする

Guance では、Vite プラグインを提供しており、Web プロジェクトのビルド中に対応するディレクトリの SourceMap ファイルを簡単にアップロードできます。

注意: 現在は Web アプリケーションのアップロードに対応しています。

準備

  1. 対象サイトの OpenApi ドメインアドレスを取得します。
  2. Guance で OpenApi に必要な API KEY取得します。
  3. Guance で Web アプリケーションの applicationIdenvversion 情報を取得します。アプリケーションがない場合は、新しいアプリケーションを作成します。
  4. 準備完了です。

Vite

@cloudcare/vite-plugin-sourcemap をインストールします。

Using npm:

npm install @cloudcare/vite-plugin-sourcemap --save-dev

Using yarn:

yarn add @cloudcare/vite-plugin-sourcemap --dev

Using pnpm:

pnpm add @cloudcare/vite-plugin-sourcemap --save-dev

vite.config.js ファイルの plugins オプションを変更します。

// vite.config.ts
import { defineConfig } from "vite"
import vue from "@vitejs/plugin-vue"
import { SourceMapUploadVitePlugin } from "@cloudcare/vite-plugin-sourcemap"
// https://vitejs.dev/config/
export default defineConfig({
  build: {
    sourcemap: true, // Source map の生成を有効にする必要があります
  },
  plugins: [
    vue(),

    SourceMapUploadVitePlugin({
      applicationId: "xxxxx", //  Guance アプリケーション appid
      apiKey: "xxxxxxxx", // open apikey
      server: "https://console.xx-xxx.cn", // サイトに対応する openapi アドレス
      filepaths: ["dist/"], // 検索するディレクトリ。ファイルまたはディレクトリを指定できます
      logLevel: "verbose", // ログ出力レベル
      //   root: 'dist/', // アップロードする相対ディレクトリに対応するルートディレクトリ
      env: "production", // Guance アプリケーションの env
      version: "1.0.0", // Guance アプリケーションの version
    }),
  ],
})

Sourcemap Plugin Options

interface Options {
  /**
   *
   * sourcemap を検索するファイル/ディレクトリ。
   * "extensions 設定" リストに一致し、"ignore 設定" に一致しないすべてのファイルが検索されます。
   * sourcemap JSON または `//#sourceMappingURL=` コメントを検索し、生成されたファイルとソースマップのペアを見つけ出し、ソースマップをアップロードします。
   */
  filepaths: Array<string> | string

  /**
   * Guance プラットフォームで生成された openApi Key。生成方法については(https://docs.guance.com/ja/management/api-key/open-api/#_1)を参照してください。
   */
  apiKey: string

  /**
   * Guance プラットフォームの OpenAPI サービス
   */
  server: string
  /**
   * Guance RUM アプリケーションに対応する applicationId(必須)
   */
  applicationId: string
  /**
   * Guance RUM アプリケーションに対応する version(任意)
   */
  version?: string
  /**
   * Guance RUM アプリケーションに対応する env(任意)
   */
  env?: string

  /**
   * 条件に一致するすべてのファイルを検索しますが、アップロードは行いません。デバッグに使用できます。
   */
  dryRun?: boolean
  /**
   * アップロード後、見つかったすべてのソースマップファイルを削除します。
   */
  deleteAfterUpload?: boolean
  /**
   * ソースマップが sourceMappingURL を介して生成されたファイルと一致しない場合、ローカルディスク上のファイル名で一致を試みます。
   */
  matchSourcemapsByFilename: ?boolean

  /**
   * ディレクトリ内で検索するファイルの拡張子リスト。
   * デフォルトは [".js", ".map"]。
   */
  extensions?: Array<string>

  /**
   * 無視するファイルのリスト。
   */
  ignore?: Array<string>

  /**
   * 相対パスを計算する基準となるディレクトリを設定します。アップロードされるソースマップの相対パスには、エラーが発生したパスが含まれている必要があります。そのため、
   * このパラメータはアップロードされる相対ディレクトリを制御することを意味します。
   * デフォルトは、実行ディレクトリから検索ディレクトリへの相対パス path.relative(process.cwd(), filepath) です。
   */
  root?: string
  /**
   * デバッグ時に使用する、出力されるログのレベルです。
   */
  logLevel?: "quiet" | "normal" | "verbose"
  /**
   * 実行に失敗した場合にエラーを無視するかどうか。この設定により、エラーが発生してもコンパイルプロセスが中断されないことを保証します。デフォルトは false、つまり通常通りエラーがスローされます。
   */
  warnOnFailure?: boolean
}

Sourcemap は本番環境で参照可能か

本番環境では、セキュリティ上の理由から、通常システムは sourcemap ファイルを保持しません。これらのファイルを使用すると、開発者は圧縮またはコンパイルされたコードを元のソースコードにマッピングできますが、公開されるとアプリケーションの内部ロジックが公開され、セキュリティリスクが高まる可能性があります。

sourcemap を安全に処理するには、SourceMapUploadVitePlugin を設定する際に deleteAfterUpload: true オプションを有効にすることができます。これにより、sourcemap がサーバーにアップロードされるとすぐにローカルファイルシステムから削除され、本番環境に残らないようにできます。

さらに、vite.config.tsbuild.sourcemap"hidden" に設定することで、JavaScript ファイルに sourcemap への参照を含めずに Sourcemap を生成できます。これにより、ブラウザがソースコードをダウンロードして表示しようとするのを防ぐことができます。

"hidden" を有効にした場合は、SourceMapUploadVitePlugin プラグインで matchSourcemapsByFilename: true も設定する必要があります。この設定により、生成されたコードに明示的な参照がなくても、プラグインが JavaScript ファイルの名前に基づいて対応する Sourcemap ファイルを識別してアップロードできるようになります。

これらの対策により、アプリケーションのデバッグの利便性を維持しながら、ソースコードのセキュリティを効果的に保護できます。

// vite.config.ts
import { defineConfig } from "vite"
import vue from "@vitejs/plugin-vue"
import { SourceMapUploadVitePlugin } from "@cloudcare/vite-plugin-sourcemap"
// https://vitejs.dev/config/
export default defineConfig({
  build: {
    sourcemap: "hidden", // Source map の生成を有効にする必要があります
  },
  plugins: [
    vue(),

    SourceMapUploadVitePlugin({
      applicationId: "xxxxx", //  Guance アプリケーション appid
      apiKey: "xxxxxxxx", // open apikey
      server: "https://console.xxx-xxx.cn",
      filepaths: ["dist/"], // 検索するディレクトリ。ファイルまたはディレクトリを指定できます
      logLevel: "verbose", // ログ出力レベル
      //   root: 'dist/', // アップロードする相対ディレクトリに対応するルートディレクトリ
      env: "production", // Guance アプリケーションの env
      version: "1.0.0", // Guance アプリケーションの version
      deleteAfterUpload: true,
      matchSourcemapsByFilename: true,
    }),
  ],
})

デバッグ方法

実行中に対応する Sourcemap が見つからない場合は、環境変数 DEBUG=sourcemap-upload を設定するか、logLevel: verbose を設定して build コマンドを実行し、実行ログを確認できます。

注意事項

  • Node バージョン > 16 である必要があります。

  • filepathsroot の設定に関する注意事項:

コンソールにエラーの一行 at SVGGElement.<anonymous> @ http://localhost:8000/js/chunk-vendors.732b3b98.js:1:93427 がある場合、エラーが発生したファイルの相対パスは js/chunk-vendors.732b3b98.js です。js ファイルがサーバー側の静的ディレクトリに dist/js/*.js dist/js/*.js.map として配置されている場合、プラグインの設定は filepaths: ['dist'] となります。

root を設定しない場合、デフォルト値は dist/ となり、最終的にサーバーにアップロードされる Sourcemap ファイルのパスは dist/js/**.js.map になります。この場合、アップロードされるファイルのディレクトリパスエラーが発生したパスが一致しなくなります。そのため、このような場合は root: '/' または root: '' を設定して、アップロードされるディレクトリパスが js/**.js.map になるようにする必要があります。

フィードバック

このページは役に立ちましたか?