タグアーカイブ Next.js

Next.js 2026年5月セキュリティリリースの全容、13件の脆弱性を修正

Next.js 2026年5月セキュリティリリースの全容、13件の脆弱性を修正

Next.jsの開発元であるVercelは2026年5月7日、調整済みセキュリティリリースを公開した。React Server Componentsの上流脆弱性(CVE-2026-23870)への対応を含む、合計13件の脆弱性が修正されている。フレームワークを利用するすべての開発者にとって、即時のアップデートが強く推奨される内容だ。

今回のリリースで対処された問題は、サービス拒否(DoS)攻撃、ミドルウェアやプロキシのバイパス、サーバーサイドリクエストフォージェリ(SSRF)、キャッシュポイズニング、クロスサイトスクリプティング(XSS)と多岐にわたる。ただちにパッチを適用しなければ、本番環境が深刻な攻撃に晒されるリスクがある。

アップデートの概要と影響範囲

アップデートの概要と影響範囲

今回のセキュリティリリースはNext.js本体に加え、その根幹をなすReactの特定パッケージにも修正が及ぶ。Vercelの発表によれば、13件の脆弱性アドバイザリが一挙に解決された形だ。アドバイザリの内訳を見ると、攻撃の種類によって影響を受ける機能や設定が明確に分かれている。自社のプロジェクトがどのカテゴリに該当するかを把握することが、迅速な対応への第一歩となる。

Before(パッチ未適用)
⚠ 複数の脆弱性が存在
ミドルウェア認証のバイパス
React Server Components の DoS
キャッシュポイズニング
SSRF の潜在的リスク
After(パッチ適用後)
✓ 13件の脆弱性を一括修正
認証機能が正常に動作
DoS 攻撃から保護
キャッシュへの不正注入を防止
SSRF の脆弱性を遮断

13件の脆弱性が存在する「Before」の状態と、アップデートによってそれらがすべて解決された「After」の状態を比較したイメージだ。リリースによってセキュリティ上のリスクが一掃されることがわかる。

修正対象となったReactとNext.jsのバージョン

影響を受けるバージョンを把握し、修正済みの安全なバージョンへ移行する必要がある。今回のリリースで修正が提供されたバージョンは以下の通りだ。

まず、React本体については、19.0.6、19.1.7、19.2.6の3つのパッチがリリースされた。これらのバージョンでは、サーバーコンポーネントの通信用パッケージである react-server-dom-parcel、react-server-dom-webpack、react-server-dom-turbopack の各パッケージに修正が含まれている。

Next.jsをフレームワークとして利用している場合、これらのReactパッケージはNext.jsのバージョンにバンドルされている。そのため、開発者はNext.js本体を最新のパッチバージョンに更新することで、React側の修正も同時に適用できる。個別にReactパッケージを管理しているプロジェクトは、それらも忘れずにアップデートする必要がある。

各脆弱性の詳細とリスク評価

各脆弱性の詳細とリスク評価

ここからは、発表されたアドバイザリを深刻度別に整理し、その技術的な背景をひも解いていく。影響を受けるコンポーネントと、攻撃が成立するシナリオを正しく理解することが、開発者としての適切なリスク評価に繋がる。

ミドルウェアとプロキシのバイパス

認証や認可のロジックを middleware.js や proxy.js に依存しているアプリケーションが、致命的な影響を受ける可能性がある。2件の「高」深刻度アドバイザリがこれに該当する。

1件目はApp Routerにおける segment-prefetch のバイパスで、過去の修正が不完全だったための再発フォローアップだ。2件目はPages Routerのi18n機能において、デフォルトロケールのパスがプロキシ認証を迂回してしまう問題である。多言語サイトをPages Routerで運用しており、middlewareでアクセス制御を行っている環境は特に注意が必要だ。

サービス拒否(DoS)攻撃

サーバーのリソースを枯渇させ、正規のユーザーがサイトにアクセスできなくなるDoS攻撃に関する脆弱性が3件報告されている。これらはすべて、Server Functions、Partial Prerendering(PPR)のCache Components、もしくは画像最適化APIの利用が条件となる。

最もクリティカルなものは、React Server Componentsの上流脆弱性(CVE-2026-23870)を突いた攻撃だ。Vercelの発表によると、この脆弱性によりリモートからのDoS攻撃が成立する。また、Cache Componentsを使用するアプリケーションにおける「接続数の枯渇」を引き起こす脆弱性も「高」深刻度と評価されている。画像最適化APIを経由したDoSは「中」深刻度だが、無視できるものではない。

攻撃の流れ(イメージ)
攻撃者 悪意あるリクエスト送信 脆弱なNext.jsサーバー リソース枯渇 正規ユーザーがアクセス不可
攻撃者  攻撃の流れ  影響を受ける主体

この図は、悪意あるリクエストによってサーバーのリソースが消費され、本来のサービス提供が妨害されるDoS攻撃の基本的な流れを示している。Cache Componentsの脆弱性は、この「リソース枯渇」の段階を特に加速させる危険性がある。

サーバーサイドリクエストフォージェリ(SSRF)

SSRFは、攻撃者がサーバーを踏み台にして内部ネットワークへのリクエストを強制させる攻撃手法だ。今回の脆弱性は、WebSocketへのアップグレードリクエストを処理するアプリケーションが影響を受ける。

この種の攻撃が成功すると、攻撃者は本来アクセスできない内部のメタデータサービスやデータベースと通信できるようになる。クラウド環境(AWSやGCPなど)で稼働しているNext.jsアプリケーションは、特に深刻な被害に繋がる可能性があるため、迅速な対応が求められる。

キャッシュポイズニングとクロスサイトスクリプティング(XSS)

React Server Componentのレスポンスの前にキャッシュ層を配置しているアプリケーションは、キャッシュポイズニングのリスクに晒される。これは、攻撃者が悪意あるレスポンスをキャッシュサーバーに記憶させ、他のユーザーにその不正なコンテンツを配信させる攻撃だ。

XSSに関しては、App RouterでCSP(コンテンツセキュリティポリシー)のnonceを利用しているケース、そして外部からの信頼できない入力を消費する beforeInteractive スクリプトが影響を受ける。これらの設定は比較的高度なカスタマイズで使われるが、該当する場合はすぐに対処しなければ攻撃者によるスクリプト実行を許してしまう。

即時アップデートの必要性と対応手順

即時アップデートの必要性と対応手順

Vercelは今回のリリースに際し、新たなWAF(Web Application Firewall)ルールを展開していないと明言している。つまり、これらの脆弱性はWAFレベルで確実にブロックすることができず、パッチ適用が唯一の完全な緩和策となる。

アップデート手順の基本

まず、プロジェクトのNext.jsとReactのバージョンを確認する。package.jsonに記載されているバージョンが、今回の修正対象より古い場合は即座にアップデートを実行する。一般的な手順は以下の通りだ。

# Next.jsのアップデート
npm install next@latest

# 関連するReactパッケージも最新に
npm install react@latest react-dom@latest

yarnやpnpmなど、他のパッケージマネージャーを利用している場合も、同等のコマンドで問題ない。パッケージを更新した後は、必ずビルドとテストを実行し、アプリケーションが正常に動作することを確認してほしい。

本番環境でのリスク管理

今回のセキュリティリリースには、破壊的な変更は含まれていない。そのため、動作検証は必要だが、適用を躊躇する技術的理由はほぼない。重要なのは「スピード」だ。

とりわけ、middlewareで認証を実装しているサイト、WebSocketを処理するリアルタイムアプリケーション、そしてPPRやCache Componentsを採用しているパフォーマンス重視のサイトは、緊急度が極めて高い。Vercelの発表でも「all affected users should upgrade immediately(影響を受けるすべてのユーザーは直ちにアップグレードすべき)」と強い表現で呼びかけている。

今回のリリースが示すNext.jsセキュリティの潮流

今回のリリースが示すNext.jsセキュリティの潮流

一見すると大規模な脆弱性の一括修正はネガティブな出来事に思える。しかし、セキュリティの観点からは、むしろフレームワークの成熟度を示すポジティブなシグナルと捉えるべきだ。

まず、対策が「調整済みセキュリティリリース」として計画的に実施されている点が重要だ。これは、VercelとMeta(React)のチームが発見された問題を共有し、エコシステム全体で同時に対処する体制が整っていることを意味する。大規模なOSSプロジェクトでは、このような「調整済み開示」のプロセスがセキュリティ品質の生命線となる。

次に、脆弱性の範囲が「Server Components」「ミドルウェア」「エッジキャッシュ」「画像最適化API」といった、Next.jsの比較的新しい機能や高度な機能に集中している事実に注目したい。これは、攻撃者の標的が、従来のシンプルなWebアプリケーションから、エッジとサーバーを高度に組み合わせたモダンなアーキテクチャへとシフトしている証左だ。

SSRやエッジファンクションの利用が一般化するにつれ、開発者は「新しい機能がもたらす利便性」と「新たな攻撃表面が生まれるリスク」のバランスを常に意識する必要がある。便利なAPIほど、その裏側で何が起きているのかを深く理解することが、これからのフロントエンド開発者には不可欠だ。

この記事のポイント

  • Next.js 2026年5月セキュリティリリースは、ReactのCVE-2026-23870を含む13件の脆弱性を修正する
  • 影響範囲はDoS、ミドルウェアバイパス、SSRF、キャッシュポイズニング、XSSと多岐にわたる
  • WAFでは防げない脆弱性群のため、Next.jsとReact関連パッケージの即時アップデートが唯一の対策
  • とくに認証機能やServer Components系の新機能を使うプロジェクトは緊急度が高い
  • 調整済みリリースの実施は、Next.jsエコシステムのセキュリティ成熟度を示すポジティブな側面でもある
ヘッドレスCMSとWordPressの選び方、2026年版アーキテクチャ比較

ヘッドレスCMSとWordPressの選び方、2026年版アーキテクチャ比較

CMSの選定は2026年、技術的な好みの問題ではなくなった。その選択がマーケティングキャンペーンの展開速度、コンテンツ更新の自由度、ひいては収益に直結する。WordPressが世界のWebサイトの43.5%を支える支配的な存在である一方、ヘッドレスCMS市場は2027年までに16億ドルに達すると予測されている。

両者の違いは単なる「新しいか古いか」ではない。視覚的な構築の自由と、アーキテクチャの厳格な分離という、根本的に異なる哲学のせめぎ合いだ。本記事ではパフォーマンス、運用コスト、セキュリティ、SEO、そしてチームの働き方という実務の観点から、両アプローチを比較する。

根本的なアーキテクチャの違い

根本的なアーキテクチャの違い

アーキテクチャの議論は開発者だけの専門用語ではない。マーケティングチームが火曜の朝にランディングページを立ち上げられるかどうか、そのスピードを決める。この根本的な違いは採用戦略にも直接影響する。

従来のWordPressはモノリシック(一体型)システムだ。コンテンツデータベース、PHPの処理ロジック、HTML出力がすべて同じアプリケーション環境に同居する。ユーザーがリンクをクリックすると、サーバーはPHPスクリプトを実行しMySQLデータベースに問い合わせ、取得したデータをテーマテンプレートにはめ込み、最終的なHTMLをブラウザに返す。この一連の処理は一つのサーバー内で完結する。

一方、ヘッドレスはデカップルド(分離型)アーキテクチャと呼ばれる。コンテンツはContentfulやStrapiのようなクラウドデータベースに保存され、フロントエンドはReactやVueで構築された完全に別個のアプリケーションになる。フロントエンドアプリはAPIエンドポイントを通じて生のJSONデータを受け取り、コンテンツの見た目には一切関与しない。データの受け渡しと表示が完全に分離されているのだ。

なぜ開発者は分離を好むのか

Elementor Blogの記事によれば、最近のStack Overflow調査でヘッドレス技術への開発者関心が従来のPHPロールと比較して15%増加したという。彼らは「関心の分離」を重視する。バックエンドのコンテンツ管理とフロントエンドのUI実装が完全に切り離されることで、開発効率とコードの保守性が高まるからだ。

ただし、この分離にはトレードオフがある。マーケターがコンテンツの見た目をリアルタイムで確認する「ライブプレビュー」は、ヘッドレス環境では極めて面倒な課題として残っている。草案を確認するだけのために複雑なプレビューサーバーを構築しなければならないケースも多い。

ユーザー体験の決定的な差

ユーザー体験の決定的な差

ヘッドレスアーキテクチャがマーケティングチームを苦しめる最大の理由がここにある。技術的な純粋さと引き換えに、ワークフローの速度が犠牲になる。

WordPressの視覚的優位性

従来型WordPressは視覚的な構築体験で圧倒的に優位に立つ。Elementor Editor Proを例にとると、118種類以上のウィジェットを使ってCSSを一行も書かずにレイアウトを構築できる。コンテナをドラッグし、ブレークポイントを調整し、すぐに公開する。

ヘッドレスが生む開発者依存

ヘッドレス環境では、ヒーローセクションのレイアウトを変更したいだけでも、マーケターはJiraチケットを発行し、開発者がReactコンポーネントを更新し、GitHubにプッシュし、ビルドパイプラインの完了を待つという手順を踏まなければならない。毎週11本の記事を公開するチームにとって、この依存関係は数百時間の損失になりうる。

Elementor Blogで紹介されているAIアシスタント「Angie」のようなツールは、このギャップを埋めようとしている。チャットで指示するだけで、実用的なレイアウトやフォームを自動生成する。テキスト提案ではなく、実際に動作するアセットを構築する点が従来のAIと異なる。

一方で、スマート冷蔵庫、Apple Watchアプリ、Webサイトに同時にコンテンツを配信する必要があるなら、ヘッドレスのデータエントリーモデルは必須になる。配信先が3つ以上のチャネルに及ぶブランドは、前年比9.5%の収益増加を達成しているとのデータもある。

表示速度、パフォーマンスの現実

表示速度、パフォーマンスの現実

2026年において表示速度は贅沢品ではない。生存のための指標だ。世界のトラフィックの58.67%がモバイルデバイスを経由する中、重いサイトは収益を直接焼き尽くす。

ヘッドレスの圧倒的速度

ヘッドレスシステムは生の速度で容易に優位に立つ。静的サイト生成(SSG)という仕組みを使うからだ。SSGとは、コンテンツのHTMLファイルをあらかじめ生成しておき、CDN(コンテンツ配信ネットワーク。世界中に分散したサーバー拠点から最寄りの場所にデータを届ける仕組み)に保存する手法である。ユーザーがアクセスした瞬間にデータベースへ問い合わせる必要がないため、Next.jsで構築されたサイトは頻繁にLighthouseの満点を叩き出す。

WordPressが抱えるボトルネック

現在、WordPressサイトでGoogleのCore Web Vitals(コアウェブバイタル。ページ体験を測る3つの指標)の全項目を通過しているのは、わずか40.5%だ。PHP処理への依存度の高さと最適化されていないプラグインが深刻なボトルネックを生み出している。参考までに、Next.jsサイトの合格率は約55%に達する。

ただし、WordPressで速度を諦める必要はない。構築方法を変えれば良い。エッジキャッシュの導入、条件付きアセットローディング(必要なときにだけスクリプトを読み込む手法)、画像の自動圧縮、Redisを使ったデータベースクエリのオフロードを徹底する。速度向上は直接売上に跳ね返る。モバイルでわずか0.1秒の改善が小売のコンバージョン率を8.4%押し上げるというデータもある。

セキュリティと保守の実態

セキュリティと保守の実態

セキュリティは従来型CMSエコシステムに突き刺さる最大の棘だ。Elementor Blogの記事が引用する統計は痛烈である。CMS系Webサイトへの攻撃成功事例のうち、実に94%がWordPressを標的にしている。

WordPressの広大な攻撃対象

この数字の理由は明確だ。データベース、ログイン画面(wp-admin)、公開Webサイトがすべて同じサーバーIPアドレスを共有している。攻撃者が古いスライダープラグインの脆弱性を一つ見つければ、データベース全体へのアクセスを奪取できる。攻撃対象領域が極めて広いのだ。

ヘッドレスの構造的安全性

ヘッドレスアーキテクチャはこの攻撃対象領域を劇的に縮小する。フロントエンドはバックエンドから完全に切り離されているため、公開Webサイトにデータベースが接続されていない。ハッカーは静的HTMLファイルにSQLインジェクションを仕掛けることはできない。

もちろん、モノリシックシステムの防御は不可能ではない。共有ホスティングを避け、Cloudflare経由でWAF(Webアプリケーションファイアウォール)を導入し、使っていないプラグインは無効化ではなく即座に削除する。管理ロールには二要素認証を強制し、デフォルトのログインURLを変更する。こうした基本的な対策を徹底するだけでもリスクは大幅に下げられる。

コストの真実、初期費用と総所有コスト

コストの真実、初期費用と総所有コスト

初期構築費用は総所有コスト(TCO)の一部に過ぎない。多くの制作会社がパフォーマンスだけを謳い文句にヘッドレスを販売するが、クライアントに毎月のSaaS料金が重くのしかかる。

ヘッドレスの高い参入障壁

具体的な数字を見てみよう。SANITYのGrowthプランは月額949ドル、ContentfulのTeamティアは月額300ドルからスタートし、エンタープライズプランは通常月額2,000ドルを超える。Strapiのような月額29ドルの選択肢もあるが、Nodeアプリとデータベースを自前でホストする手間が加わる。

WordPressの現実的なコスト

従来型プラットフォームの参入障壁ははるかに低い。中小企業向けの高品質なマネージドWordPressホスティングは、おおむね月額20ドルから115ドルの範囲に収まる。大規模なコンテンツ運用をヘッドレスの数分の一の予算で回せる計算だ。

ただし、WordPressのスケーラビリティは無料ではない。月間100万訪問者を超えると、安価なホスティングは崩壊する。エンタープライズグレードのクラウドインフラ、積極的なキャッシュ階層、高度なセキュリティ設定が必要になる。結局のところ、開発コストもどちらの道でも発生する。ヘッドレスは高給のReact/Vueエンジニアを必要とし、従来型ビルドはPHP/WordPressエキスパートによるテーマロジックの維持や定期的なデータベース最適化を必要とする。

ハイブリッド手法、橋を架ける

ハイブリッド手法、橋を架ける

極端な二択を迫られる必要はない。2026年、最も賢いチームはハイブリッドアプローチを採用している。ページビルダーの視覚的自由を維持しつつ、特定の機能に最新のAPI技術を利用する。

WordPressを純粋なヘッドレスコンテンツリポジトリとして使うことも可能だ。WordPress REST APIとWPGraphQLを使えば、投稿や固定ページをJSONデータとしてクエリし、Next.jsフロントエンドに供給できる。執筆者には使い慣れたGutenbergインターフェースを提供しながら、開発者はモダンなスタックを手に入れられる。

より効率的なのは、モノリシックを維持しながらスピードを上げるアプローチだ。多数のプラグインをつぎはぎする代わりに、ホスティング、ビジュアルビルド、パフォーマンスツールを一つの環境に統合する。AIにワイヤーフレーム生成を任せ、人間は微調整に集中する。主要なマーケティングサイトはモノリシックのまま実行速度を確保し、求人情報や商品カタログといった特定の投稿タイプだけをREST API経由でモバイルアプリにプッシュする。これでデータを閉鎖的なシステムに閉じ込めず、マーケティングチームも視覚編集から締め出されない。

この記事のポイント

  • 従来型WordPressはマーケティングチームの即応性と視覚的編集で圧倒的に優位。
  • ヘッドレスは生の表示速度とセキュリティで勝るが、高いSaaSコストと開発者依存が課題。
  • WordPressの速度課題はエッジキャッシュと条件付きローディングで大幅に改善可能。
  • 3つ以上のチャネルにコンテンツを配信する場合、ヘッドレスのデータエントリーモデルが必須。
  • ハイブリッド手法を用いれば、両者の長所を活かした現実的な落とし所が見えてくる。
React/Next.jsで動的フォームを構築する2つの手法——RHF+ZodとSurveyJSの比較

React/Next.jsで動的フォームを構築する2つの手法——RHF+ZodとSurveyJSの比較

Reactアプリケーションにおいて、フォームの実装は避けて通れない課題だ。ログイン画面のような単純なものから、条件分岐が複雑に絡み合う多ステップの入力フォームまで、その難易度は多岐にわたる。

多くの開発者が「フォームはコンポーネントとして構築すべきだ」という共通のメンタルモデルを持っている。React Hook Form(RHF)とZodを組み合わせる手法は、現在のReactエコシステムにおける標準的な選択肢となっている。

しかし、フォームが「UI」の枠を超え、複雑な「ルールエンジン」へと変貌したとき、このモデルは限界を迎える。本記事では、コンポーネント駆動とスキーマ駆動という2つの異なるアプローチを比較し、プロジェクトに最適な手法を選択するための基準を提示する。

コンポーネント駆動アプローチ:React Hook FormとZodの組み合わせ

コンポーネント駆動アプローチ:React Hook FormとZodの組み合わせ

React Hook Form(RHF)は、非制御コンポーネントを活用して再レンダリングを最小限に抑えるライブラリだ。これにスキーマバリデーションライブラリであるZodを組み合わせることで、型安全で直感的なフォーム実装が可能になる。

Zodによるバリデーションスキーマの定義

コンポーネント駆動開発では、まずZodでデータの形状(Shape)を定義する。単純な必須チェックだけでなく、特定の条件に基づいた相関バリデーションも記述できる。

import { z } from "zod";

export const formSchema = z.object({
  firstName: z.string().min(1, "必須項目です"),
  email: z.string().email("無効なメール形式です"),
  price: z.number().min(0),
  quantity: z.number().min(1),
  taxRate: z.number(),
  hasAccount: z.enum(["Yes", "No"]),
  username: z.string().optional(),
  password: z.string().optional(),
  satisfaction: z.number().min(1).max(5),
  positiveFeedback: z.string().optional(),
  improvementFeedback: z.string().optional(),
}).superRefine((data, ctx) => {
  if (data.hasAccount === "Yes") {
    if (!data.username) {
      ctx.addIssue({ code: "custom", path: ["username"], message: "必須項目です" });
    }
    if (!data.password || data.password.length < 6) {
      ctx.addIssue({ code: "custom", path: ["password"], message: "6文字以上必要です" });
    }
  }
});

export type FormData = z.infer<typeof formSchema>;

このコードでは、`superRefine` を使用して「アカウントあり(Yes)」の場合にのみユーザー名とパスワードを必須にするロジックを実装している。Zodのスキーマはデータの構造を定義するものであり、どのフィールドがどのタイミングで表示されるかといった「表示ロジック」までは関与しない。

RHFによるフォームの実装と課題

RHFを用いた実装では、フォームの表示状態やステップの管理をReactの `useState` や `useWatch` で行う。

const { register, control, handleSubmit } = useForm<FormData>({
  resolver: zodResolver(formSchema),
});

const hasAccount = useWatch({ control, name: "hasAccount" });
const price = useWatch({ control, name: "price" });
const quantity = useWatch({ control, name: "quantity" });

const subtotal = useMemo(() => (price ?? 0) * (quantity ?? 1), [price, quantity]);

この手法の利点は、Reactの標準的な作法に従っているため、学習コストが低く自由度が高い点にある。一方で、条件分岐が増えるにつれてJSX内にインラインの条件式が散在し、ビジネスロジックがUIコードと密結合になるという課題がある。

スキーマ駆動アプローチ:SurveyJSによるデータ中心の実装

スキーマ駆動アプローチ:SurveyJSによるデータ中心の実装

スキーマ駆動アプローチでは、フォームをコンポーネントの集合体ではなく、一つの「データ(JSONスキーマ)」として扱う。SurveyJSはこの手法を代表するライブラリであり、フォームの構造、バリデーション、表示ロジック、計算式をすべてJSON内に集約できる。

JSONスキーマによるロジックの集約

SurveyJSでは、JavaScriptのコードではなく、宣言的なJSONオブジェクトでフォームを定義する。

const surveySchema = {
  pages: [
    {
      name: "order",
      elements: [
        { type: "text", name: "price", inputType: "number" },
        { type: "text", name: "quantity", inputType: "number" },
        {
          type: "expression",
          name: "subtotal",
          expression: "{price} * {quantity}"
        }
      ]
    },
    {
      name: "account",
      elements: [
        { type: "radiogroup", name: "hasAccount", choices: ["Yes", "No"] },
        {
          type: "text",
          name: "username",
          visibleIf: "{hasAccount} = 'Yes'",
          isRequired: true
        }
      ]
    }
  ]
};

ここで注目すべきは `visibleIf` や `expression` というプロパティだ。これらはSurveyJSのランタイムエンジンによって評価され、Reactのステート管理を介さずに動的な表示切り替えや計算結果の表示を可能にする。

Reactコンポーネントの役割の変化

SurveyJSを採用すると、Reactコンポーネントの役割は「スキーマを読み込んで描画するだけ」という極めてシンプルなものになる。

import { Model } from "survey-core";
import { Survey } from "survey-react-ui";

export function SurveyForm() {
  const [model] = useState(() => new Model(surveySchema));

  model.onComplete.add((sender) => {
    console.log(sender.data); // 送信データ
  });

  return <Survey model={model} />;
}

ビジネスロジックがReactから切り離されるため、エンジニア以外の担当者がJSONを書き換えるだけでフォームの挙動を調整できる。これは、要件変更が頻繁に発生するエンタープライズ向けのシステムにおいて、運用上の大きなメリットとなる。

技術的なトレードオフと選択基準

技術的なトレードオフと選択基準

どちらのアプローチが優れているかは、プロジェクトの性質に依存する。ここでは、開発効率と保守性の観点から両者を比較する。

コンポーネント駆動(RHF+Zod)が適しているケース

RHF+Zodのスタックは、フォームが単純なCRUD(作成・読み取り・更新・削除)操作に限定されている場合に最適だ。

  • UIの微調整や独自のアニメーションを多用する場合
  • フォームのステップ数が少なく、条件分岐が単純な場合
  • エンジニアがすべての挙動をコードで管理し、外部からロジックを注入する必要がない場合

このアプローチでは、TypeScriptの恩恵を最大限に受けられる。型定義が明確であるため、大規模なリファクタリングにも強いという特性がある。

スキーマ駆動(SurveyJS)が適しているケース

一方で、SurveyJSのようなスキーマ駆動が威力を発揮するのは、フォーム自体が「ビジネスルール」を体現している場合だ。

  • 法規制や業務フローの変化により、入力項目や条件が頻繁に変わる場合
  • 10ステップを超えるような長大な多ステップフォームを構築する場合
  • フォームの定義をデータベースに保存し、複数のプラットフォーム(Web、モバイルなど)で共有する場合

スキーマ駆動は、ロジックの「可視化」に優れている。JSONを見ればどの項目がどの条件で表示されるかが一目瞭然であり、コードを追う必要がない。

実務における運用上のメリットと分析

実務における運用上のメリットと分析

Web制作会社の視点では、保守コストの削減が最も重要な関心事となる。コンポーネント駆動で構築された複雑なフォームは、半年後の仕様変更時に「どの `useWatch` がどこに影響しているか」を解読する作業から始めなければならない。

スキーマ駆動を採用した場合、ロジックが中央集権的に管理されているため、修正箇所が限定される。また、SurveyJSにはGUIのビジュアルエディタも存在するため、非エンジニアであるディレクターやクライアントが直接フォームを編集し、エンジニアは生成されたJSONを組み込むだけという分業体制も構築可能だ。

ただし、SurveyJSのような重量級のライブラリは、バンドルサイズが増大する傾向にある。パフォーマンスが最優先されるBtoCのランディングページなどでは、RHFを用いた軽量な実装が選好されるだろう。

この記事のポイント

  • RHF+Zodは、UIの自由度が高く、小〜中規模のCRUDフォームに最適である。
  • SurveyJSは、ビジネスロジックをJSONに集約し、複雑な条件分岐を持つフォームの保守性を高める。
  • 「フォームを消したときに失われるものがUIならRHF、ロジックならSurveyJS」という判断基準が有効だ。
  • 運用フェーズでの要件変更の頻度を予測し、適切な抽象化レベルを選択することが重要である。

出典

  • Smashing Magazine “Building Dynamic Forms In React And Next.js”(2026年3月10日)