Nuxt+Amplifyで"global is not defined"が発生する場合の対処法
まずは対処法
nuxt.config.ts
にこちらの設定を追加してください。
export default defineNuxtConfig({
// ...,
vite: {
define: {
"window.global": {},
},
},
});
これにてエラーが解消されるはずです。ここまで読んでくださりありがとうございました!
・・・以下は全ておまけです。
どうしてエラーが発生するのか
原因はaws-amplify
の依存モジュールbuffer
にあるこちらの処理です。
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
? global.TYPED_ARRAY_SUPPORT
: typedArraySupport()
Nuxtでviteを使用している場合、npm run dev
等で開発サーバーを起動すると、node_modulesはバンドルされずにそのまま使われるようです。
それにもかかわらず、ブラウザでは未定義のglobal
を使おうとするためglobal is not defined
となってしまいます。
OSSコミュニティに直接聞いてみた
エラーの原因となっているbuffer
モジュールのこのバグは、最新バージョンでは解消されています。しかし、aws-amplify
の依存モジュールamazon-cognito-identity-js
では、古いバージョンの4.9.2
を使い続けていました。こちらをバージョンアップするためのPRをリポジトリで見つけたのですが、マージされずに放置されていたので質問してみました。
回答がこちら。
this issue will cause some breaking changes, and it will be fixed as part of our next major version bump of our library. We do not have an exact ETA, but we will provide an update when we do!
どうやら、次のメジャーバージョンのリリースで解消されるようです。(予定は未定)
結論
とりあえずは、viteの設定にてglobal
を空のオブジェクトとして定義することでエラーを解消することができます。
いずれは、amazon-cognito-identity-js
のアップデートでその設定が不要になるはずです。
Discussion