🌈

next build時のCannot get final name for export NO_RETRY_INCREMENT を解決する

2024/10/04に公開

何が起きたか

Next.js(App Router)で@aws-sdkを使ってファイルのアップロードの機能を実装した。
機能実装を終えたタイミングでnext buildをした後にエラーが発生をした。

  ▲ Next.js 14.2.5
  - Environments: .env.local, .env

   Creating an optimized production build ...
Failed to compile.

./node_modules/@aws-sdk/middleware-sdk-s3/dist-es/s3-express/functions/s3ExpressHttpSigningMiddleware.js + 43 modules
Cannot get final name for export 'NO_RETRY_INCREMENT' of ./node_modules/@smithy/util-retry/dist-es/index.js

なお関係しているライブラリのバージョンは下記になります。

"@aws-sdk/client-s3": "^3.658.1",
"@aws-sdk/s3-request-presigner": "^3.658.1",
"next": "14.2.5",

発生原因

エラー内容で調べるといくつかの似たようなIsseue等が既に報告をされていた。
どうもServerComponentに関係をするエラーだということはわかりました。

https://github.com/aws/aws-sdk-js-v3/issues/5488

解決方法

早速なのですが、下記で修正方法が紹介をされていて、next.congigでserverComponentsExternalPackagesに対象のpackageを指定することで解決をしました。

const nextConfig = {
  experimental: {
    serverComponentsExternalPackages: ['@aws-sdk'],
  },
}

https://github.com/aws/aws-sdk-js-v3/issues/5540#issuecomment-1849103151

原因

正直にあまり理解が出来ていないのですが、experimentalのserverComponentsExternalPackagesの機能についてはこちらで紹介をされていたので確認をしました。

https://nextjs.org/docs/app/api-reference/next-config-js/serverExternalPackages

Dependencies used inside Server Components and Route Handlers will automatically be bundled by Next.js.
If a dependency is using Node.js specific features, you can choose to opt-out specific dependencies from the Server Components bundling and use native Node.js require.

下記は日本語訳
サーバーコンポーネントとルートハンドラの内部で使用される依存関係は、Next.jsによって自動的にバンドルされます。
依存関係がNode.js固有の機能を使用している場合、特定の依存関係をServer Componentsのバンドルから除外し、ネイティブのNode.js requireを使用するように選択できます。

「ネイティブのNode.js requireを使用するように選択できます。」の部分があまり理解をしていないのですが、next buildをした時にクライアント側のビルドに@aws-sdkを含めるとNode.js部分の実装まじってエラーになるから依存関係として含めないようにした。
ということだと理解をしています。(ここ間違っている可能性高いのでわかる人いたら教えてください🙏)

最後に

なお、今までserverComponentsExternalPackagesという名前だったものが、v15からはserverExternalPackagesになるみたいです。

調べて解決をするまでに少しだけ時間がかかったので誰かの助けになれば幸いです。

https://nextjs.org/docs/app/api-reference/next-config-js/serverExternalPackages

immedioテックブログ

Discussion