App Hosting のほとんどの Next.js アプリは、通常の Next.js のデフォルトを維持できます。ただし、インスタンスで Memory limit exceeded エラーが発生した場合は、experimental.isrFlushToDisk: false を設定してキャッシュをメモリに保持し、インスタンスが再起動しないようにする必要があります。
デフォルトでは、Next.js は、Incremental Static Regeneration(ISR)で生成されたページ、ルートハンドラのレスポンス、フェッチ結果など、実行時にレンダリングするページとデータをキャッシュに保存します。メモリに保持されるだけでなく、アプリの .next ディレクトリ内のファイルにも書き込まれます。Next.js はこれらのファイルを削除しません。
App Hosting では、アプリは Cloud Run で実行され、ファイル システムはメモリ内にあります。書き込まれたファイルは、インスタンスがシャットダウンするまで、各サービス インスタンス(memoryMiB)に割り当てられたメモリにカウントされます。アプリが実行時に多数の異なるページをレンダリングする場合(ビルド時に生成されないパラメータを持つ動的ルートなど)、インスタンスがメモリ上限を超えて再起動することがあります。Cloud Run は、Memory limit of 512 MiB exceeded with 515 MiB used のようなエラーをログに記録します。詳細については、ファイル システム アクセスに関する Cloud Run のドキュメントをご覧ください。
キャッシュをメモリに保持する
Next.js がキャッシュをファイル システムに書き込まないようにするには、next.config.js ファイルで experimental.isrFlushToDisk を false に設定します。
// @ts-check
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
isrFlushToDisk: false,
},
};
module.exports = nextConfig;
Next.js は、キャッシュに保存されたコンテンツをメモリにのみ保持し(最大 cacheMaxMemorySize、デフォルトは 50 MB)、キャッシュがいっぱいになると、最も長く使用されていないエントリを削除します。各サービング インスタンスには独自のキャッシュがあり、インスタンスが再起動すると失われます。
これらの変更を含む commit を作成し、ライブ ブランチに push します。次に、App Hosting のロールアウトが完了するまで待ちます。