プロジェクトビルド時の SourceMap アップロード¶
Guanceは、Web プロジェクトのビルド時に、対応するディレクトリの SourceMap ファイルを簡単にアップロードできる webpack プラグインを提供しています。煩雑な手動アップロードの手間を解消します。
注意:現在は Web アプリケーションのアップロードのみ対応しています。
準備¶
- 対応するサイトの
OpenApiドメイン名アドレスを取得します。 - Guanceで、対応する
OpenApiに必要なAPI KEYを取得します。 - Guanceプラットフォームで Web アプリケーションの
applicationId、env、version情報を取得します。アプリケーションがない場合は、新規アプリケーションを作成する必要があります。 - これで準備完了です。
Webpack¶
@cloudcare/webpack-plugin をインストール
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¶
filepaths と root の設定に関する注意事項:¶
-
Guanceコンソールにエラーの行の1つとして
at SVGGElement.<anonymous> @ http://localhost:8000/js/chunk-vendors.732b3b98.js:1:93427が表示されます -
エラーの原因となったファイルの相対パスは
js/chunk-vendors.732b3b98.jsです -
js ファイルがサーバー上の静的ディレクトリ
dist/js/*.jsdist/js/*.js.mapにある場合 -
プラグインの設定
filepaths: ['dist'] -
rootを設定しない場合、デフォルト値はdist/となり、最終的にGuanceサーバーにアップロードされる sourcemap ファイルのパスはdist/js/**.js.mapになります -
この場合、アップロードファイルのディレクトリパスとエラーが発生したパスが一致しない状況が発生するため、
root:'/'またはroot: ''を設定して、アップロードされるディレクトリパスがjs/**.js.mapになるようにする必要があります。