CloudflareデプロイがWindowsだけ失敗して本番が白画面になる原因とWSLで解決した手順
結論|WindowsでCloudflareデプロイが失敗する正体
Windowsで npm run deploy を実行したとき、Cloudflareへのデプロイが失敗することがありますよね。再ビルドしても再デプロイしても直らない。その原因は、OpenNextjs(Next.jsをCloudflare Workersで動かすツール)がWindowsと完全に非互換であることです。
この記事は以下に当てはまる方向けです。
- Windows環境でNext.js + Cloudflare Workersを運用している
npm run deployでデプロイしたが本番サイトが壊れる・白画面になる- Cloudflareデプロイ後に突然白画面になった
- ローカル(
npm run dev)では正常に動作している - 再ビルドや再デプロイを繰り返しても状況が変わらない
問題の根本は「ビルドツールのOS依存性」です。OpenNextjsはLinux環境を前提に設計されており、Windowsでビルドするとファイルのコピー処理が正常に完了しません。キャッシュやデプロイの手順ではなく、ビルド環境そのものを変えることが唯一の解決策です。
なお、この問題はChunkLoadErrorが本番だけ発生するケースと密接に関係しています。白画面と同時にChunkLoadErrorが出ている場合は、同じ根本原因である可能性が高いです。
WindowsとLinuxでバイナリが違う
Next.jsがビルドで使う lightningcss や sharp などのライブラリは、OSごとに異なるネイティブバイナリを使います。Windows用にインストールされた node_modules をそのままWSL(Linux)で動かそうとすると、バイナリが合わずにビルドが失敗します。逆にWSL上でインストールした node_modules をWindowsで動かしても同様です。
OpenNextjsが出す警告の意味
デプロイのたびに以下の警告が出ていませんでしたか?
WARN OpenNext is not fully compatible with Windows.
WARN For optimal performance, it is recommended to use Windows Subsystem for Linux (WSL).
WARN While OpenNext may function on Windows, it could encounter unpredictable failures during runtime.「動くかもしれないが予測不能な障害が起きる可能性がある」という内容です。私はこの警告を長らく無視していましたが、実際に本番で壊れてから意味を理解しました。
最初に試したが効果がなかった対処
詰まっているときは思いつく対処を片っ端から試してしまいますよね。私もそうでした。試したがまったく効かなかった対処を正直に書きます。同じことを繰り返して時間を無駄にしないためにも、最初に把握しておくことをおすすめします。
ブラウザキャッシュの削除・ハードリロード
Ctrl+Shift+R でのハードリロードと、Chromeの設定から「閲覧履歴データの削除」を実施しました。白画面は変わらず。原因がブラウザ側にないので当然の結果でした。
Cloudflareキャッシュのパージ
Cloudflareのダッシュボードから「すべてをパージ」を実行しました。こちらも改善なし。CDN側のキャッシュが原因ではなく、アップロードされたファイルセット自体に問題があるためです。
.nextフォルダ削除と再ビルド
Remove-Item -Recurse -Force .next
npm run buildビルド自体は正常に完了します。しかし再デプロイ後も本番サイトは白画面のままでした。
.open-nextフォルダ削除と再デプロイ
Remove-Item -Recurse -Force .open-next .next
npm run deploy同様に完了はしますが、本番では改善されませんでした。
wranglerを直接実行
wrangler deployこれは別の意味で失敗しました。以下のエラーが出ます。
'wrangler' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。wranglerはグローバルインストールされていないため、PowerShellから直接呼べません。npx wrangler deploy とすれば実行できますが、根本の問題(Windowsビルド)は変わりません。
依存関係の競合を解消
npm install 時に以下のようなエラーが出ることがあります。
npm error Could not resolve dependency:
npm error peer next@">=15.5.15 <16 || >=16.2.3" from @opennextjs/cloudflare@1.19.2next を 16.1.6 から 16.2.4 に上げることで解消できます。ただしこれはインストールエラーの解消であり、ビルドのWindows問題とは別です。解消しても本番サイトが壊れる問題は続きます。
発生した環境とエラーの詳細
私が実際にどのような状況で詰まったでしょうか。再現性のために環境と症状を正確に書きます。
構成
- Next.js 16.2.4(Turbopack)
- @opennextjs/cloudflare 1.19.2
- wrangler 4.84.0
- ホスティング:Cloudflare Workers
- ビルド・デプロイ環境:Windows 11 PowerShell
実際のエラーログ
CloudflareのWorkerログに以下が流れてきました。
{
"level": "error",
"message": "⨯ ChunkLoadError: Failed to load chunk server/chunks/ssr/[root-of-the-server]__13i22a4._.js from runtime for chunk server/app/page.js"
}トップページ(/)だけが白画面になり、記事ページ(/[slug])は正常に表示されていました。SSRチャンクが特定のページだけ読み込めない状態でした。
ローカルは正常・本番のみ壊れる
npm run dev でのローカル確認は完全に正常でした。npm run deploy でデプロイした直後から本番が壊れるというパターンです。デプロイ自体は成功しているように見える(エラーなく完了する)ため、原因の特定に時間がかかりました。
原因を特定するためにやった切り分け
デプロイコマンドは成功しているのに本番が壊れる。この状況に正直お手上げ感がありました。改めてエラーログを分析して、原因を一つずつ絞り込んでいきました。
SSRチャンクの生成状況を確認する
Cloudflare Workersでのデプロイには、.open-next というフォルダにビルド結果が格納されます。その中のSSR用チャンクを確認してみました。
# .open-next側(Cloudflareにアップロードされるもの)
Get-ChildItem .open-next\assets\_next\static\chunks\ssr -Recurse | Measure-Object結果:Count: 0
# .next側(Next.jsのビルド成果物)
Get-ChildItem .next\server\chunks\ssr -Recurse | Measure-Object結果:Count: 90
ここで問題が確定しました。Next.jsのビルドは正常に完了しているのに、OpenNextjsがSSRチャンクを `.open-next/assets` にコピーしていないのです。Cloudflareにアップロードされるファイルセットに、SSRチャンクが含まれていませんでした。
WindowsとLinuxのファイル処理の違い
OpenNextjsはビルド時にファイルのコピー・パス解決などの処理をLinuxのファイルシステムを前提に行っています。Windowsではパス区切り文字(\ vs /)の扱いや、シンボリックリンクの動作が異なります。この違いにより、SSRチャンクのコピー処理がサイレントに失敗します。エラーは出ませんが、ファイルが存在しない状態でデプロイが完了します。
判断基準として使えるのは以下です。
.open-next/assets/_next/static/chunks/ssrのファイル数が0 → WindowsビルドのOpenNextjs非互換問題.next/server/chunks/ssrのファイル数が0 → Next.jsのビルド自体が失敗(別の問題)- 両方に90件前後ある → ビルドは正常・別の原因を疑う
なぜWSLが必要なのか(構造的な理由)
「WSLで試してみる」という解決策は多くの記事に書かれています。でも「なぜWSLで直るのか」の説明が少ないと思います。
理由はシンプルです。WSL(Windows Subsystem for Linux)はWindows上で動くLinux環境です。 その中で npm install すれば Linux用のネイティブバイナリが入り、OpenNextjsも Linux のファイルシステムルールでビルドを実行できます。結果として、SSRチャンクが正しく .open-next/assets にコピーされます。
WSLは「とりあえず試してみる方法」ではなく、「Linuxのビルド環境を再現する唯一の方法」です。
WSLで解決した手順
手順は5ステップです。順番通りに実行することが重要で、特に node_modules の削除と再インストールを省略すると別のエラーが出ます。
STEP 1:WSLを起動する
# PowerShellで実行
wslWSL2が入っていれば、プロンプトが uracc@DESKTOP: のようなLinux形式に変わります。
STEP 2:プロジェクトフォルダに移動する
cd /mnt/c/Users/[ユーザー名]/[プロジェクトフォルダ]Windowsの C:\Users\... は、WSLからは /mnt/c/Users/... として見えます。
STEP 3:ビルドキャッシュを削除する
rm -rf .open-next .nextWindowsビルドで生成された古いキャッシュをすべて削除します。
STEP 4:node_modulesをLinux用に入れ直す
rm -rf node_modules
npm installここが最重要です。Windows用にインストールされた node_modules にはWindowsネイティブのバイナリが含まれています。WSLのLinux環境で使うには、Linux用のバイナリに入れ替える必要があります。
STEP 5:デプロイ実行
npm run deploy完了後、以下で確認できます。
ls .open-next/assets/_next/static/chunks/ssr | wc -l90前後の数字が返ってくれば成功です。0であれば STEP 3 からやり直してください。
再発防止と運用ルール
解決後は、同じ問題が起きないように作業環境を整理しました。
dev・build・deployの作業環境を分ける
| 作業 | 環境 | コマンド |
|---|---|---|
| ローカル確認 | PowerShell | npm run dev |
| ビルド確認 | WSL | npm run build |
| デプロイ | WSL | npm run deploy |
npm run dev(ローカル開発サーバー)はWindowsのPowerShellで動かしても問題ありません。ファイルウォッチやホットリロードはOS依存の問題が出にくいためです。一方、ビルドとデプロイは必ずWSLで行います。
wranglerはnpx経由で実行する
wranglerをグローバルインストールしていない場合、PowerShellから直接 wrangler deploy は実行できません。npx wrangler deploy か npm run deploy(package.jsonにスクリプト定義済み)を使います。WSLでも同じです。
WSLが入っていない場合
wsl --versionWSL2が入っていれば応答があります。入っていない場合はMicrosoft Storeから「Ubuntu」をインストールするか、以下を実行します。
wsl --installWindows 10以降であれば追加費用なしで使えます。
まとめ
WindowsでCloudflareデプロイが失敗・白画面になる原因と解決手順をまとめます。
原因: OpenNextjsはLinux前提で設計されており、WindowsでビルドするとSSRチャンクが .open-next/assets に正しくコピーされない。
解決: WSLでLinux環境を用意し、node_modules を削除・再インストールしてからデプロイする。
再発防止: ビルドとデプロイはWSLで行う運用ルールを固定する。
このエラーはログを見ても原因が分かりにくく、正直かなり時間を取られました。同じ状況で詰まっている方の参考になれば幸いです。
なお、この問題はChunkLoadErrorと表裏一体です。白画面の原因がChunkLoadErrorかどうか確認したい方・キャッシュクリアでも直らないと感じている方は、こちらの記事で詳しく解説しています。→ [Next.jsでChunkLoadErrorがキャッシュクリアしても直らない原因【本番だけ壊れた時の対処法】](https://bizinets.life/chunkloaderror-cache-not-fixed)
環境が整ったら、次はGSCのデータをAPIで自動取得してSEO改善のサイクルを回す段階です。[Search Console APIでCSV出力する方法【初心者でもコピペで動いた最小コード】](https://bizinets.life/search-console-api-csv-export)では、コマンド1つで検索データを取得できる仕組みを解説しています。
こうした「ツールの使い方ではなく、どの環境で何を実行するかという設計の問題」は、表面のコマンドを覚えるだけでは再発します。bizinets.bizでは、こうした判断の軸を体系化して公開しています。[判断軸について読む](https://bizinets.biz/judgment-axis/)
bizinets.biz
記事を読んで「もっと知りたい」と思ったあなたへ
bizinets.biz では、ビジネスの仕組みづくりを体系的に学べるコンテンツを用意しています。まずは一度、覗いてみてください。
bizinets.biz へ行く →