SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

フロントエンド開発における定番ライブラリ「React」の最新バージョン解説

React 19.2新機能ガイド──cacheSignalの導入とuseIdの改善点解説

フロントエンド開発における定番ライブラリ「React」の最新バージョン解説 第7回

cacheSignal:React Server Componentsにおける非同期処理のキャンセル制御

 cacheSignalは、React Server Components(RSC)でcacheと組み合わせて使うことで不要な非同期処理やリソース消費を抑制する機能です。なぜこういった仕組みが必要になったのでしょうか。

 まず、RSCでは、サーバー側で非同期処理(例:DBクエリ、API実行など)を行いながらレスポンスを構築します。このとき、cacheを使うことで同じ引数の関数呼び出し(例えば同じURLなど)をキャッシュして、処理が重複して走らないように制御できます(De-duplication)。

 ただし、そのキャッシュの寿命を知る手段がないと、ある非同期処理が途中で不要になった場合(レンダリング中止やユーザー離脱など)でも、無駄にその処理が走り続けてしまう可能性があります。

 このためのキャンセル制御を提供するのがcacheSignalで、「もう結果を使わなくなった(描画が完了した/中止された/失敗した)ため途中処理を中断可能である」ことを検知できるようになります。

cacheSignalの仕様

 cacheSignalはレンダリング時に呼ばれるとAbortSignal(キャンセル可能なシグナル)を返します。このシグナルは以下のタイミングでabort(キャンセル済み状態)になります。

  • Reactがそのキャッシュ対象の描画を正常に完了したとき
  • レンダリングが中止されたとき
  • レンダリングが失敗したとき

 よって、このシグナルをcacheの対象関数(fetchなど)に渡すことで「もうこの結果を使わなくなる」というタイミングで処理を中断できるようになります。

cacheSignalの具体例

 以下はcacheSignalの使用例です。

[リスト1]cacheSignalの使用例 ※ファイル名:samples/01/components/CachedComponent.tsx
import { cache, cacheSignal } from "react";

const cachedFetch = cache(async (url: string) => {
  const response = await fetch(url, { signal: cacheSignal() });
  return await response.json();
});

export async function CachedComponent({ page }: { page: string }) {
  // page は動作確認用の識別子
  let data = null;
  try {
    data = await cachedFetch("http://localhost:3000/api/heavy");
  } catch (err: any) {
    if (err.name === "AbortError") {
      console.log("Fetch aborted: ", page);
      // キャンセルされて発生した例外は無視する
      return null;
    }
    // 本来のエラーなら再throwやロギングなど
    console.error("Fetch error: ", page);
    throw err;
  }
  return <div>{data?.message}</div>;
}

 この例では、複数の場所からcachedFetchに同じurlのデータを要求してもcacheの仕組みによって同じ結果を共有できます。かつ、もしReact側でそのレンダリングが中止されたり、描画が完了した場合は、cacheSignal()の返すAbortSignalがabortされ、fetchがキャンセルされます(fetchは仕様上AbortSignalに対応しているため、signalオプションとして指定することでキャンセルが可能です)。

 また、ここではcatchによるエラーハンドリングで「キャンセルによるエラー」を無視/分離するように書いています。AbortSignalによるキャンセルはエラーとして扱いたくない場合が多いと思うので、こういった実装が基本となるでしょう。

 実際にサンプルプログラムを実行し、Next.jsの実行ログを眺めてみましょう。まず、page.tsxにはCachedComponentが2つ配置されていますが、両方とも同じAPIエンドポイントを呼び出しているため、fetchは1回だけ実行されています。cacheの効果で、同じURLに対して不要なfetchが走らないことが確認できます(図1-①)。

図1:cacheSignal の動作例
図1:cacheSignalの動作例

 次に、page1ロード中に[Go to page2]リンクをクリックすると、page2のサーバー側でpage2のAPI実行が開始されますが、フロントエンド側はpage1のロードが完了するまで待機します(図1-②、③)。

 page1のAPI実行が終わりレンダリングが完了すると、実行ログにFetch aborted: page2のログが出力され、page2側のfetchがキャンセルされていることが確認できます(図1-④)。

cacheSignalのユースケースと注意点

 例えば、大きなファイルをダウンロードするAPIや重い計算処理、サブスクライブ系の非同期処理などがある場合、cacheSignalcacheと組み合わせて使うことで、結果が不要になった時点でキャンセルさせ、リソースの節約につなげられます。

 ただし、cacheSignalはレンダー関数内で呼ぶ場合に限り有効です。それ以外ではnullを返す(つまりキャンセルできない)よう設計されています。また、現時点ではRSC専用として実装されているため、クライアントコンポーネントでは常にnullを返します(将来、クライアントキャッシュ更新の際に使われる可能性もあるようです)。

次のページ
useIdの接頭辞変更:アクセシビリティ向上のためのID生成フック

この記事は参考になりましたか?

フロントエンド開発における定番ライブラリ「React」の最新バージョン解説連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山田 研二(ヤマダ ケンジ)

株式会社MSEN CTO。高校卒業後、大阪大学の研究所で働きながらプログラミングやWebデザインをはじめ、以後20年以上、Webサイト制作や業務システムの構築を手がけています。フリーソフトもいくつか公開しています。好きな言語はC#とTypeScript、趣味は旅行です。 GitHub アカウントWINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。個人紹介主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著者記事多数。 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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/22848 2025/12/29 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング