React JS 面接でよく聞かれる質問と回答トップ40(2026年版)
React JSの面接の準備はできていますか?何があなたを待っているのかを探る時が来ました。 React JSの面接の質問 概念の明確さと現実世界での実装の強みの両方を明らかにするのに役立ちます。
React JSは、技術経験と専門知識を持つプロフェッショナルにとって、計り知れないキャリアのチャンスを提供します。新卒の方でも、5年、10年の実務経験を持つシニアの方でも、分析スキルと技術的専門知識は重要です。これらの質問と回答は、チームリーダー、マネージャー、開発者がスキルセットを磨き、面接で上位を目指すのに役立ちます。
このまとめは、採用マネージャーや技術リーダーを含む 85 名を超える専門家からの洞察に基づいており、さまざまな分野の作業チームから収集された多様な業界の期待と実際の面接パターンを反映しています。
React JSの面接でよく聞かれる質問と回答
1) 仮想 DOM と、React での調整の仕組みについて説明します。
回答:
仮想DOMは、ReactがUIの変更を効率的に計算するために維持するメモリ内のUI表現です。状態やプロパティが変更されると、Reactは新しい仮想DOMツリーをレンダリングし、 差分 アルゴリズムは、前のツリーに対して、実際に必要なDOM操作の最小限のセットを見つけるために実行されます。このプロセスは 和解レイアウトの乱れやブラウザのリフローによるコストを最小限に抑えます。Reactは キー リスト内の要素に、レンダリング間でノードを一致させるために、型やキーの比較などのヒューリスティックを用いてノードの更新、並べ替え、削除を決定します。これにより、予測可能な更新、バグの発生範囲の縮小、複雑なUIでのパフォーマンス向上などが実現します。
例:
チャットメッセージの動的なリストのレンダリング: 安定した key 値 (メッセージ ID) を変更すると、既存のノードはそのまま残り、新しいメッセージのみが DOM に追加されるため、不要な再レンダリングが回避されます。
👉 無料PDFダウンロード:React JS面接の質問と回答
2) React のコンポーネントライフサイクルにはどのような種類があり、Hooks はそれらにどのようにマッピングされますか?
回答:
Reactコンポーネントはマウント、アップデート、アンマウントのフェーズを経ます。クラスコンポーネントでは、次のようなライフサイクルメソッドが存在します。 componentDidMount, shouldComponentUpdate, componentDidUpdate, componentWillUnmount 副作用、レンダリングの決定、クリーンアップを管理する。関数コンポーネントでは、 フック 同等の機能を提供します。 useEffect レンダリング後のエフェクトを処理します。内部のクリーンアップ関数 useEffect アンマウント時または次のエフェクトの前に実行します。 useMemo の三脚と useCallback メモ化を制御する。 useRef レンダリングをまたいで可変参照を保持します。フックの利点としては、コンポーザビリティ、“this”バインディングの問題の軽減、カスタムフックによるロジックの再利用の容易さなどが挙げられますが、主な欠点はフックのルールと依存関係の管理を習得する必要があることです。
例を挙げて答えてください:
- 取り付け効果:
useEffect(() => fetchData(), []). - アンマウント時のクリーンアップ:
useEffect(() => { start(); return stop; }, []).
3) React アプリケーションでは、クライアント側レンダリング (CSR)、サーバー側レンダリング (SSR)、静的サイト生成 (SSG)、増分静的再生成 (ISR) の中からどのように決定しますか?
回答:
レンダリング戦略は、ユーザー エクスペリエンスの要件、データの鮮度、SEO のニーズ、インフラストラクチャの制約、開発速度によって決定する必要があります。 社会貢献活動 SEO が二次的な要素となる、認証の背後にある高度にインタラクティブなアプリに適しています。 SSR パブリックページの実際のデータを使用して最初のペイントを提供し、最初のバイトまでの時間と SEO を改善しますが、サーバー コストは高くなります。 SSG ビルド時にページを事前計算し、データの変更頻度が低い場合に優れた速度とキャッシュを実現します。 のISR 静的ページをオンデマンドで段階的に更新することで、鮮度とパフォーマンスのバランスを実現します。その要素には、キャッシュ可能性、パーソナライゼーション、世界中のユーザーへのレイテンシ、運用の複雑さなどが含まれます。
表:メリットとデメリット
| アプローチ | 優位性 | デメリット |
|---|---|---|
| 社会貢献活動 | シンプルなホスティング、豊富なインタラクティブ性 | 最初のペイントが遅いとSEOが弱くなる |
| SSR | 優れた SEO、初回読み込み時の最新データ | サーバーの負荷と複雑さが増す |
| SSG | 高速、安価、CDN対応 | 再構築するまで古いコンテンツ |
| のISR | 鮮度管理された高速 | 管理すべき可動部分が増える |
4) ローカル状態、コンテキスト、Redux、クエリ ライブラリのうち、どの状態管理戦略を使用する必要がありますか?
回答:
選択する 最もシンプルなツール 問題の特性を扱うコンポーネントローカル状態は useState or useReducer 分離された UI の問題に最適です。 コンテキスト 読み取り専用のアプリケーション全体の値 (テーマ、ロケール、現在のユーザー) には機能しますが、大規模なツリー全体での高頻度の更新には最適化されていません。 Reduxの または同様のイベント ソース ストアは、予測可能性、タイム トラベル デバッグ、ミドルウェア、および厳密な一方向のデータ フローが必要な場合に最適です。 データ取得ライブラリ (例えばReact Queryスタイルのパターン)は、サーバー状態のライフサイクル(キャッシュ、重複排除、再フェッチ戦略、同期)を管理し、定型文を削減します。実用的なアーキテクチャでは、 ローカル状態 + 構成のコンテキスト + サーバー状態ライブラリ複雑なワークフローには Redux を使用します。
例:
ダッシュボードは、APIキャッシュにReact Query、テーマにContextを使用し、 useReducer ローカル イベント処理用の複雑なウィジェット内。
5) useEffect と useLayoutEffect の違いは何ですか? それぞれはいつ適用されますか?
回答:
useEffect ブラウザが描画された後に実行されるため、データの取得、サブスクリプション、ログ記録などの非ブロッキング タスクに適しています。 useLayoutEffect 実行 DOMの変更後、ペイント前に同期的にちらつきなく実行する必要がある測定とレイアウト調整(例えば、要素のサイズの読み取りとスタイルの同期再適用)を可能にします。 useLayoutEffect 使いすぎると描画が妨げられ、応答性が低下する可能性がある。良いルールは、 useEffect 副作用について調べて useLayoutEffect 視覚的な正確さを確保するためにレイアウトを測定したり同期的に変更したりする必要がある場合にのみ使用します。
例を挙げて答えてください:
useEffect: レンダリング後にユーザー プロファイルを取得します。useLayoutEffect: ペイントする前にツールチップのサイズを測定して配置します。
クイック比較
| 特性 | useEffect | レイアウト効果を使用する |
|---|---|---|
| タイミング | 塗装後 | 塗装前 |
| ユースケース | データ、サブスクリプション | 測定、同期レイアウトの修正 |
| リスク | 重い場合は軽微な不具合 | 重い場合はペイントをブロックします |
6) リスト内でのキーの働きと配列インデックスを使用する際の落とし穴について説明します。
回答:
キーはReactの照合を可能にし、レンダリング間でリスト項目を正確に識別します。安定した一意のキーにより、ReactはDOMの変更を最小限に抑えながら、項目の並べ替え、挿入、削除を行うことができます。 配列インデックス アイテムの並べ替え、挿入、削除が可能な場合、キーとしてインデックスを使用することは問題となります。Reactは以前の状態を誤った要素に関連付ける可能性があり、微妙なバグ(例えば、入力値やアニメーションの誤り)を引き起こす可能性があります。ベストプラクティスは、データベースIDのような不変でドメイン固有の識別子を使用することです。リストが完全に静的で並べ替えが行われない場合はインデックスも許容されますが、これは例外であり、一般的ではありません。
例:
ドラッグ可能なカンバン ボードでは、ドラッグ アンド ドロップ中にコンポーネントの ID を保持するために、インデックスではなくカード ID を使用する必要があります。
7) メモ化技術は React のどこに適用されますか? また、その利点と欠点は何ですか?
回答:
メモ化は、入力が変更されていない場合に以前の結果を再利用することで、不要な計算と再レンダリングを削減します。Reactでは、 React.memo コンポーネント出力をキャッシュする useMemo 高価な計算をキャッシュし、 useCallback 子プロセスに渡される関数のIDをメモ化します。主な利点は、パフォーマンスの安定性と、高負荷な操作時のCPU使用率の低減です。欠点としては、複雑さ、依存関係が間違っている場合のキャッシュの遅延によるバグの可能性、メモリオーバーヘッドなどが挙げられます。
表: メモを取るためのさまざまな方法
| タイプ | 目的 | 考慮すべき典型的な要素 |
|---|---|---|
React.memo(Component) |
プロパティが浅い場合は再レンダリングをスキップする | プロップボラティリティ、子供費用 |
useMemo(fn, deps) |
計算された値をキャッシュする | コンピューティングとメモリのコスト |
useCallback(fn, deps) |
安定関数の同一性 | 依存関係の正確性 |
例を挙げて答えてください:
グリッドのフィルタリングされソートされたデータセットをメモ化するには、 useMemoセルレンダラーコンポーネントをラップする React.memo 再レンダリングの嵐を避けるため。
8) フォームには、制御されたコンポーネントと制御されていないコンポーネントのどちらを好みますか? フォームの状態の利点、欠点、種類について説明してください。
回答:
制御対象コンポーネント 入力をReact状態にバインドする value の三脚と onChange単一の真実のソースから得られる検証、マスキング、条件付きUIを可能にします。メリットは予測可能性と他の状態との容易な統合です。デメリットは、最適化を行わない場合、キー入力ごとに再レンダリングが必要になることです。 制御されていないコンポーネント DOMをrefsを用いて信頼できる情報源として利用することで、基本的なフォームではオーバーヘッドが少なく配線がシンプルになりますが、一元的な検証は難しくなります。複雑なワークフローでは、重要なフィールドには制御された入力を使用し、テキストが大量に含まれる大きな領域には制御されていない入力を使用するというハイブリッドパターンが一般的です。
例:
サインアップ フォームでは、電子メールとパスワードの検証に制御されたフィールドが使用されますが、メモのテキスト領域は再レンダリングのオーバーヘッドを削減するために制御されません。
9) コンテキストとカスタムフックはいつ使用しますか? また、概念的にはどのような違いがありますか?
回答:
コンテキスト 輸送機構 多くのコンポーネントが必要とする値に対して、プロパティのドリルダウンを回避します。状態は自身で管理するのではなく、単に子孫に公開します。 カスタムフック 状態、エフェクト、外部サービスを組み合わせた再利用可能なロジックをカプセル化し、値と関数を返します。Context は、共有の読み取り専用設定を提供したり、ストアを公開したりするために使用します。また、カスタムフックを使用してストアの動作を実装したり、認証、機能フラグ、データ取得ポリシーなどの問題をオーケストレーションしたりすることもできます。これら 2 つは補完的であり、共通のパターンは次のとおりです。 useAuth() カスタムフックとして AuthContext.
例を挙げて答えてください:
AuthProvider コンテキストを介してユーザーとトークンを提供します。 useAuth ログイン、更新、ログアウトの副作用を処理します。
10) 遅いレンダリングやライフサイクルのホットスポットの特徴を含む、大規模な React アプリケーションのパフォーマンス チューニング戦略の概要を説明していただけますか?
回答:
パフォーマンスチューニングは測定から始まります。React DevToolsのプロファイラとブラウザパフォーマンスパネルを使用して、リコンシリエーションのホットスポットやコストの高いコミットを特定し、遅いパスを特定します。具体的な対策としては、 州の地方自治体 (状態を消費者の近くに保つ)、 メモ化 (React.memo, useMemo, useCallback), リスト仮想化 長いリストの場合、 コード分割 初期バンドルを削減するために遅延読み込みを使用し、 デバウンスまたはスロットリング 高頻度のイベント。サーバー上のデータの場合は、クエリライブラリによるキャッシュを採用し、 サスペンス向き よりスムーズな読み込みのためのパターン。依存関係の配列が広範囲にわたるために頻繁に実行されるエフェクトや、コンテキスト値の頻繁な変更によって再レンダリングされるコンポーネントなど、ライフサイクルのホットスポットに注意してください。
例を挙げて答えてください:
ウィンドウ ライブラリを使用して 10,000 行のテーブルを仮想化し、ルートベースのコード分割の背後で重いチャートを遅延ロードして、初期ペイントを改善します。
11) React における props と state の違いは何ですか?
回答:
両方 props の三脚と state コンポーネントのレンダリング方法に影響しますが、その目的とライフサイクルは根本的に異なります。 小道具 (プロパティの略)は親コンポーネントから子コンポーネントに渡される不変の入力であり、レンダリングのための設定やデータを定義します。 下向きの React の一方向データフローであり、受信側コンポーネントによって変更されるべきではありません。 州/地域一方、は変更可能であり、コンポーネントによって内部的に維持されます。フォームの入力値や表示/非表示の切り替えなど、時間の経過とともに変化する動的な動作を決定します。
主な相違点表:
| 因子 | 小道具 | 州/地域 |
|---|---|---|
| 変異性 | 不変 | 可変 |
| 所有権 | 親から渡される | コンポーネントによって所有 |
| 更新方法 | 親の再レンダリング | useState or setState |
| Use Case | 動的なUIの変更 | |
| ライフサイクル | レンダリング中に存在する | 持続し、再レンダリングをトリガーします |
例:
A <Button color="blue" /> 小道具を使って色を決め、 clicked 状態のブール値によって視覚的なフィードバックが切り替わります。
12) React のコンポーネント アーキテクチャ パターンと、コンポーネントを分類するさまざまな方法を説明します。
回答:
Reactアプリケーションは コンポーネントベースのアーキテクチャUIを小さく再利用可能な構成要素に分割します。コンポーネントは、 目的 の三脚と 責任:
- プレゼンテーション(ダム)コンポーネント – UI に重点を置き、props 経由でデータを受信し、状態を管理することはほとんどありません。
- コンテナ(スマート)コンポーネント – ロジックを処理し、データを取得し、状態を管理し、プレゼンテーション コンポーネントをレンダリングします。
- 高階コンポーネント(HOC) – コンポーネントを受け取り、追加の動作を備えた拡張バージョンを返す関数。
- 純粋なコンポーネント – プロパティと状態を浅く比較することでパフォーマンスを最適化します。
- 関数コンポーネントとクラスコンポーネント – 読みやすさとパフォーマンスの点から、関数型コンポーネント (フック付き) が優先されるようになりました。
例:
A <UserProfile /> コンポーネントはプレゼンテーション用で、ユーザー情報を受け取り、 <UserProfileContainer /> データを取得し、そのライフサイクルを管理します。
13) React はエラー境界をどのように処理しますか? また、それが重要なのはなぜですか?
回答:
エラー境界 特別なReactコンポーネントをキャッチします Javaレンダリング、ライフサイクルメソッド、コンストラクタの実行中に、子コンポーネントツリー内の任意の場所でスクリプトエラーを検出します。特定のサブツリーに障害を分離することで、アプリ全体のクラッシュを防ぎます。実装には以下を使用できます。 componentDidCatch(error, info) の三脚と static getDerivedStateFromError() クラス コンポーネント内。
Advantages:
- フォールバック UI を表示して UI の安定性を維持します。
- 分析のためにエラーをキャプチャして記録します。
- カスケードアンマウントを防止します。
例:
class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError() { return { hasError: true }; }
render() { return this.state.hasError ? <h2>Something went wrong.</h2> : this.props.children; }
}
14) Reactフラグメントとは何ですか?ラッパーとどう違うのですか?要素ですか?
回答:
反応する 断片 (<></>) を使用すると、DOMに余分なノードを追加することなく、複数の要素をグループ化できます。これは、特にリスト、表、セマンティックHTMLなど、追加のラッパーによってレイアウトやアクセシビリティの問題が発生する可能性のある要素において、より明確な構造を実現するために不可欠です。ラッパーとは異なり、 <div>フラグメントは DOM にレンダリングされないため、パフォーマンスとセマンティクスの面で利点があります。
例:
return (
<>
<h1>Title</h1>
<p>Description</p>
</>
);
差分表:
| 因子 | 断片 | <div> ラッパー |
|---|---|---|
| DOM出力 | なし | 追加のノードを追加します |
| Use Case | 構造的グループ化 | スタイルまたはレイアウト |
| パフォーマンス | より良いです | わずかなオーバーヘッド |
15) パフォーマンスの最適化にはどの React Hook を使用しますか?また、その理由は何ですか?
回答:
パフォーマンスに敏感なReactコンポーネントは、多くの場合 メモ化フック の三脚と 遅延読み込み 冗長な作業を最小限に抑えるため。一般的なフックには次のようなものがあります。
useMemo→ 計算コストの高い結果をキャッシュします。useCallback→ 関数のアイデンティティの変更による不要な子のレンダリングを防止します。useTransition→ よりスムーズな UI を実現するために、緊急でない更新を延期します。useDeferredValue→ 即時のやり取りが終わるまで、負荷の高い計算を遅らせます。
例:
大規模なデータグリッド useMemo フィルタリングされた結果の場合、CPU 消費量を 50% 以上削減できます。
Advantages:
- 無駄なレンダリングを削減します。
- 負荷がかかっても UI の応答性を維持します。
デメリット:
- 依存関係の精度が必要です。不適切に管理されると、古いキャッシュのバグが発生する可能性があります。
16) React Portals とは何ですか? また、その利点は何ですか?
回答:
ポータル Reactコンポーネントが子要素を親階層外のDOMノードにレンダリングできるようにします。これは、オーバーフローやスタックのコンテキストから視覚的に「逃れる」必要があるモーダル、ツールチップ、ドロップダウンなどでよく使用されます。実装には ReactDOM.createPortal(child, container)、イベント バブリングの一貫性を維持するため、イベント ハンドラーは要素が元の階層内に残っているかのように動作します。
利点表:
| 利点 | 詳細説明 |
|---|---|
| 構造的独立性 | 親ツリーの外側をレンダリングする |
| CSS/スタッキングコントロール | 避ける overflow: hidden またはZインデックスの問題 |
| イベント伝播 | Reactの合成イベントは正しくバブルする |
| 再利用性 | グローバルオーバーレイに最適 |
例:
createPortal(<ModalContent />, document.getElementById('modal-root'));
17) React Router がページ間のナビゲーションと状態をどのように管理するかを説明します。
回答:
React Routerは、ブラウザのURLとUIを同期させる宣言型ルーティングライブラリです。 履歴API ページ全体をリロードせずにセッション履歴を操作する。コアコンセプトは以下のとおり。 ルート, リンク, アウトレット ネストされたルーティングのためのライブラリです。 動的ルート, URLパラメータ, ナビゲーションフック (useNavigate, useParams, useLocation)。React Router v6では、簡素化された構文とデータAPIが導入されました。 ローダ の三脚と アクション 機能により、SSR の統合と状態管理が改善されます。
例:
<Route path="/user/:id" element={<UserProfile />} />
メリット:
- 単一ページナビゲーションを有効にします。
- スクロールの位置と履歴を維持します。
- 遅延読み込みときれいに統合してパフォーマンスを向上します。
18) React アプリケーションで副作用を処理するさまざまな方法は何ですか?
回答:
副作用とは、コンポーネントのスコープ外(API呼び出し、DOM操作、サブスクリプションなど)に影響を与えるアクションを指します。主なツールには以下が含まれます。
useEffectレンダリング後のクライアント側の効果用。- イベントハンドラー ユーザー主導の効果を実現します。
- カスタムフック 効果ロジックを再利用する(例えば、
useFetch). - ミドルウェア (Redux Saga や Thunk など) 複雑な非同期オーケストレーション用。
- ReactクエリまたはSWR サーバーの状態と再取得ライフサイクルを自動的に管理します。
例:
A useEffect マウント時にデータを一度取得します:
useEffect(() => { fetchData(); }, []);
Advantages:
簡素化された非同期管理、改善されたカプセル化、およびより明確なライフサイクル制御。
19) React はフレームワークですか、それともライブラリですか? その違いを定義する要因について説明してください。
回答:
Reactは正式に ライブラリ本格的なフレームワークではなく、 ビューレイヤールーティング、データ取得、ビルド構造を強制することなく、レンダリング、状態、コンポーネントの抽象化を提供します。
比較表:
| 因子 | ライブラリ(React) | フレームワーク(Angular、Vue) |
|---|---|---|
| 対象領域 | ビューのレンダリング | 完全なMVCアーキテクチャ |
| 独断 | ロー | ハイ |
| 管理 | 開発者主導 | フレームワーク駆動型 |
| 柔軟性 | ハイ | 慣習によって制限される |
| 学習曲線 | 穏健派 | 複雑さにより高くなる |
React のエコシステム (Redux、Router、Query、Next.js) は、事実上「メタフレームワーク」を形成し、開発者が独自のアーキテクチャを構築できるようにするモジュール式の構成可能性を提供します。
20) React.lazy と Suspense はいつ使用すればよいですか? また、それぞれの利点は何ですか?
回答:
React.lazy 可能 コード分割 必要なときにのみコンポーネントを動的にロードすることで、 Suspense コンポーネントの準備が整うまでフォールバックUIを提供します。この組み合わせにより、初期読み込みのパフォーマンスとユーザーが感じる応答性が向上します。
例:
const Chart = React.lazy(() => import('./Chart'));
<Suspense fallback={<Loader />}>
<Chart />
</Suspense>
利点表:
| 利点 | 説明 |
|---|---|
| パフォーマンス | 必要に応じてコードをロードする |
| 操作方法 | 優雅な読み込みフォールバック |
| バンドルサイズ | 初期バンドルが小さい |
| 単純 | ネイティブReact API、最小限のセットアップ |
ベストプラクティス:
- 複数の遅延コンポーネントを 1 つの Suspense 境界にラップします。
- アクセシビリティのために意味のあるフォールバック インジケーターを使用します。
21) React Server Components (RSC) とは何か、またその利点について説明します。
回答:
React Server Components (RSC)は、コンポーネントを サーバーに送信せずにレンダリングする Javaクライアントへのスクリプトこれらはすべてサーバー上で実行され、データの取得、データベースからの読み取り、または I/O 操作を安全に実行してから、シリアル化された出力をクライアントにストリーミングします。
Advantages:
- バンドルサイズが小さい — サーバーのみのロジックにはクライアント JS はありません。
- 改良された性能 — サーバー側のデータ取得によりウォーターフォールが削減されます。
- セキュリティ — 機密コードはブラウザに届くことはありません。
- キャッシュの改善 — サーバー コンポーネントはエッジでキャッシュ可能です。
例:
A <ProductList /> サーバーコンポーネントはデータベースから直接データを取得し、結果を <ProductCard /> クライアント コンポーネント。
22) React の水和と調整の違いは何ですか?
回答:
どちらの用語も React による UI の更新に関係しますが、目的は異なります。
- 和解 仮想 DOM ツリーを以前のバージョンと比較して、最小限の DOM 更新セットを決定するプロセスです。
- 水分補給一方、Reactのイベントリスナーと内部構造を サーバーレンダリングされたHTML クライアント側では、静的マークアップを完全にインタラクティブなアプリに変換します。
比較表:
| 因子 | 和解 | 水分補給 |
|---|---|---|
| トリガー | クライアントの再レンダリング | 初期ページ読み込み(SSR) |
| 目的 | DOMを効率的に更新する | SSR HTMLをインタラクティブにする |
| 対象領域 | 仮想DOMの差分 | イベントバインディング + 状態の再接続 |
| 周波数 | 複数回 | SSRレンダリング後 |
例:
Next.jsアプリが事前にレンダリングされたHTMLを送信した後、React 水和物 これにより、コンポーネントはすべてを再レンダリングせずにイベントに応答します。
23) 同時レンダリングは React 18 以降のユーザー エクスペリエンスをどのように向上させますか?
回答:
同時レンダリングにより、Reactはユーザーの優先度に基づいてレンダリング作業を中断、一時停止、再開できます。これにより、負荷の高い計算や再レンダリング中にUIがフリーズするのを防ぎます。 useTransition の三脚と useDeferredValue この機能を活用して分離する 緊急アップデート (入力のように)から 緊急ではない (フィルタリングなど)
メリット:
- スムーズで応答性の高いインタラクション。
- メインスレッドのブロックを防ぐためのタイムスライス。
- 予測可能な優先順位付けにより、UX が向上します。
例:
const [isPending, startTransition] = useTransition(); startTransition(() => setFilteredList(filter(items, term)));
ここでは、React が緊急でない更新を同時にスケジュールするため、大規模なデータセットをフィルタリングする場合でも、入力は流動的に行われます。
24) React アプリケーションでテストを実行するさまざまな方法は何ですか?
回答:
Reactテストは以下のように分類できる。 単位, 統合, 端から端まで レベル。
試験方法表:
| タイプ | ツール | 目的 |
|---|---|---|
| ユニット | 冗談 | 分離された機能/コンポーネントをテストする |
| 統合 | Reactテストライブラリ | UIインタラクションと状態の変化をテストする |
| E2E | Cypress / 劇作家 | 実際のブラウザでユーザーフローをテストする |
ベストプラクティス:
- 好む Reactテストライブラリ Enzyme (モダン、DOM 指向) よりも優れています。
- モックAPIを使用する
msw(モックサービスワーカー)。 - 実装の詳細のテストは避け、動作に焦点を当てます。
例:
test('renders user name', () => {
render(<User name="Alice" />);
expect(screen.getByText(/Alice/)).toBeInTheDocument();
});
25) React で最も一般的に使用されるビルド ツールとバンドラーは何ですか。また、それらの違いは何ですか。
回答:
React は、それぞれ異なるユースケースに合わせて最適化された複数のバンドラーやコンパイラーと統合できます。
比較表:
| ツール | 特性 | 優位性 | デメリット |
|---|---|---|---|
| Webpack | 高度に構成可能 | 成熟した、プラグインが豊富 | 複雑なセットアップ |
| ネジ | ESMベースの超高速開発サーバー | インスタントHMR、最新の構文 | 限定的なレガシープラグインのサポート |
| 小包 | ゼロ設定 | 自動最適化 | Less フレキシブル |
| エスビルド | Goベースのコンパイラ | 非常に速い | エコシステムプラグインの減少 |
例:
現代のプロジェクトでは、 ネジ 開発スピードと エスビルド CI/CD パイプラインで効率的な本番ビルドを実現します。
26) Next.js は React の機能をどのように拡張しますか?
回答:
Next.jsは Reactフレームワーク ルーティング、SSR、静的生成のための独自のアーキテクチャを提供します。ハイブリッドレンダリングモデル、APIルート、エッジ対応のデプロイメント機能を導入しています。
Advantages:
- 内蔵 SSR/SSG/ISR サポート。
- アプリルーター React サーバー コンポーネントを使用します。
- 画像の最適化 の三脚と ミドルウェア パフォーマンスとセキュリティのため。
- サーバーレス関数用の簡単な API ルート。
例:
app/page.js SSR レンダリングされたページの場合; app/api/route.js サーバーエンドポイント用。
要約でNext.js を使用すると、最小限の構成で本番環境レベルの React アプリを作成できます。
27) React における一般的なパフォーマンスの落とし穴は何ですか? また、それを回避するにはどうすればよいですか?
回答:
一般的な React パフォーマンスの落とし穴は次のとおりです。
- 不要な再レンダリング — 使用して修正
React.memoまたはコンポーネントを分割します。 - インラインオブジェクト/配列の作成 - 使用
useMemo安定した参照用。 - 大きなリスト — ウィンドウ処理を実装する(
react-window,react-virtualized). - 重い計算 — メモ化するか、Web ワーカーにオフロードします。
- 文脈の過剰使用 — 頻繁な更新は深く伝播し、派生状態が優先されます。
例:
合格した場合 { a: 1 } メモ化されたコンポーネントにインラインで追加すると、親コンポーネントのレンダリングごとに再レンダリングされます。オブジェクトをメモ化することで修正できます。
パフォーマンスヒント表:
| 問題 | 最適化技術 |
|---|---|
| 再レンダリング | React.memo, useCallback |
| 高価な計算 | useMemo、Webワーカー |
| 大規模なデータセット | 仮想環境 |
| 頻繁なコンテキスト更新 | 状態をローカライズする |
28) useReducer と useState の違いを説明してください。
回答:
どちらのフックも状態を管理しますが、複雑さと制御が異なります。
useStateシンプルで分離された状態遷移に最適です。useReducer複雑な状態ロジックを集中管理し、 リデューサー関数、使用してdispatch予測可能な更新のためのアクション。
比較表:
| 因子 | 使用状態 | useReducer |
|---|---|---|
| 構文 | [value, setValue] |
[state, dispatch] |
| 複雑 | 簡単な拡張で | 中程度から複雑 |
| Use Case | 独立国家 | 関連またはネストされた状態 |
| デバッギング | Less 詳細 | ログに記録されたアクションで簡単 |
| 例: | フォームトグル | フォーム検証または複数ステップのフォーム |
例:
const [state, dispatch] = useReducer(reducer, { count: 0 });
dispatch({ type: 'increment' });
29) React アプリケーションでアクセシビリティ (a11y) を改善するにはどうすればよいですか?
回答:
アクセシビリティは、障がいのあるユーザーを含むすべてのユーザーがアプリを効果的に利用できることを保証します。Reactは、セマンティックマークアップとARIA属性を通じてアクセシビリティを促進します。
ベストプラクティス:
- セマンティックHTML (
<button>vs<div onClick>). - フォーカスを管理する
refの三脚とtabIndex. - 動的コンポーネントには ARIA ロールを使用します。
- 画像の色のコントラストと代替テキストを確保します。
- などのツールを活用する eslint-プラグイン-jsx-a11y の三脚と 斧の芯 監査のため。
例:
<button aria-label="Close dialog" onClick={closeModal}>×</button>
Advantages:
- より幅広い視聴者にリーチします。
- SEOの改善。
- WCAG 標準への準拠。
30) コード分割と遅延読み込みの違いと、それぞれをいつ使用するのかを説明してください。
回答:
どちらの手法もバンドルサイズとロードパフォーマンスを最適化しますが、 実行タイミング.
- コード分割 大きなバンドルを、個別にロードできる小さなチャンクに分割します。
- レイジーローディング 必要になるまでそれらのチャンクの読み込みを遅延します。
比較表:
| 因子 | コード分割 | 遅延読み込み |
|---|---|---|
| コードをチャンクに分割する | 必要に応じてチャンクをロードします | |
| ツール | Webpack、Vite | React.lazy、動的 import() |
| 目的 | バンドルサイズを最適化する | 実行時パフォーマンスの向上 |
| 実行 | ビルド時間 | ランタイム |
例:
const Settings = React.lazy(() => import('./Settings'));
これらの技術を組み合わせて使用すると、対話型になるまでの時間が短縮され、大規模なアプリの体感速度が向上します。
31) Render Props の概念と、それが Higher-Order Components (HOC) とどう違うのかを説明します。
回答:
レンダリングプロップ Reactのパターンで、コンポーネントが 小道具として機能する 何をレンダリングするかを指示します。これにより、コンポーネントロジックを複数のコンポーネント間で重複なく共有できます。
一方、HOCは、 ラップ コンポーネントを作成し、挿入されたプロパティや動作を含む拡張バージョンを返します。
比較表:
| 因子 | レンダリングプロップ | HOC |
|---|---|---|
| 製品の導入 | 子供としての機能 | 関数ラッピングコンポーネント |
| 構成 | インライン制御 | 宣言的ラッピング |
| 読みやすさ | より明確なことが多い | ラッパー地獄を引き起こす可能性がある |
| Use Case | 動的レンダリングロジック | 横断的な懸念 |
例:
<DataProvider render={data => <UserList users={data} />} />
Render Props は柔軟性が高く、HOC でよくある名前の衝突を回避します。
32) カスタムフックにはどのような種類があり、それぞれどのような利点がありますか?
回答:
カスタムフックは、状態、副作用、ユーティリティを組み合わせた再利用可能なロジックをカプセル化します。これにより、コードの再利用性、関心の分離、テスト可能性が向上します。
種類と例:
- 状態管理フック –
useToggle,useForm. - データ取得フック –
useFetch,useQuery. - UI/UXフック –
useWindowSize,useDarkMode. - 統合フック –
useLocalStorage,useMediaQuery. - パフォーマンスフック –
useDebounce,useThrottle.
Advantages:
- 集中化されたロジックの再利用。
- よりクリーンなコンポーネント。
- 独立したテスト。
例:
function useLocalStorage(key, initial) {
const [value, setValue] = useState(() => JSON.parse(localStorage.getItem(key)) || initial);
useEffect(() => localStorage.setItem(key, JSON.stringify(value)), [value]);
return [value, setValue];
}
33) React アプリケーションでメモリ リークをどのように処理しますか?
回答:
メモリリークは、マウント解除されたコンポーネントがリソースやサブスクリプションへの参照を保持している場合に発生します。メモリリークはパフォーマンスを低下させ、予期しない動作を引き起こします。
予防技術:
- クリーンアップ効果 in
useEffect: useEffect(() => { const id = setInterval(logData, 1000); return () => clearInterval(id); }, []); - 非同期呼び出しを中止する
AbortController. - 古いクロージャを保持しないようにする 古いプロパティ/状態を参照します。
- イベントまたはソケットの登録を解除する アンマウント時。
- Reactプロファイラーを使用する メモリのゆっくりとした増加を検出します。
例:
チャット アプリでは、ユーザーがチャット ルームから移動するときに常にソケット リスナーを切断します。
34) 大規模な React アプリケーションでフォームを管理するためのベストプラクティスは何ですか?
回答:
エンタープライズ規模の React アプリでフォームを管理するには、制御、パフォーマンス、保守性のバランスが必要です。
ベストプラクティス:
- 次のようなライブラリを使用します フォルミック, 反応フックフォームまたは 最終フォーム 検証およびフィールド登録用。
- ネストされたコンポーネントまたはコンテキストを使用して関連するフィールドをグループ化します。
- Apply スキーマ検証 (そう、ゾッド)一貫性のためです。
- 大量の検証や API チェックをデバウンスします。
- グローバルに必要な場合を除き、フォームの状態をローカライズされたままにします。
例:
React Hook Form は入力状態を分離することで再レンダリングを最小限に抑えます。
const { register, handleSubmit } = useForm();
<input {...register('email', { required: true })} />
35) React 開発で最も役立つデザインパターンはどれですか? また、それらの特徴は何ですか?
回答:
React は、保守可能でスケーラブルな UI アーキテクチャのためのさまざまなソフトウェア設計パターンに自然に適応します。
| パターン | 詳細説明 | 例: |
|---|---|---|
| コンテナプレゼンター | ロジック(コンテナ)とUI(プレゼンター)を分離する | データコンテナ → UIコンポーネント |
| 制御-非制御 | 状態とDOMを介してフォームデータを管理する | Formikと生の入力 |
| 複合コンポーネント | 親が子の構成を制御する | <Tabs><Tab /></Tabs> |
| プロバイダーパターン | コンテキスト経由で状態を共有する | テーマプロバイダー |
| フックパターン | ステートフルロジックを再利用する | useAuth, useFetch |
例:
A Tabs コンポーネントはコンテキストを公開するので <Tab> 子どもたちは自動的に登録する - 複合コンポーネント パターン。
36) React 18 と React 19 の主な違いは何ですか?
回答:
React 19 は、React 18 の並行処理基盤の上に、重要な新機能を搭載しています。
| 機能 | 反応18 | 反応19 |
|---|---|---|
| 同時レンダリング | 導入 | サスペンス性が向上しました |
| サーバーコンポーネント | 実験的 | 安定して統合された |
| アクションAPI | 無し | フォームアクションを処理するための新しい標準 |
| アセットの読み込み | マニュアル | 自動リソース読み込み |
| エラー処理の改善 | Basic | 境界フック付きの粒状 |
主なメリット:
React 19は、 より単純なデータ変更, 組み込みフォームアクション, 強化された非同期制御SSR と漸進的な水分補給をよりシームレスにします。
37) マイクロフロントエンドはどのように Architecture は React と統合されますが、その利点は何ですか?
回答:
マイクロフロントエンドは、大規模なウェブアプリを独立したデプロイ可能なフロントエンドモジュールに分割します。Reactエコシステムでは、各マイクロフロントエンドはスタンドアロンアプリであり、 モジュール連合, アイフレームまたは カスタムランタイムローダー.
Advantages:
- 独立した展開とスケーリング。
- 技術スタック全体にわたるチームの自律性。
- ビルド パイプラインの高速化。
例:
使い方 Webpack モジュール フェデレーションチームは、React コンポーネントをアプリ間で動的に公開できます。
exposes: { './NavBar': './src/NavBar' }
短所:
- 共有状態管理の複雑さ。
- 分離されたバンドルによるパフォーマンスのオーバーヘッド。
38) 本番環境で React アプリケーションをスケーリングする際に考慮する要素は何ですか?
回答:
React アプリケーションのスケーリングには、技術的、アーキテクチャ的、および運用上の考慮事項が含まれます。
キーファクタ:
- コード構造 — モジュール式コード共有のためにモノレポ (Nx/Turborepo) を採用します。
- 状態管理 — ローカル状態、グローバル状態、サーバー状態をセグメント化します。
- パフォーマンス — 遅延読み込み、メモ化、CDN キャッシュ。
- 監視 — エラーとメトリックには Sentry、Datadog、または LogRocket を使用します。
- テストとCI/CD — 自動化されたパイプラインと視覚的な回帰テスト。
例:
大規模な電子商取引プラットフォームでは、SSR 用の Next.js、予測可能な状態用の Redux Toolkit、および分離された垂直方向のマイクロフロントエンドを使用して、React アプリを拡張しています。
39) 非同期動作を使用する React コンポーネントをどのようにテストしますか?
回答:
非同期 React コンポーネントをテストするには、テスト ランナーとコンポーネントの状態更新間の同期が必要です。
ベストプラクティス:
-
waitFororfindBy*React テスト ライブラリ内のクエリ。 - フェッチ呼び出しやAPIをモックする
msw. - 好む 偽のタイマー (
jest.useFakeTimers()) タイムアウトベースのエフェクト。
例:
test('loads and displays data', async () => {
render(<UserList />);
expect(await screen.findByText('Alice')).toBeInTheDocument();
});
これにより、テストはアサーションを行う前に React の非同期更新を待機するようになります。
40) 大規模で保守可能な React プロジェクト構造をどのように設計するか説明してください。
回答:
スケーラブルな React プロジェクトでは、モジュール性、明確さ、チームのコラボレーションのバランスを取る必要があります。
推奨されるフォルダ構造:
src/ ├── components/ # Reusable UI elements ├── features/ # Feature-specific modules ├── hooks/ # Custom reusable hooks ├── context/ # Global providers ├── pages/ # Route-level views ├── services/ # API and utilities ├── assets/ # Static resources ├── tests/ # Unit & integration tests └── index.js
ベストプラクティス:
- パスエイリアスを使用した絶対インポートを使用します。
- 厳密なリンティングを維持します (ESLint + Prettier)。
- TypeScript 型安全性のためです。
- アトミック設計または機能ベースのスライスを使用してコンポーネント境界を強制します。
例:
現実世界では、「ユーザー」機能には次のようなものが含まれる可能性があります。 UserSlice.js, UserAPI.js, UserCard.jsx, User.test.js、すべて内 src/features/user/.
🔍 React.js 面接でよく聞かれる質問と、実際のシナリオと戦略的な回答
1) React.js における関数コンポーネントとクラスコンポーネントの主な違いは何ですか?
応募者に期待すること: 面接官は、React コンポーネント アーキテクチャと最新のベスト プラクティスに関する理解をテストしたいと考えています。
回答例:
「関数型コンポーネントはよりシンプルで、状態とライフサイクルメソッドの管理にフックに依存していますが、クラスコンポーネントは this ライフサイクルメソッド componentDidMount関数型コンポーネントは、コードの簡潔性、テストの容易さ、そしてReactのレンダリングプロセスの最適化によるパフォーマンスの向上といった理由から、現在では一般的に好まれています。
2) React で仮想 DOM がどのように機能するかを説明していただけますか?
応募者に期待すること: 面接官は、React のコアパフォーマンス メカニズムの理解度を評価したいと考えています。
回答例:
仮想DOMは、実際のDOMをメモリ上で表現したものです。コンポーネントの状態が変化すると、Reactはまず仮想DOMを更新し、「差分」と呼ばれるプロセスを用いて以前のバージョンと比較します。そして、実際のDOMのうち変更された部分のみを更新します。このアプローチにより、DOMの直接的な操作を最小限に抑え、パフォーマンスが向上します。
3) 大規模な React アプリケーションで状態を管理するにはどうすればよいでしょうか?
応募者に期待すること: 面接官は、状態管理のテクニックやツールに関する経験について知りたいと思っています。
回答例:
大規模なアプリケーションでは、ReduxやZustandなどの集中型状態管理ライブラリを使用することが多いです。Reduxは予測可能なデータフローを提供し、タイムトラベルデバッグツールによってデバッグを容易にします。よりシンプルなアプリケーションでは、不要な複雑さを避けるためにContext APIとフックを使用することを好みます。
4) React のパフォーマンスを最適化したときのことを説明しましょう。
応募者に期待すること: 面接官は、パフォーマンスの最適化に関する実践的な経験を理解したいと考えています。
回答例:
「以前の仕事では、アプリケーションは不必要な状態変化のために過度に再レンダリングされていました。私は React.memo と useCallback 不要な再レンダリングを防ぐためのフックを追加しました。また、React Profiler を使用してパフォーマンスを分析し、メモ化が必要なコンポーネントを特定しました。これにより、レンダリング時間が約30%短縮されました。」
5) React では副作用をどのように処理しますか?
応募者に期待すること: 面接官は、フックとライフサイクル管理に関する理解度を評価したいと考えています。
回答例:
「API呼び出しやDOM操作などの副作用は、 useEffect フックです。フックを使うことで依存関係を指定でき、依存関係が変化した場合にのみエフェクトが実行されることを保証できます。これにより、予測可能な動作を維持し、無限ループを回避できます。
6) React プロジェクトで直面した困難なバグとその解決方法について教えてください。
応募者に期待すること: 面接官はあなたの問題解決能力とデバッグ能力を評価したいと考えています。
回答例:
以前の職位で、状態の更新がUIに反映されないというバグに遭遇しました。調査の結果、状態オブジェクトのコピーを作成せずに直接変更していたことが原因であることがわかりました。そこで、不変の更新を使用するようにコードをリファクタリングしたところ、問題は解決し、データの一貫性が向上しました。
7) React アプリケーションでフォーム検証をどのように処理しますか?
応募者に期待すること: 面接官は、ユーザー入力の検証を実装する方法を理解しているかどうかを確認したいと考えています。
回答例:
「私は通常、フォーム入力の管理には制御されたコンポーネントを使用し、検証にはFormikやReact Hook Formなどのライブラリを組み合わせています。これらのツールは、エラー処理、フォームの状態管理、Yupなどのサードパーティ製検証ライブラリとの統合を簡素化します。」
8) React プロジェクトに取り組んでいるときに、バックエンド開発者と協力しなければならなかった状況について説明してください。
応募者に期待すること: 面接官はあなたのチームワークとコミュニケーション能力を評価したいと考えています。
回答例:
前職では、バックエンド開発者と緊密に連携し、ダッシュボードアプリケーション用のREST APIを設計しました。開発初期段階でデータ形式とエンドポイントについて合意しました。また、バックエンドの構築中にフロントエンド開発を継続できるよう、モックレスポンスを作成し、後々のスムーズな統合を実現しました。
9) React コンポーネントが再利用可能かつ保守可能であることをどのように確認しますか?
応募者に期待すること: 面接官は、コンポーネントの設計とスケーラビリティに対するアプローチについて知りたいと思っています。
回答例:
「私は、一つの役割を担う、小さくて焦点を絞ったコンポーネントを構築するという原則に従っています。また、柔軟性を高めるためにpropsを活用し、CSS-in-JSやstyled-componentsを使ってスタイルをモジュール化しています。これにより、プロジェクト全体でコンポーネントを簡単に再利用・保守できるようになります。」
10) React.js のトレンドやベストプラクティスを常に把握するにはどうすればよいでしょうか?
応募者に期待すること: 面接官は、継続的な学習に対するあなたの取り組みを評価したいと考えています。
回答例:
Reactの公式ドキュメントとコミュニティブログをフォローして最新情報を常に把握しています。また、React ConfなどのReactカンファレンスの講演を視聴したり、『React Podcast』などのポッドキャストを聴いたりしています。これらのリソースは、並列レンダリングやサーバーコンポーネントなどの新機能に関する最新情報を常に把握するのに役立ちます。

