Cloudflare PagesでDocusaurusのビルドがコケるときの対処法
TL;DR
- Cloudflare Pages上で、Docusaurusで作ったWebサイトをbuildしようとすると、エラーが出て失敗する。
- Cloudflare Pagesのビルドで用いるNode.jsのバージョンが
v12.18.0
と古いことが原因。 - 環境変数
NODE_VERSION
でビルド時のNode.jsのバージョンを指定できる。 - Docusaurusの要求バージョンである
v16.14
以上に設定することでビルドに成功する。
はじめに
このサイトは、Docusaurusで作ったWebサイトを、Cloudflare Pagesでホストして公開しています。しかし、Cloudflare Pagesでビルドしようとすると、構文エラーが発生し失敗します。
現象
Cloudflare Pagesでgitリポジトリを接続し、ビルドの設定後、初回ビルドを実施すると、次のようなエラーログを出して失敗します。
00:45:18.232 > 920-oj-net@0.0.0 build /opt/buildhome/repo
00:45:18.232 > docusaurus build
00:45:18.232
00:45:18.311 (node:1367) ExperimentalWarning: The ESM module loader is experimental.
00:45:18.318 file:///opt/buildhome/repo/node_modules/@docusaurus/core/bin/docusaurus.mjs:27
00:45:18.318 await beforeCli();
00:45:18.319 ^^^^^
00:45:18.319
00:45:18.319 SyntaxError: Unexpected reserved word
00:45:18.319 at Loader.moduleStrategy (internal/modules/esm/translators.js:81:18)
00:45:18.319 at async link (internal/modules/esm/module_job.js:37:21)
00:45:18.323 npm ERR! code ELIFECYCLE
00:45:18.324 npm ERR! errno 1
00:45:18.324 npm ERR! 920-oj-net@0.0.0 build: `docusaurus build`
00:45:18.325 npm ERR! Exit status 1
00:45:18.325 npm ERR!
00:45:18.325 npm ERR! Failed at the 920-oj-net@0.0.0 build script.
00:45:18.325 npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
00:45:18.333
00:45:18.333 npm ERR! A complete log of this run can be found in:
00:45:18.333 npm ERR! /opt/buildhome/.npm/_logs/2023-03-18T15_45_18_325Z-debug.log
00:45:18.341 Failed: build command exited with code: 1
00:45:19.199 Failed: an internal error occurred
さらにログを遡ると、ビルド環境の初期化時に各ツールのバージョン情報が表示されます。その中でNode.jsは v12.18.0
がインストールされたことがわかります。
00:44:40.871 v12.18.0 is already installed.
00:44:42.122 Now using node v12.18.0 (npm v6.14.4)
原因
Cloudflare Pagesで使用されるNode.jsのバージョンが古いことが原因です。
Docusaurusの公式ドキュメントに、必須Node.jsバージョンは v16.14
以上であると記載されています。
Requirements
Node.js version 16.14 or above (which can be checked by running node -v). You can use nvm for managing multiple Node versions on a single machine installed.
https://docusaurus.io/docs/installation#requirements
一方、Cloudflare Pagesで使用されるビルドツールのバージョンは以下のページに記載されており、Node.jsは v12.18.0
であるようです。
Language support and tools
Language: Node.js
Default version: 12.18.0
supported versions: Any version up to 17.x
Environment variableNODE_VERSION
File:.nvmrc
..node-version
https://developers.cloudflare.com/pages/platform/build-configuration/#language-support-and-tools
また、Cloudflare Pagesで利用できるNode.jsのバージョンは、17.xまでの全バージョンとのことです。2023年3月現在でLTSが18.15.0、最新版が19.8.1なので、最新のものには対応しきれていないようです。
解決策
Cloudflare Pagesで利用するNode.jsのバージョンを、LTSである16系の最新版である 16.19.1
に固定します。(ここでは2023年3月現在の16系の最新版にしましたが、適宜最新版のバージョンを確認し設定してください。Node.jsの最新バージョンはリリースページで確認できます。)
方法はいくつかありますが、ここでは環境変数でバージョンを指定する方法で設定します。
Cloudflare PagesのProjectの Settings
から、 Environment variables
に進みます。Production(本番環境)とPreview(プレビュー環境)の2環境において環境変数を設定するボタンがあるので、両方ともに以下のように設定します。
- Variable name:
NODE_VERSION
- Value:
16.19.1
設定したら、Save
で保存し、 All deployments
→ 失敗したビルドの Retry deproyment
をクリックすることで再度ビルドされます。
ログを確認すると、Now using node v16.19.1 (npm v8.19.3)
と表示されており、正常にビルドが完了しました。
02:43:14.690 Now using node v16.19.1 (npm v8.19.3)
(中略)
02:43:43.800 > 920-oj-net@0.0.0 build
02:43:43.801 > docusaurus build
02:43:43.801
02:43:46.542 [INFO] [ja] Creating an optimized production build...
02:43:47.971 ℹ Compiling Client
02:43:48.001 ℹ Compiling Server
02:44:05.755 ✔ Client: Compiled successfully in 17.79s
02:44:07.752 ✔ Server: Compiled successfully in 19.75s
02:44:18.689 [SUCCESS] Generated static files in "build".
(中略)
02:44:22.515 ✨ Success! Uploaded 51 files (1.66 sec)
02:44:22.515
02:44:23.080 ✨ Upload complete!
02:44:24.986 Success: Assets published!
02:44:25.800 Success: Your site was deployed!
まとめ
Cloudflare Pagesのビルド設定中、使用するフレームワークとしてDocusaurusを選択した場合、ビルド先のディレクトリなどの設定は自動で入力されますが、Node.jsのバージョンは自動で設定されないようです。今では v12
系をサポートしないフレームワークも増えているので、Docusaurusに限らずビルドに失敗する場合は、ツールのバージョンを疑ってみるのも良さそうです。