コンテンツにスキップ

プロジェクトビルド時の SourceMap アップロード

Guanceは、Web プロジェクトのビルド時に、対応するディレクトリの SourceMap ファイルを簡単にアップロードできる webpack プラグインを提供しています。煩雑な手動アップロードの手間を解消します。

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

準備

  1. 対応するサイトの OpenApi ドメイン名アドレスを取得します。
  2. Guanceで、対応する OpenApi に必要な API KEY取得します。
  3. Guanceプラットフォームで Web アプリケーションの applicationIdenvversion 情報を取得します。アプリケーションがない場合は、新規アプリケーションを作成する必要があります。
  4. これで準備完了です。

Webpack

@cloudcare/webpack-plugin をインストール

 npm install @cloudcare/webpack-plugin --D

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

// ....
const { SourceMapUploadWebpackPlugin } = require("@cloudcare/webpack-plugin")
module.exports = ({ mode }) => ({
  //.....
  devtool: "hidden-source-map",
  plugins: [
    //.....
    new SourceMapUploadWebpackPlugin({
      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、任意
    }),
  ],
})

SourceMap WebpackPlugin 設定説明

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>

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

プロダクション環境における SourceMap の可視性

プロダクション環境では、セキュリティ上の理由から SourceMap ファイルを保持しないのが一般的です。これらのファイルは、圧縮またはコンパイルされたコードを元のソースコードにマッピングすることを可能にしますが、公開されるとアプリケーションの内部ロジックが露呈し、セキュリティリスクが高まる可能性があります。

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

さらに、Webpack の devtool を "hidden-source-map" に設定することで、JavaScript ファイルに SourceMap への参照を含めずに SourceMap を生成できます。これにより、ブラウザがソースコードをダウンロードして表示しようとするのを防ぎます。

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

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

 const { SourceMapUploadWebpackPlugin } = require('@cloudcare/webpack-plugin')
 = require('@cloudcare/webpack-plugin')

module.exports = {
  // Ensure that Webpack has been configured to output sourcemaps,
  // but without the `sourceMappingURL` references in buidl artifacts.
  devtool: 'hidden-source-map',
  // ...
  plugins: [
    // Enable our plugin to upload the sourcemaps once the build has completed.
    // This assumes NODE_ENV is how you distinguish production builds. If that
    // is not the case for you, you will have to tweak this logic.
    process.env.NODE_ENV === 'production'
      ? [
          new SourceMapUploadWebpackPlugin({
            ...
            deleteAfterUpload: true,
            matchSourcemapsByFilename: true,
          }),
        ]
      : [],
  ],
}

デバッグ方法

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

注意事項

node バージョン > 10.13、webpack バージョン > 4

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

  1. Guanceコンソールにエラーの行の1つとして at SVGGElement.<anonymous> @ http://localhost:8000/js/chunk-vendors.732b3b98.js:1:93427 が表示されます

  2. エラーの原因となったファイルの相対パスは js/chunk-vendors.732b3b98.js です

  3. js ファイルがサーバー上の静的ディレクトリ dist/js/*.js dist/js/*.js.map にある場合

  4. プラグインの設定 filepaths: ['dist']

  5. root を設定しない場合、デフォルト値は dist/ となり、最終的にGuanceサーバーにアップロードされる sourcemap ファイルのパスは dist/js/**.js.map になります

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

フィードバック

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