React Native シニア面接質問と回答

Milad Bonakdar
著者
シニアReact Native面接に向けて、アーキテクチャ、FlatList性能、ネイティブモジュール、状態管理、テスト、本番運用の判断を整理します。
はじめに
シニアReact Native面接では、構文だけを問われることはほとんどありません。アプリ設計、パフォーマンス計測、ネイティブ連携、状態とデータの境界、テスト戦略、リリース品質、実際のプロダクト制約の中でどうトレードオフを説明するかが見られます。
このガイドでは、シニアらしい簡潔な回答を練習できます。まず自分ならどう判断するかを述べ、その理由、リスク、代替策を説明しましょう。たとえばFlatListなら「最適化できます」で終わらせず、空白領域、レンダリングバッチ、メモ化した行、安定したkey、固定高さや重い画像が原因のときの設計変更まで説明します。
高度なReactとHooks (5つの質問)
1. useMemoとuseCallbackについて説明してください。いつ使用すべきですか?
回答: これらのHooksはどちらも、値や関数をメモ化することでパフォーマンスを最適化します。
- useMemo: 計算された値(コストのかかる計算)をメモ化します。
- useCallback: 関数参照をメモ化します(再作成を防ぎます)。
- いつ使用すべきか: パフォーマンスの問題が発生した場合のみ。時期尚早な最適化は、コードを読みにくくする可能性があります。
希少性: 非常に一般的 難易度: 中
2. useRefとは何ですか?また、そのユースケースは何ですか?
回答:
useRefは、再レンダリングを引き起こすことなく、レンダリング間で永続化される可変の参照を作成します。
- ユースケース:
- DOM/ネイティブ要素へのアクセス
- 再レンダリングをトリガーせずに可変の値を格納
- 以前の値を保持
- タイマー/インターバルの格納
希少性: 一般的 難易度: 中
3. カスタムHooksについて説明し、いつ作成すべきかを説明してください。
回答: カスタムHooksは、再利用可能な状態を持つロジックを個別の関数に抽出します。
- 利点: コードの再利用、関心の分離、簡単なテスト
- 規則: "use"で始まる必要があります。
希少性: 一般的 難易度: 中
4. React Contextとは何ですか?また、いつ使用すべきですか?
回答: Contextは、propsを掘り下げることなく、コンポーネントツリー全体にデータを渡す方法を提供します。
- ユースケース: テーマ、認証、言語設定
- 注意: 注意して使用しないと、不要な再レンダリングが発生する可能性があります。
希少性: 非常に一般的 難易度: 中
5. useEffectとuseLayoutEffectの違いについて説明してください。
回答: どちらも副作用を実行しますが、タイミングが異なります。
- useEffect: レンダリングが画面に描画された後、非同期で実行されます。
- useLayoutEffect: 描画前に同期的に実行されます(視覚的な更新をブロックします)。
- useLayoutEffectを使用する場合: DOMを測定する必要がある場合、または視覚的なちらつきを防ぐ必要がある場合。
希少性: 中 難易度: 難しい
状態管理 (4つの質問)
6. Reduxとそのコア原則について説明してください。
回答: Reduxは、JavaScriptアプリケーションのための予測可能な状態コンテナです。
- コア原則:
- 単一の信頼できる情報源(1つのストア)
- 状態は読み取り専用(変更するにはアクションをディスパッチ)
- 純粋関数(リデューサー)で変更
希少性: 非常に一般的 難易度: 難しい
7. Redux Toolkitとは何ですか?また、どのようにReduxを簡素化しますか?
回答: Redux Toolkitは、Reduxロジックを記述するための公式推奨方法です。
- 利点:
- ボイラープレートの削減
- 不変アップデートのためのImmerが組み込まれています
- Redux Thunkが含まれています
- TypeScriptのサポートが向上
希少性: 一般的 難易度: 中
8. 状態管理のためのReduxの代替手段は何ですか?
回答: 複数の状態管理ソリューションが存在します。
- Context API + useReducer: 組み込み、シンプルなアプリケーションに適しています
- MobX: Observableベース、ボイラープレートの削減
- Zustand: 最小限、フックベース
- Recoil: Facebookによる、アトムベース
- Jotai: プリミティブアトム
希少性: 一般的 難易度: 中
9. Reduxで副作用をどのように処理しますか?
回答: 非同期操作にはミドルウェアを使用します。
- Redux Thunk: 関数を返す関数
- Redux Saga: ジェネレーターベース、より強力
- Redux Observable: RxJSベース
希少性: 一般的 難易度: 難しい
パフォーマンスの最適化 (5つの質問)
10. FlatListのパフォーマンスをどのように最適化しますか?
回答: 複数の戦略でFlatListのスクロールを改善できます。
keyExtractorを使用: 一意のキーを提供します。getItemLayout: 固定高さのアイテムの測定をスキップします。removeClippedSubviews: 画面外のビューをアンマウントします(Android)。maxToRenderPerBatch: バッチサイズを制御します。windowSize: レンダリングされるウィンドウを制御します。initialNumToRender: 最初にレンダリングするアイテム数。renderItemをメモ化: 不要な再レンダリングを防ぎます。
希少性: 非常に一般的 難易度: 中
11. React Nativeブリッジとは何ですか?また、パフォーマンスにどのように影響しますか?
回答: ブリッジは、JavaScriptとネイティブコード間の通信レイヤーです。
- 仕組み:
- JavaScriptは別のスレッドで実行されます。
- ネイティブモジュールはネイティブスレッドで実行されます。
- ブリッジはそれらの間でデータをシリアル化します(JSON)。
- パフォーマンスへの影響:
- ブリッジ通信は非同期です。
- シリアル化のオーバーヘッド
- 頻繁な通信でボトルネックになる可能性があります。
- 解決策:
- ブリッジの交差を最小限に抑えます。
- バッチ操作
- ネイティブアニメーションを使用します(ブリッジをバイパスします)。
- 新しいアーキテクチャ(JSI)はブリッジを削除します。
希少性: 一般的 難易度: 難しい
12. 不要な再レンダリングをどのように防ぎますか?
回答: 複数の手法で無駄なレンダリングを防ぎます。
- React.memo: コンポーネントをメモ化します。
- useMemo/useCallback: 値/関数をメモ化します。
- 適切なキーprops: Reactが変更を識別するのに役立ちます。
- インラインオブジェクト/配列を避けます: 新しい参照を作成します。
- コンポーネントを分割します: より小さく、焦点を絞ったコンポーネント。
希少性: 非常に一般的 難易度: 中
13. React Nativeで画像をどのように最適化しますか?
回答: 画像の最適化はパフォーマンスにとって非常に重要です。
- 画像のサイズを変更: 適切な寸法を使用します。
- 画像をキャッシュ: react-native-fast-imageなどのライブラリを使用します。
- 遅延読み込み: 必要に応じて画像を読み込みます。
- プログレッシブ読み込み: 最初にプレースホルダーを表示します。
- WebP形式を使用: より良い圧縮。
希少性: 一般的 難易度: 中
14. パフォーマンスプロファイリングにはどのようなツールを使用しますか?
回答: 複数のツールがパフォーマンスの問題を特定するのに役立ちます。
- React DevTools Profiler: コンポーネントのレンダリング時間
- Flipper: デバッグおよびプロファイリングツール
- Performance Monitor: 組み込みのFPSモニター
- Systrace: Androidのパフォーマンストレース
- Instruments: iOSのパフォーマンスプロファイリング
希少性: 一般的 難易度: 中
ネイティブモジュールとプラットフォーム固有 (4つの質問)
15. React Nativeでネイティブモジュールをどのように作成しますか?
回答: ネイティブモジュールを使用すると、プラットフォーム固有のコードを使用できます。
希少性: 中 難易度: 難しい
16. プラットフォーム固有のコードをどのように処理しますか?
回答: プラットフォーム固有のコードには複数のアプローチがあります。
- Platformモジュール: 実行時にプラットフォームを確認します。
- プラットフォーム固有のファイル:
.ios.jsおよび.android.js - Platform.select: プラットフォームに基づいて値を選択します。
希少性: 非常に一般的 難易度: 簡単
17. 新しいアーキテクチャ(FabricとTurboModules)とは何ですか?
回答: 新しいアーキテクチャは、React Nativeのパフォーマンスを向上させます。
- Fabric: 新しいレンダリングシステム
- 同期レイアウト
- ネイティブビューとのより良い相互運用性
- 型安全性
- TurboModules: 新しいネイティブモジュールシステム
- 遅延読み込み
- JSI(JavaScript Interface)- C++との直接通信
- ブリッジシリアル化なし
利点:
- より速い起動
- より低いメモリ使用量
- 同期的なネイティブ呼び出し
- より良い型安全性
希少性: 中 難易度: 難しい
18. React Nativeでディープリンクをどのように処理しますか?
回答: ディープリンクを使用すると、URLから特定の画面を開くことができます。
希少性: 一般的 難易度: 中
テスト (3つの質問)
19. React Nativeコンポーネントをどのようにテストしますか?
回答: JestやReact Native Testing Libraryなどのテストライブラリを使用します。


