1年ほど前から Next.js v13 と Azure Static Web Apps を使って Hybrid rendering を行う Next.js アプリケーションをデプロイしていました。
v14 にアップデートしたタイミングでビルドに失敗するようになってしまいました。 直し方が Microsoft Learn にあったのでメモがてら載せておきます。
ビルドに使用する Node.js のバージョンの指定
私はデプロイに GitHub Actions の Azure/static-web-apps-deploy@v1 を使用しています。 デプロイの他にもビルドも行ってくれる Actions で、内部的にはビルドに Oryx が利用されているようです。
どうもこの Orxy、Node.js アプリケーションを渡すと、特に指定がないと Node.js v16 を使用してビルドを行うようで、この挙動が問題でした。
そのことが分かる GitHub Actions のログを以下に載せておきます。 v16 が使われていることがわかります。
Using Node version:
v16.20.2
Using Npm version:
8.19.4
Running 'npm install'...
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: 'next@14.1.4',
npm WARN EBADENGINE required: { node: '>=18.17.0' },
npm WARN EBADENGINE current: { node: 'v16.20.2', npm: '8.19.4' }
npm WARN EBADENGINE }
added 325 packages, and audited 326 packages in 11s
129 packages are looking for funding
run `npm fund` for details
1 moderate severity vulnerability
To address all issues, run:
npm audit fix
Run `npm audit` for details.
Running 'npm run build'...
> ******@0.1.0 build
> next build
You are using Node.js 16.20.2. For Next.js, Node.js version >= v18.17.0 is required.
であれば、Node.js のバージョンを上げることで対処できそうなことがわかります。 それではどの様に Node.js のバージョンを上げる、もしくは指定するのでしょうか?
それが前述した Learn に記載されていました。
Tutorial: Deploy hybrid Next.js websites on Azure Static Web Apps | Microsoft Learn
上記のドキュメント記載のように、package.json の engines フィールドに指定します。 これは、当該 package の動作するバージョンを明確にするために使用されるものですが、Oryx はこちらのフィールドを参照しているようです。
指定してみると、以下のようなログに変わりました。
Using Node version: v18.17.1 Using Npm version: 9.6.7 Running 'npm install'...
これでビルド問題は解決しました。
終わりに
最新のドキュメントを読めば解決するという簡単な問題でした。 Microsoft のサービスを使う場合はだいたいのケースが Learn で解決するので、とりあえずハマったら見るようにしましょう…
また Azure Static Web Apps へのデプロイじゃなくて、Next.js 文脈でハマった箇所があったので、備忘録として以下にリンクを載せておきます。