ビルドがクラッシュする理由npm run buildを実行すると、MacBookのファンが高速で回り始め、すべてがフリーズしてしまうことがあります。ビルドが正常に完了する代わりに、ターミナルにはメモリ割り当てエラーで終わる膨大なクラッシュログが表示されます。これはコードのバグではなく、リソース制限の問題です。
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
Next.jsのようなモダンなフロントエンドフレームワークや、大規模なAngularアプリはリソースを大量に消費します。デフォルトでは、Node.js(v12以降)は64ビットシステム上で通常約2GBのメモリに制限されています。WebpackやViteが1万ファイルを超える依存関係ツリーを解析しようとすると、この2GBの天井に達してクラッシュします。
クイック修正:現在の手順(一時的)すぐにホットフィックスをデプロイする必要がある場合は、設定ファイルをいじる必要はありません。現在のターミナルタブに対してのみ制限を上書きできます。このコマンドは制限を4GBに引き上げます。これはエンタープライズ規模のビルドの95%にとって十分な容量です。
export NODE_OPTIONS="--max-old-space-size=4096"npm run build
数百ページに及ぶ大規模なプロジェクトや、重いソースマップを使用している場合は、この数値を8192に上げてください。ただし、実行前にMacに少なくとも16GBの物理メモリが搭載されていることを確認してください。
システム全体の設定(zsh)ほとんどのmacOSユーザーはzshを使用しています。このメモリ増強を永続的に設定することで、ローカル開発中にこのエラーが二度と発生しないようにできます。複数の大規模なリポジトリで作業する場合に最適な方法です。
- エディタでzshの設定ファイルを開きます:
nano ~/.zshrc- 文末に以下の行を貼り付けます:export NODE_OPTIONS="--max-old-space-size=4096"- 保存して終了します(Ctrl+O、Enter、次にCtrl+Xを押します)。- 変更を即座に反映させます:source ~/.zshrc## チーム共有の設定:package.jsonシステム全体に変数を設定するのは便利ですが、チームメイトの助けにはなりません。一人がメモリ制限に達した場合、他の全員も同じ問題に直面する可能性があります。ベストプラクティスは、プロジェクトのpackage.json内で直接制限を定義することです。これにより、CI/CDパイプラインや他の開発者のマシンでも確実にビルドが動作するようになります。 以下のようにスクリプトを更新してください:
{
"scripts": {
"build": "NODE_OPTIONS=--max-old-space-size=4096 next build",
"dev": "NODE_OPTIONS=--max-old-space-size=4096 next dev"
}
}
Windowsも併用していますか?その場合は、cross-envパッケージをインストールしてください。その後、スクリプトをcross-env NODE_OPTIONS=--max-old-space-size=4096 next buildに変更することで、プラットフォームに依存しない設定が可能です。
変更の確認Node.jsが実際に新しい設定を反映したかどうかは簡単に確認できます。以下のワンライナーコマンドを実行して、制限をギガバイト単位で表示できます。
node -e 'console.log((require("v8").getHeapStatistics().heap_size_limit / 1024 / 1024 / 1024).toFixed(2) + " GB")'
出力が4.00 GBと表示されれば準備完了です。これでビルドが安定するはずです。
Apple Silicon(M1/M2/M3)ユーザーへの注意Node.jsのアーキテクチャを確認してください。Intel Macから環境を移行した場合、Rosetta 2経由でx64バージョンのNodeを実行している可能性があります。これはパフォーマンスを著しく低下させます。M2チップなどでx64のNodeを実行すると、メモリ消費量が大幅に増加し、速度も20〜30%ほど低下します。
以下のコマンドを実行してください:
node -p "process.arch"
もしx64と返ってきた場合は、Node.jsを再インストールすべきです。nvmやfnmなどのマネージャーを使用して、arm64バージョンをインストールしてください。ネイティブバイナリはメモリをより効率的に処理するため、ヒープサイズを増やさなくても「out of memory」エラーが解決することがよくあります。

