Next.js 15の新機能――Next.jsが次に見据えるキャッシュ制御
Next.jsがApp Routerの"次"に目指すもの 第3回
ダウンロード サンプルファイル (26.5 KB)
Dynamic RenderingとStatic Renderingの使い分けを重視する点は変わらない
App Routerでは、Server Componentsを活用してサーバー側でReactのコンポーネント関数を実行(レンダリング)して、実行結果としてのHTMLやReactツリーだけをブラウザに送信する仕組みがあります。
このレンダリングのタイミングは2種類あり、事前にレンダリングしておくStatic Renderingと、ブラウザからのリクエストに応じてレンダリングするDynamic Renderingを使い分けている、という話を第1回の記事で解説しました(図1)。
この2種類のレンダリングを使い分ける考え方は、新しいキャッシュ戦略においても重要な基礎となります。
Static Renderingで提供するコンテンツは、ブラウザからアクセスされたときに静的なリソースを返すだけなので、CDN等でキャッシュを効かせやすく、安価で高速なコンテンツ提供が可能になります。
そのため、キャッシュ戦略の基本方針は、可能な限りStatic Renderingで提供するコンテンツの割合を増やすことになります。第1回で解説したPartial Prerenderingも、動的なコンテンツを含むページを可能な範囲でStatic Renderingにより提供するための機能であり、この基本方針に則っています。
その一方で、ブラウザからリクエストがあったタイミングでデータベースや外部APIから取得した、最新情報を提供できる特性を持つDynamic Rendering対象のコンテンツにも大きな魅力があり、欠かせませんよね。コンポーネントとしてはDynamic Renderingで動作しつつ、データソースの一部にだけキャッシュを効かせてパフォーマンスを確保する、といった細やかな制御もできると好ましいでしょう。
こういった考え方は、Next.js 15までで提供されているキャッシュ制御の機能でも、unstable_cache()といったAPIを利用すれば実現可能でしたが、やや煩雑になっていました。Next.jsチームもブログ記事の中で「人間工学的でなかった」と反省しています。
やりたいことは変わらないまま、やり方だけを簡単にしようというのが、Next.jsチームが示す新しいキャッシュ制御のパラダイムです。
"use cache" ディレクティブ
では、どのようなAPIが提供されるのかを見ていきましょう。
新しいキャッシュ制御におけるAPIの基本方針は、「(後方互換性は確保しつつ)"use cache"ディレクティブでStatic Renderingやキャッシュの提供範囲を指定しつつ、明示的に動的にしたい部分は<Suspense>でPartial Prerenderingを行う」というものです。Partial Prerenderingについては既に解説したので、ここでは"use cache"ディレクティブについて解説します。
先に、ディレクティブについて振り返っておきましょう。ディレクティブは単独の文字列のみで構成される文で、JavaScriptのファイルや関数の先頭で宣言することで、ランタイムやコンパイラに対して特別な指示を出すことができます。標準化されているディレクティブとしてはES5への移行時に活躍した "use strict"がありますし、React Server Componentsの仕様においてはサーバーとクライアントのどちらで実行されるかを宣言するために "use client"や "use server"が整備されました。
本記事の話題の中心となる"use cache"は、宣言したスコープでキャッシュを有効にするためのディレクティブです。このディレクティブが宣言された関数やファイルは、Next.jsによるコンパイル時にキャッシュ処理が暗黙的に付与されるようになります。
"use cache" を試す環境をセットアップする
まだexperimentalな機能なので、通常の構成のNext.jsでは"use cache"を試すことはできません。次のコマンドを利用して、Next.js 15のcanary版をセットアップします。
npx create-next-app@canary
さらに、next.config.ts(またはnext.config.mjs)に experimental.dynamicIO: trueを設定します(リスト2)。
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
dynamicIO: true, // 追加
},
};
export default nextConfig;
これで、Next.js 15のcanary版で"use cache"を試す準備ができました。
実は"use cache"を試すだけであればexperimental.useCacheをtrueに設定するだけでもOKなのですが、後述するunstable_cacheLife()や unstable_cacheTag()といった他の機能も包括的に利用したいので、dynamicIOとして括られている機能をまとめて有効にしています。
この記事は参考になりましたか?
- Next.jsがApp Routerの"次"に目指すもの連載記事一覧
-
- Next.js 15の新機能――Next.jsが次に見据えるキャッシュ制御
- Next.js 15の新機能――ルーティングとキャッシュの制御の変更を中心に解説
- Next.js 14までの進化を振り返る──App Routerを強化する新機能を解説!
- この記事の著者
-
WINGSプロジェクト 中川 幸哉(ナカガワ ユキヤ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
