🔫

[recoil] 環境変数で Expectation Violation: Duplicate atom key "hoge". を回避する

2022/11/07に公開

next.js に recoil を入れると、こんなかんじのエラーがターミナルにばーっと出る。

Expectation Violation: Duplicate atom key "hogehgoe". This is a FATAL ERROR in
production. But it is safe to ignore this warning if it occurred because of
hot module replacement.
at expectationViolation (/Users/hoge/projectname/node_modules/recoil/cjs/index.js:558:19)
at registerNode (/Users/hoge/projectname/node_modules/recoil/cjs/index.js:665:9)
at baseAtom (/Users/hoge/projectname/node_modules/recoil/cjs/index.js:8209:16)
at atom (/Users/hoge/projectname/node_modules/recoil/cjs/index.js:8262:12)
at eval (webpack-internal:///./src/global-states/hogehoge.ts:15:75)
at Object../src/global-states/hogehgoe.ts (/Users/hoge/projectname/.next/server/pages/_app.js:176:1)
at **webpack_require** (/Users/hoge/projectname/.next/server/webpack-runtime.js:33:42)
at eval (webpack-internal:///./src/components/functional/initialize-hogehoge/initialize-hoge.tsx:7:84)
at Object../src/components/functional/initialize-hogehoge/initialize-hogehoge.tsx (/Users/yanagi/work/p-game/p-game-renewal2022-client/.next/server/pages/_app.js:143:1)
at **webpack_require** (/Users/hoge/projectname/.next/server/webpack-runtime.js:33:42)

プロジェクトが始まったころ、このエラー関連の issue を読むと、「このエラー表示したくないなら intercept-stdout ってパッケージいれて、next.config.js でごにょごにょやればいいよ」みたいなことが書いてあって、なんか面倒だな。あとで対応いれればいいやと思って放置してた。

issue

https://github.com/facebookexperimental/Recoil/issues/733

放置したままにしてたら、pm2 のログがこの recoil のエラーに汚染されるのが我慢できなくなったので、そろそろ消そうと決心して issue を見に行ったら、「recoil の v0.7.6 だったら環境変数で RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED=false を指定するとエラーでなくなるよ」みたいなコメントがあった。

ほんとうに対応してあった。あざす。
https://github.com/facebookexperimental/Recoil/releases/tag/0.7.6

やってく。
recoil のバージョンを v0.7.6 以降にする。

npm i recoil@latest

自分の環境で使用している任意の .env ファイルに下記を追加する。

RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED=false

これでエラーが表示されなくなった。めでたしめでたし。

ただ公式に「 Caution: This disables all checks for duplicate atom keys including legitimate errors, so use with caution! (エラーなんにも表示されなくなるから気をつけろよ(超意訳))」って書いてあるので、開発環境では出しっぱなしでいいのかもしれない。本番環境の .env.local とかで設定するのがいちばん良さそう

おしまい。

Discussion