React(React.jsまたはReactJSとも呼ばれる)は、コンポーネントに基づくユーザーインターフェースの構築をより「シームレス」にする目的で開発された、無料のオープンソースのフロントエンドJavaScriptライブラリです。 [ 5 ] [ 6 ] 。 [ 5 ] Meta(旧Facebook)と個人の開発者や企業のコミュニティによってメンテナンスされています。 [ 7 ] [ 8 ] [ 9 ] 2025年のStack Overflow開発者調査によると、Reactは最もよく使われているウェブ技術の1つです。[ 10 ]
Reactは、 Next.jsやReact Routerなどのフレームワークを使用して、シングルページ、モバイル、またはサーバーレンダリングアプリケーションの開発に使用できます。ReactはユーザーインターフェースとDOMへのコンポーネントのレンダリングのみを扱うため、Reactアプリケーションはルーティングやその他のクライアントサイド機能のためにライブラリに依存することがよくあります。 [ 11 ] [ 12 ] Reactの主な利点は、ページの変更された部分のみを再レンダリングし、変更されていないDOM要素の不要な再レンダリングを回避することです。Reactは、推定で全ウェブサイトの6%で使用されています。[ 13 ]
Reactは宣言型プログラミングパラダイムに準拠しています。[ 14 ] [ 15 ] : 76 開発者はアプリケーションの各状態に対してビューを設計し、Reactはデータが変更されるとコンポーネントを更新してレンダリングします。これは命令型プログラミングとは対照的です。[ 16 ]
Reactコードはコンポーネントと呼ばれるエンティティで構成されています。[ 15 ]:10~12 これらのコンポーネントはモジュール化されており、再利用できます。[ 15 ]:70React アプリケーションは通常、多くのレイヤーのコンポーネントで構成されています。コンポーネントはReact DOMライブラリを使用してDOMのルート要素にレンダリングされます。コンポーネントをレンダリングする際、値はprops(「プロパティ」の略)を介してコンポーネント間で受け渡されます。コンポーネント内部の値は状態と呼ばれます。[ 17 ]
Reactでコンポーネントを宣言する主な方法は、関数コンポーネントとクラスコンポーネントの2つです。[ 15 ]:118 [ 18 ]:10React v16.8以降では、関数コンポーネントの使用が推奨されています。
React Conf 2018で発表され、React v16.8以降で利用可能な関数コンポーネントは、単一の「props」引数を受け取りJSXを返す関数で宣言されます。関数コンポーネントは、useStateフックを使用して内部状態を使用できます。 [ 19 ]
2019年2月16日、React 16.8が一般公開され、React Hooksが導入されました。[ 19 ] Hooksは、開発者が関数コンポーネントからReactの状態とライフサイクル機能を「フック」できるようにする関数です。[ 20 ]注目すべきは、Hooksはクラス内では動作しないことです。開発者はクラスなしでReactのより多くの機能を利用できるようになります。[ 21 ]
ReactはuseState、[ 22 ] [ 18 ] : 37 useContext、[ 15 ] : 11 、 [ 22 ] [ 18 ] : 12、[ 15 ] : 92 useReducer、[ 22 ] [ 18 ] : 65–66 、[ 15 ] : 154、[ 22 ] [ 18 ] : 162、[ 23 ] [ 18 ] : 93–95その他のフックについては 、フックAPIリファレンスに記載されています。[ 24 ] [ 15 ] : 62 最もよく使用されるとは、それぞれ状態[ 15 ] : 37 と副作用、[ 15 ] : 61 を制御するために使用されます。 useMemouseEffectuseStateuseEffect
フックには2つのルールがあり[ 25 ]、フックが依存する特徴的なコードパターンを説明しています。
これらのルールは実行時に強制することはできませんが、リンターなどのコード解析ツールを設定すれば、開発中に多くのミスを検出できます。これらのルールは、フックの使用と、他のフックを呼び出す可能性のあるカスタムフック[ 26 ]の実装の両方に適用されます。
React Server Components(RSC)[ 27 ]は、サーバー上でのみ実行される関数コンポーネントです。この概念は、「サーバーコンポーネントによるデータ取得」という講演で初めて紹介されました。[ 28 ]現在、サーバーコンポーネントはNext.js で最も簡単に利用できます。Next.jsでは、サーバーとクライアント(ブラウザ)の両方のコンポーネントを記述できます。サーバーでレンダリングされたコンポーネントがブラウザで受信されると、ブラウザのReactが処理を引き継ぎ、仮想DOMを作成し、イベントハンドラをアタッチします。これはハイドレーションと呼ばれます。[ 29 ]
サーバーサイドレンダリング( RSC)と似た概念ですが、RSCはハイドレーションが発生しないため、対応するJavaScriptをクライアントに送信しません。そのため、フックにアクセスできません。ただし、非同期関数として実装することで、非同期操作を直接実行できます。
非同期関数MyComponent () {const message = fetchMessageFromDb ()を待機します。戻る(< div >メッセージ: { message } div >);}クラスコンポーネントはES6クラスを使用して宣言されます。関数コンポーネントと同じように動作しますが、状態とライフサイクルイベントの管理にフックを使用する代わりに、React.Component基底クラスのライフサイクルメソッドを使用します。
ParentComponentクラスはReact.Componentを拡張します。状態= {色: '緑' };与える(){戻る(< ChildComponent の色= { this . state . color } />);}}2019 年 2 月に React 16.8 で React Hooks が導入されたことで、開発者は関数コンポーネント内の状態とライフサイクルの動作を管理できるようになり、クラス コンポーネントへの依存が軽減されました。
この傾向は、関数型プログラミングとモジュール設計への業界全体の動きと一致しています。Reactが進化を続けるにつれ、開発者は新しいアプリケーションを構築したり、既存のアプリケーションをリファクタリングしたりする際に、関数型コンポーネントとReact Hooksの利点を考慮することが不可欠になります。[ 30 ]
React自体にはルーティングのサポートが組み込まれていません。Reactは主にユーザーインターフェースを構築するためのライブラリであり、すぐに使える本格的なルーティングソリューションは含まれていません。Reactアプリケーションでは、React Routerなどのサードパーティ製ライブラリを使用してルーティングを処理できます。[ 31 ]これにより、開発者はルートの定義、ナビゲーションの管理、URLの変更処理をReactに適した方法で行うことができます。

もう一つの注目すべき機能は、仮想ドキュメントオブジェクトモデル(仮想DOM)の使用です。ReactはブラウザのDOMに似たメモリ内データ構造を作成します。コンポーネントがレンダリングされるたびに、その結果は仮想DOMと比較されます。そして、計算された差分のみを使用して、ブラウザに表示されるDOMを効率的に更新します。[ 32 ]このプロセスは調整と呼ばれます。これにより、プログラマーは変更のたびにページ全体がレンダリングされるかのようにコードを記述できますが、Reactは実際に変更されたコンポーネントのみをレンダリングします。この選択的なレンダリングは、パフォーマンスを大幅に向上させます。[ 33 ] [ 34 ]
ReactDOM.render[ 35 ]が同じコンポーネントとターゲットに対して再度呼び出されると、Reactは仮想DOMの新しいUI状態を表現し、リビングDOMのどの部分(もしあれば)を変更する必要があるかを判断します。[ 36 ]

クラスベースのコンポーネントのライフサイクル メソッドは、コンポーネントの有効期間中に設定されたポイントでコードを実行できるようにする フック形式を使用します。
ShouldComponentUpdateレンダリングが不要な場合に false を返すことで、開発者はコンポーネントの不要な再レンダリングを防ぐことができます。componentDidMountコンポーネントが「マウント」されると(コンポーネントはユーザーインターフェースに作成され、多くの場合DOMノードに関連付けられます)、呼び出されます。これは通常、 APIを介してリモートソースからデータの読み込みをトリガーするために使用されます。componentDidUpdate更新が行われた直後に呼び出されます。[ 37 ]componentWillUnmountコンポーネントが破棄される、つまり「アンマウント」される直前に呼び出されます。これは通常、コンポーネントのアンマウントでは単純に削除されない、コンポーネントへのリソースを大量に消費する依存関係をクリアするために使用されます(例えば、setInterval()コンポーネントに関連するインスタンスや、コンポーネントの存在によって「ドキュメント」に設定された「eventListener」を削除するなど)。renderは最も重要なライフサイクルメソッドであり、どのコンポーネントでも唯一必須のメソッドです。通常、コンポーネントの状態が更新されるたびに呼び出され、その更新はユーザーインターフェースに反映されます。JSX、または JavaScript XML は、JavaScript 言語構文の拡張です。[ 38 ]見た目は HTML に似ていますが[ 15 ] : 11 JSX は、多くの開発者に馴染みのある構文を使用してコンポーネントのレンダリングを構造化する方法を提供します[ 15 ] : 15 。React コンポーネントは通常 JSX を使用して記述されますが、必ずしも JSX である必要はありません (コンポーネントは純粋な JavaScript で記述することもできます)。コンパイル中に、JSX は JavaScript コードに変換されます。JSX は、Facebook がPHP用に作成したXHPと呼ばれる別の拡張構文に似ています。
JSX コードの例:
function Example () { // 新しい状態変数を宣言します。これを「count」と呼びます。const [ count , setCount ] = useState ( 0 ) ;return ( < div > < p > { count }回クリックしました< / p > < button onClick = {() => setCount ( count + 1 )}>クリックしてください</ button > </ div > ); }Reactの基本アーキテクチャは、ブラウザでのHTMLレンダリングだけにとどまりません。例えば、Facebookは<canvas>タグにレンダリングされる動的なチャートを提供しており[ 39 ]、NetflixとPayPalはユニバーサルロードを使用してサーバーとクライアントの両方で同一のHTMLをレンダリングしています[ 40 ] 。 [ 41 ] Reactは、 React Nativeを使用してAndroidとiOS向けのネイティブアプリを開発するためにも使用できます。
サーバーサイドレンダリング(SSR)とは、クライアント側のJavaScriptアプリケーションをブラウザではなくサーバー上でレンダリングするプロセスを指します。[ 42 ]これにより、特に低速接続や低速デバイスを使用しているユーザーにとって、アプリケーションのパフォーマンスが向上します。[ 43 ]
SSRでは、クライアントに送信される最初のHTMLには、アプリケーションの完全にレンダリングされたUIが含まれます。[ 44 ]これにより、クライアントのブラウザは、JavaScriptがダウンロードされて実行されるまで待ってからUIをレンダリングする必要がなく、すぐにUIを表示できます。[ 44 ]
ReactはSSRをサポートしており、開発者はReactコンポーネントをサーバー上でレンダリングし、結果のHTMLをクライアントに送信することができます。[ 45 ]これは、アプリケーションのパフォーマンスを向上させるだけでなく、検索エンジンの最適化にも役立ちます。[ 46 ]
Reactは完全なアプリケーションライブラリを提供することを目指していません。ユーザーインターフェースの構築に特化して設計されているため[ 5 ]、一部の開発者がアプリケーション構築に必要と考えるツールの多くは含まれていません。そのため、ネットワークアクセスやローカルデータストレージなどのタスクを実行するために、開発者は好みのライブラリを選択できます。ライブラリが成熟するにつれて、一般的な使用パターンが生まれてきました。
Reactの単方向データフローの概念( AngularJSの双方向フローとは対照的かもしれない)をサポートするために、一般的なモデル・ビュー・コントローラアーキテクチャの代替としてFluxアーキテクチャが開発されました。Fluxは、中央ディスパッチャを介してストアに送信されるアクションを特徴としており、ストアへの変更はビューに伝播されます。[ 47 ] Reactで使用する場合、この伝播はコンポーネントプロパティを通じて実現されます。Fluxは、その構想以来、 ReduxやMobXなどのライブラリに取って代わられてきました。[ 48 ]
フラックスは観察者パターンの変種と考えることができる。[ 49 ]
Fluxアーキテクチャに基づくReactコンポーネントは、渡されたプロパティを直接変更するのではなく、ディスパッチャからストアを変更するために送信されるアクションを作成するコールバック関数を渡す必要があります。アクションは、何が起こったかを記述する役割を持つオブジェクトです。例えば、あるユーザーが別のユーザーを「フォロー」するアクションには、ユーザーID、ターゲットユーザーID、およびタイプが含まれます。[ 50 ]ストアはモデルと考えることができ、ディスパッチャから受信したアクションに応じて自身を変更できます。 USER_FOLLOWED_ANOTHER_USER
このパターンは、「プロパティは下向きに流れ、アクションは上向きに流れる」と表現されることがあります。Fluxの実装は誕生以来数多く開発されてきましたが、おそらく最もよく知られているのはReduxでしょう。Reduxは単一のストア(しばしば「単一の真実の源」と呼ばれます)を備えています。[ 51 ]
2019年2月、React 16.8リリースでフックuseReducerとして導入されました。Reduxと一貫性のあるAPIを提供し、開発者はコンポーネントの状態に対してローカルなRedux風のストアを作成できます。[ 52 ]
ReactはMetaのソフトウェアエンジニアであるJordan Walkeによって開発されました。彼は当初「F-Bolt」 [ 53 ]というプロトタイプを開発し、後に「FaxJS」に改名しました。この初期バージョンはJordan WalkeのGitHubリポジトリに文書化されています。[1]このプロジェクトに影響を与えたものには、PHP用のHTMLコンポーネントライブラリであるXHPが含まれています。
Reactは2011年にFacebookのニュースフィードに初めて導入され、その後2012年にInstagramに統合されました。 [ 54 ] 2013年5月のJSConf USで、プロジェクトは正式にオープンソース化され、その採用と成長における重要な転換点となりました。[2]
React によるネイティブAndroid、iOS、UWP開発を可能にするReact Native は、2015 年 2 月に Facebook の React Conf で発表され、2015 年 3 月にオープンソース化されました。
2017年4月18日、FacebookはReactの旧レンダリングアルゴリズム「Stack」に代わる、レンダリングのための新しい内部アルゴリズムセット「React Fiber」を発表しました。[ 55 ] React Fiberは、Reactライブラリの将来の改良と機能開発の基盤となることになりました。[ 56 ] Reactプログラミングの構文自体は変更されておらず、構文の実行方法のみが変更されています。[ 57 ] Reactの旧レンダリングシステム「Stack」は、動的な変化へのシステムの重点が理解されていなかった時代に開発されました。例えば、Stackは複雑なアニメーションの描画に時間がかかり、すべてを一度に実行しようとしていました。Fiberはアニメーションを複数のフレームに分散できるセグメントに分割します。同様に、ページの構造も個別に保守・更新できるセグメントに分割できます。JavaScript関数と仮想DOMオブジェクトは「ファイバー」と呼ばれ、それぞれを個別に操作・更新できるため、画面上のレンダリングがよりスムーズになります。[ 58 ]
2017年9月26日、React 16.0が一般公開されました。[ 59 ] React 16.0では、子ツリーのどこでもJavaScriptエラーをキャッチし、アプリをクラッシュさせる代わりにフォールバックUIをレンダリングする新しいコンポーネントタイプであるエラー境界が導入されました。[ 60 ]
2020年10月20日、ReactチームはReact v17.0をリリースしました。これは、React開発者向けAPIに大きな変更がない最初のメジャーリリースとして注目に値します。[ 61 ]
2022年3月29日、React 18がリリースされ、新しい並行レンダラー、自動バッチ処理、サスペンスによるサーバーサイドレンダリングのサポートが導入されました。[ 62 ] React 18ではInternet Explorer 11のサポートが廃止されました。[ 63 ]
2024年12月5日、React 19がリリースされました。このリリースでは、Actionsが導入され、保留状態、エラー、楽観的更新を手動で処理するのではなく、非同期関数を使用して状態更新プロセスを簡素化できるようになりました。React 19には、サーバーコンポーネントのサポートと静的サイト生成の改善も含まれています。[ 64 ]
2025年10月、MetaはReact、React Native、JSX(JavaScript XML )をLinux Foundationの一部である新しいReact Foundationに寄贈すると発表した。[ 65 ]
2025年11月29日、React2Shellとも呼ばれる脆弱性CVE-2025-55182が報告され、リモートコード実行が可能となりました。CVSSスコアは最高値の10.0でした。 [ 66 ] [ 67 ]バージョン19.0.1、19.1.2、19.2.1で修正が導入されました。[ 68 ]
2025年12月11日、ReactチームはReact Server Componentsにおける追加の脆弱性を公開しました。サービス拒否問題(CVE-2025-55184およびCVE-2025-67779、CVSS 7.5)とソースコード露出問題(CVE-2025-55183、CVSS 5.3)です。[ 69 ] [ 70 ] [ 71 ] [ 72 ] [ 73 ]修正はバージョン19.0.3、19.1.4、19.2.3にバックポートされました。[ 74 ]
2013年5月にReactが初めて公開された際には、Apache License 2.0が使用されていました。2014年10月、React 0.12.00ではこれを3条項BSDライセンスに置き換え、ソフトウェアに関連するFacebookの特許の使用を許可するPATENTSテキストファイルを別途追加しました。[ 76 ]
本契約に基づいて付与されるライセンスは、次の主張(訴訟、主張、その他の措置の提起を含む)を行った者に対して、自動的に通知なく終了します。(a) Facebook またはその子会社または関連会社による、特許の直接的、間接的、または幇助的な侵害または侵害の教唆(当該主張が本ソフトウェアに関連するか否かに関わらず)、(ii) Facebook またはその子会社または関連会社のソフトウェア、製品、サービスに起因して当該主張が本ソフトウェアに関連するか否かに関わらず、いずれかの当事者による、または (iii) 本ソフトウェアに関連するいずれかの当事者による、または (b) Facebook の特許主張におけるいずれかの権利が無効または執行不可能である、という主張。
この型破りな条項は、Reactユーザーコミュニティで論争を巻き起こしました。なぜなら、Facebookがライセンシーを訴え、その行動をブログなどで公表するなど「その他の措置」を講じるよう促した場合など、多くのシナリオにおいてFacebookがライセンスを取り消す権限を与えていると解釈される可能性があるためです。多くの人が、Facebookがこの解除条項を不当に利用したり、Reactを製品に統合することでスタートアップ企業の将来の買収が複雑化したりするのではないかと懸念を表明しました。[ 77 ]
Facebookはコミュニティからのフィードバックに基づいて、2015年4月に特許付与をより曖昧さが少なく、より寛容なものに更新しました。[ 78 ]
本契約に基づき付与されたライセンスは、お客様(またはお客様の子会社、関連会社、代理人)が、(i)Facebookまたはその子会社または関連会社に対して、(ii)Facebookまたはその子会社または関連会社のソフトウェア、技術、製品、またはサービスに起因して全部または一部生じた特許主張を、直接的または間接的に開始するか、直接的な金銭的利益を得た場合、自動的に予告なく終了します。(iii)本ソフトウェアに関連する当事者に対する特許主張。[...]「特許主張」とは、交差請求または反訴を含む、特許の直接、間接、または幇助侵害または侵害の教唆を主張する訴訟またはその他の行為を指します。[ 79 ]
Apacheソフトウェア財団は、このライセンス契約は「ライセンシーではなくライセンサーに不利な形でソフトウェアの下流の消費者にリスクを転嫁するものであり、普遍的な寄付者であるというApacheの法的方針に違反する」ため、そのライセンスポリシーに反すると判断しました。また、「[Apache License 2.0]に含まれるライセンスのサブセットではなく、[Apache License 2.0]としてサブライセンスすることもできません」としています。[ 80 ] 2017年8月、FacebookはApache財団の下流の懸念を却下し、ライセンスの再検討を拒否しました。[ 81 ] [ 82 ]翌月、WordPressはGutenbergとCalypsoプロジェクトをReactから切り替えることを決定しました。[ 83 ]
2017年9月23日、Facebookは翌週、Flow、Jest、React、Immutable.jsを標準MITライセンスの下で再ライセンスすると発表した。同社はReactが「ウェブ向けオープンソースソフトウェアの幅広いエコシステムの基盤」であり、「非技術的な理由で進歩を遅らせたくない」と述べた。[ 84 ]
2017年9月26日に、React 16.0.0がMITライセンスでリリースされました。[ 85 ] MITライセンスの変更は、React 15.6.2とともに15.xリリースラインにもバックポートされています。[ 86 ]
{{cite book}}:|website=無視されました (ヘルプ)