React 19.3 の位置づけ

2026年9月9日、React チームが React 19.3 を npm に正式リリースしました。昨年 experimental として公開されていた View TransitionsFragment Refs が stable に昇格したのが今回の目玉です。

本記事では、実務で影響が出る変更点を中心に整理します。アニメーションや DOM 制御が必要だったプロジェクトにとっては、かなり嬉しいアップデートです。

根拠資料: React 19.3 公式リリースノート

今回のリリース要点

  • View Transitions stable 化: ブラウザの View Transition API を React コンポーネント経由で利用可能
  • Fragment Refs stable 化: wrapper div なしで複数 DOM ノードをグループ制御
  • browser() API 新規追加: SSR 環境でブラウザ専用コンポーネントを安全に opt-out
  • Trusted Types 対応: CSP require-trusted-types-for 'script' 環境での XSS 防御
  • Server Components から Context を直接レンダリング 可能に

Developer reviewing React 19.3 release notes with View Transition API code on laptop screen Dev Environment Setup

主要機能 1: View Transitions の実践的な使い方

<ViewTransition> コンポーネントで UI の一部をラップすると、その領域が enter / exit / update / share の状態に応じて自動的にアニメーションします。

import { ViewTransition, useState, startTransition } from 'react';
import { Video } from './Video';
import videos from './data';

export default function Component() {
  const [showItem, setShowItem] = useState(false);

  return (
    <>
      <button
        onClick={() => {
          // Transition としてマークしないとアニメーションは発火しません
          startTransition(() => {
            setShowItem((prev) => !prev);
          });
        }}
      >
        {showItem ? '➖' : '➕'}
      </button>
      {showItem && (
        <ViewTransition>
          <Video video={videos[0]} />
        </ViewTransition>
      )}
    </>
  );
}

注意点: Transition でラップしないとアニメーションしない

startTransitionuseDeferredValue 経由の更新のみ View Transition がトリガーされます。通常の setState は urgent 更新として扱われ、アニメーションは発生しません。ここを誤解すると「なぜアニメーションしないのか」で時間を溶かします。

同じ state 更新でもアニメーションを分けたい場合

addTransitionType を使用します。例えばカルーセルで「次へ」と「前へ」でアニメーション方向を変えたいケースに有効です。

function nextSlide() {
  startTransition(() => {
    addTransitionType('next');
    setCurrentSlide(c => c + 1);
  });
}

function previousSlide() {
  startTransition(() => {
    addTransitionType('previous');
    setCurrentSlide(c => c - 1);
  });
}

CSS 側では :active-view-transition-type(next) のようなセレクタでスコープを絞れます。

Suspense と組み合わせる際の原則

View Transition と Suspense を併用する際によくある失敗は、キャッシュ済みの UI にまで毎回アニメーションがかかり、逆に遅く感じるケースです。

React チームが提示する原則は以下の3点です。

  1. Fallback はアニメーションなしで即座に表示
  2. Fallback → 最終コンテンツへの遷移はアニメーションあり
  3. suspend しない子要素はアニメーションなしで即座に表示

この原則を守るには、<ViewTransition>enter/exit を無効化し、update のみ有効にするのが有効です。

<ViewTransition update="auto" enter="none" exit="none">
  <Suspense fallback={<VideoPlaceholder />}>
    <LazyVideo />
  </Suspense>
</ViewTransition>

主要機能 2: Fragment Refs

wrapper div なしで複数の兄弟 DOM ノードをグループとして扱いたいケースがあります。特に 外部ライブラリのコンポーネントが ref を転送してくれない 場合、従来は手が出せませんでした。Fragment Refs はこの問題を解決します。

import { useRef, useEffect } from 'react';

function Component({ posts }) {
  const fragmentRef = useRef(null);

  useEffect(() => {
    const fragmentInstance = fragmentRef.current;
    // Fragment の第一階層の子要素に対してフォーカスを移動
    fragmentInstance.focus();
  }, []);

  return (
    <Fragment ref={fragmentRef}>
      {posts.map(post => (
        <article key={post.id}>{post.title}</article>
      ))}
    </Fragment>
  );
}

FragmentInstance が提供するメソッドは以下の通りです。

  • addEventListener / removeEventListener / dispatchEvent: 第一階層の子要素のイベント管理
  • focus / focusLast / blur: depth-first で走査しながらフォーカス移動
  • observeUsing / unobserveUsing: IntersectionObserverResizeObserver の接続
  • getClientRects / getRootNode / compareDocumentPosition / scrollIntoView: 計測およびスクロール

主要機能 3: browser() API による SSR opt-out

サーバー側で意味のある UI を生成できないコンポーネント(例: localStorage やローカルタイムゾーン依存)を、安全に SSR から除外できます。

従来のパターンは以下の通りでした。

// 従来: mounted state による回避
function Component() {
  const [mounted, setMounted] = useState(false);
  useEffect(() => setMounted(true), []);
  // ...
}

React 19.3 ではこう書けます。

import { use } from 'react';
import { browser } from 'react-dom';

function TimeZone() {
  use(browser()); // サーバーでは Suspense をトリガー、クライアントでは通過
  const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;
  return <span>{timeZone}</span>;
}

条件文の中でも呼び出せるため、initialData の有無に応じて SSR を選択的に opt-out するパターンも簡潔に書けます。

function useBrowserQuery(query, options) {
  if (options.initialData === undefined) {
    use(browser()); // 初期データがなければブラウザでのみ実行
  }
  return useQuery(query, options);
}

その他の注目変更点

  • Trusted Types 対応: CSP で require-trusted-types-for 'script' を強制する環境において、React が値を強制的に文字列変換しなくなり、ポリシーが正常動作
  • Server Components から Context を直接レンダリング: 別途 Provider wrapper コンポーネントなしに 'use client' モジュールの Context を直接 import してレンダリング可能
  • Render Transitions の独立処理: 遅い Transition が他の Transition をブロックしないよう改善
  • onFullscreenChange / onFullscreenError イベント対応
  • fetchPriority のモジュールリソース対応
  • form state → action state への用語整理(useActionState エラーメッセージ)

React component tree diagram showing ViewTransition wrapper animating enter exit share states Development Concept Image

バージョン別主要機能比較

機能従来バージョンReact 19.3実務への影響
View Transitionsexperimentalstableプロダクション導入可能、Suspense 連携
Fragment Refsなしstablewrapper div なしで DOM グループ制御
browser() APIなし(手動回避)新規SSR opt-out コードが大幅に簡素化
Trusted Types文字列へ強制変換通過CSP strict 環境での XSS 防御が正常化
Server Component ContextProvider wrapper 必須直接レンダリングボイラープレート削減
Render Transitions単一レンダリングで絡む独立処理遅い Transition が他を妨げない

この技術の限界と注意点

万能ではありません。以下の制約を理解した上で導入を検討してください。

1. View Transitions は現状 DOM 専用

公式ドキュメントにも明記されていますが、React Native および他プラットフォーム対応は進行中 です。RN プロジェクトでは今回のアニメーション改善の恩恵は受けられません。

2. ブラウザの View Transition API 依存

基盤はブラウザの View Transition API です。非対応ブラウザではアニメーションは発生しません(フォールバックは存在します)。

3. Suspense + アニメーションは乱用厳禁

React チームも「sparingly(控えめに)」使うよう明示的に推奨しています。キャッシュ済み UI にまでアニメーションをかけると、かえってアプリが遅く感じられます。

4. Fragment Refs は限定的な API

全ての DOM API を公開するわけではなく、"commonly used DOM methods" のみを提供します。querySelector などは含まれないため、必要に応じて従来の ref と併用してください。

次のステップ学習の方向性

  1. 公式ドキュメントの精読: ViewTransitionaddTransitionTypeFragmentInstancebrowser() の各 API ドキュメントをまず確認
  2. 実践プロジェクト: 小さなトイプロジェクトに View Transitions を導入し、enter/exit/share の挙動を実際に確認するのが最短
  3. Suspense 連携パターンの習得: update のみ有効化するパターン、fallback 即時表示の原則をコードで体得
  4. マイグレーション計画: 既存の mounted state 回避コードを browser() にリファクタリング可能か点検

Frontend engineer testing Fragment Refs focus management in React 19.3 on desktop setup Developer Related Image

まとめ

React 19.3 は派手な新機能というよりも、「実験段階だった機能を実務で使えるレベルに整えたリリース」 と位置づけられます。View Transitions と Fragment Refs の stable 化は朗報であり、browser() API と Trusted Types 対応は SSR 環境やセキュリティ要件が厳しいプロジェクトで効果を発揮します。

ただし View Transitions には RN 未対応、ブラウザ API 依存、Suspense 連携時の乱用禁止という制約があります。「アニメーションを全部入れれば良い」というアプローチは UX を損なうため注意が必要です。

あわせて読みたい記事

アップグレードは常に小規模プロジェクトで先行検証し、プロダクション適用はブラウザマトリクスと QA シナリオを整備した上で進めることをお勧めします。

本コンテンツは、信頼性の高い情報源をもとにAIツールを活用して作成され、編集者によるレビューを経て公開されています。専門家によるアドバイスの代替となるものではありません。