Closed5

Next.jsでVercelの本番環境のデプロイ時に、BugsnagにSource Mapsをアップロードする

HaruHaru

参照

Next.jsの本番環境でもSource Maps生成を有効にする

https://nextjs.org/docs/advanced-features/source-maps

Next.jsのランタイム設定

https://nextjs-ja-translation-docs.vercel.app/docs/api-reference/next.config.js/runtime-configuration

プラグイン (webpack-bugsnag-plugins

https://docs.bugsnag.com/build-integrations/webpack/#uploading-source-maps

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;
  },
}
HaruHaru

参照

publicPath オプションの適用

https://github.com/bugsnag/webpack-bugsnag-plugins/issues/5

詳細

上記の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を管理したいときなど。

HaruHaru

参照

ReactでのBugsnagの設定方法

https://docs.bugsnag.com/platforms/javascript/react/

Bugsnagの実装

https://docs.bugsnag.com/build-integrations/webpack/#uploading-source-maps

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()],
});
HaruHaru

参照

議論されているIssue

https://github.com/vercel/next.js/discussions/24342#discussioncomment-643887

rewrites

https://nextjs.org/docs/api-reference/next.config.js/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",
        },
      ],
    };
  }
}
このスクラップは2023/01/23にクローズされました