next build時のCannot get final name for export NO_RETRY_INCREMENT を解決する
何が起きたか
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に関係をするエラーだということはわかりました。
解決方法
早速なのですが、下記で修正方法が紹介をされていて、next.congigでserverComponentsExternalPackages
に対象のpackageを指定することで解決をしました。
const nextConfig = {
experimental: {
serverComponentsExternalPackages: ['@aws-sdk'],
},
}
原因
正直にあまり理解が出来ていないのですが、experimentalのserverComponentsExternalPackages
の機能についてはこちらで紹介をされていたので確認をしました。
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
になるみたいです。
調べて解決をするまでに少しだけ時間がかかったので誰かの助けになれば幸いです。
Discussion