Next.jsでVercelの本番環境のデプロイ時に、BugsnagにSource Mapsをアップロードする
Bugsnag
インストール
webpack用のBugsnag uploaderをインストール
yarn add --dev webpack-bugsnag-plugins
参照
Next.jsの本番環境でもSource Maps生成を有効にする
Next.jsのランタイム設定
プラグイン (webpack-bugsnag-plugins
next.config.js
// next.config.js
const { BugsnagSourceMapUploaderPlugin } = require("webpack-bugsnag-plugins");
module.exports = {
// 本番環境でもSource Maps生成を有効にする
productionBrowserSourceMaps: true,
// 実行時にクライアントとサーバー側両方で読み込める値で、
// package.jsonのversionの変数を定義する
publicRuntimeConfig: {
version: process.env.npm_package_version,
},
webpack: (config) => {
// Vercelでデフォルト適用される環境変数を利用して、本番環境かどうかを確認。
if (process.env.NEXT_PUBLIC_VERCEL_ENV === "production") {
config.plugins.push(
new BugsnagSourceMapUploaderPlugin({
// 自身でVercelのプロジェクトの環境変数に設定した、
// BugsnagのAPI Keyを適用
apiKey: process.env.NEXT_PUBLIC_BUGSNAG_API_KEY,
appVersion: process.env.npm_package_version,
overwrite: true,
publicPath: "*/",
})
);
}
return config;
},
}
参照
publicPath オプションの適用
詳細
上記のpublicPath オプションの適用がはまりポイント。
公式のexampleにはのってなくて、Source Mapsはuploadされているのに、なぜ適用されないのかが分かりづらかった。
publicPathが指定されていないと、下記のようにアップロードされたSourceMapsの SOURCE URL
の列がpathのみになる
/_next/static/chunks/pages/_app-3e8c13c4e9b9b538.js
publicPathの設定を */
にすると、domain部分を任意の値として適用される。
*/_next/static/chunks/pages/_app-3e8c13c4e9b9b538.js
publicPathの設定で本番環境のURLなどを指定するのもよい。
devやstgと別々にSource Mapsを管理したいときなど。
参照
ReactでのBugsnagの設定方法
Bugsnagの実装
The appVersion must match the app version in your notifier configuration.
ビルド時にアップロードしたSource Mapsのversionと実行時のアプリのバージョンを統一する必要あり。
// _app.ts
import Bugsnag from '@bugsnag/js';
import BugsnagPluginReact from '@bugsnag/plugin-react';
import getConfig from 'next/config';
const {publicRuntimeConfig} = getConfig();
Bugsnag.start({
// next.config.jsで指定した値と同じ値
apiKey: process.env.NEXT_PUBLIC_BUGSNAG_API_KEY,
// next.config.jsで指定したversionと同じversionを指定する必要がある。
// そのためpublicRuntimeConfigに適用した、package.jsonのversionを指定する
appVersion: publicRuntimeConfig.version,
// vercelの環境で分けておくと便利
releaseStage: process.env.NEXT_PUBLIC_VERCEL_ENV ?? 'local',
plugins: [new BugsnagPluginReact()],
});
参照
議論されているIssue
rewrites
Source Mapsを削除したい
セキュリティ的に本番環境ではSource Mapsは公開したくないので、
アップロード後に必要のなくなったSource Mapsを削除したい。
削除するのではなく、より簡単にNext.jsの rewrite/redirect を用いて、.mapファイルの参照を不可にする
// next.config.js
module.exports = {
rewrites() {
return {
beforeFiles: [
{
source: "/:path*.map",
destination: "/404",
},
],
};
}
}