Nuxt3でfalse.accept is not a functionのビルド後の実行時エラー

yarn start でSSRを実行しようとしたらエラーが発生して原因解決に数時間かかったので備忘録を残しておきます。

エラー

error: Uncaught TypeError: false.accept is not a function at entry-{数字}.mjs:1

原因

結論ですが、.envNODE_ENV = 'development'を記載しているのがだめだったようです。

こちらを削除したら正常に実行できるようになりました。

これはNODE_ENV = 'staging'などのようにdevelopment以外でもだめなようです。

とにかく.envNODE_ENVを記載すると死ぬ。

確認

nuxt devではNODE_ENV指定なくてもdevelopment

node .output/server/index.mjsビルドが必要なものはビルド時のNODE_ENVの値が使用される。

ただしyarn previewだけはビルド時のNODE_ENVの値ではなく常にproductionで機能します。

なので環境毎にNODE_ENVの値を変えたい場合はcross-envを使用して下記のようにしたらよさそうです。(これはnuxt2のときも同様に設定することができる)

ビルドコマンド NODE_ENVに設定される値
nuxt build development
cross-env NODE_ENV=\"staging\" nuxt build staging
cross-env NODE_ENV=\"production\" nuxt build production

PM2使用時

pm2で実行管理している場合ecosystem.config.jsで環境設定を設定していると思いますが、ここでNODE_ENVを指定しても意味はないようです

module.exports = {
    apps: [
        {
            script: '.output/server/index.mjs',
            args: 'start',
            env: {
                NODE_ENV: 'development', // 機能せずビルド時に指定された値が使用される
            },
            env_production: {
                NODE_ENV: 'production', // 機能せずビルド時に指定された値が使用される
            },
        },
    ],
};