# React Native 0.87とSwiftPM 2026: iOS最新ビルド環境と面接対策 > React Native 0.87のSwift Package Manager対応、CocoaPodsからの移行方法、Strict TypeScript API、Metro 0.87の高速化について詳しく解説します。 - Published: 2026-09-03 - Updated: 2026-09-03 - Author: Anthony Fillion-Maillet - Reading time: 5 min --- 2026年8月11日にリリースされたReact Native 0.87は、iOSビルドにおけるSwift Package Manager(SwiftPM)の実験的サポートを導入しました。この機能により、React NativeプロジェクトからCocoaPodsを排除する第一歩が踏み出されています。本リリースではStrict TypeScript APIがデフォルト化され、Metro 0.87によるソースマップ生成が2倍高速化され、最小ツールチェーン要件がNode.js 22、Kotlin 2.0、Android compileSdk 37に引き上げられています。 > **SwiftPMセットアップコマンド** > > CocoaPodsの統合解除後、`npx react-native spm --deintegrate`を1回実行するだけで設定が完了します。以降のビルドでは`pod install`なしにネイティブ依存関係が自動リンクされます。 ## Swift Package ManagerがiOS依存関係管理でCocoaPodsを置き換え React Native 0.87のSwiftPMサポートはオプトイン方式の実験的機能です。プロダクション環境ではCocoaPodsが引き続きデフォルトの依存関係マネージャーとして推奨されています。SwiftPMパスは、React Nativeが既に公開しているプリビルト済みXCFrameworksを利用するため、追加のバイナリダウンロードは不要です。 主なメリットは、SwiftPMベースのプロジェクトではXcodeのみが必要になることです。開発マシンやCIパイプラインにRuby、Bundler、CocoaPodsをインストールする必要がなくなります。 ```bash # ios-swiftpm-setup.sh # ステップ1: iOSディレクトリに移動 cd ios # ステップ2: CocoaPodsを統合解除しSwiftPM参照を生成 npx react-native spm --deintegrate # ステップ3: Xcodeでプロジェクトを開きビルド open MyApp.xcworkspace ``` `spm --deintegrate`コマンドは、プロジェクトファイルを置き換えるのではなく、既存の`.xcodeproj`にSwiftパッケージ参照を挿入します。コード署名設定、ビルドフェーズ、機能設定はそのまま維持されます。変更を元に戻す場合は`npx react-native spm deinit`を実行します。 ## pod install不要のSwiftPMオートリンク機構 初期セットアップ後、依存関係の変更は自動リンクをトリガーします。npmまたはyarnでネイティブパッケージをインストールまたは削除し、ビルドを実行するだけです。プロジェクトは変更を検出し、Xcodeビルドフェーズ中にオートリンクを再実行します。 ```bash # dependency-workflow.sh # ネイティブ依存関係をインストール npm install react-native-reanimated # ビルドが自動リンクをトリガー npx react-native run-ios # pod installは不要 ``` 新規クローンおよびCI環境では、最初のビルド前に`npx react-native spm`を1回実行します。これにより`Package.swift`ファイルが生成され、Swiftパッケージ依存関係が解決されます。 ## SwiftPMの制限事項とプロダクション対応状況 0.87のSwiftPMサポートには、導入判断に影響する重要な制限事項があります。 | 制限事項 | 影響 | |----------|------| | コミュニティライブラリサポート | 各ライブラリが`Package.swift`ファイルを同梱する必要あり | | コマンドの安定性 | フラグと生成レイアウトは0.88以降で変更される可能性あり | | CI設定 | ビルド前に`npx react-native spm`ステップが必要 | | ドキュメント | トラブルシューティングリソースが限定的 | プロダクションアプリケーションには、CocoaPodsが引き続き推奨パスです。SwiftPMを評価するチームは、移行を確定する前にブランチでプロトタイプを作成し、完全な依存関係ツリーをテストする必要があります。 ## 破壊的変更: iOS名前空間付きヘッダーインポート React Native 0.87は新しいXCFrameworks(`ReactNativeHeaders.xcframework`および`ReactNativeDependenciesHeaders.xcframework`)を同梱しています。ベアフォームのアングルインクルードを使用しているネイティブモジュールは、`React/`名前空間プレフィックスを追加する必要があります。 ```objective-c // AppDelegate.m // 0.87以前 - ベアインクルード #import #import #import // 0.87以降 - 名前空間付きインクルード #import #import #import ``` この変更はCocoaPodsビルドとSwiftPMビルドの両方に適用されます。カスタムネイティブモジュールを持つプロジェクトは、アップグレード前にすべてのヘッダーインポートを更新する必要があります。 ## Strict TypeScript API: 新しいデフォルトJavaScriptインターフェース 0.80でプレビューされたStrict TypeScript APIが、0.87でデフォルトになりました。型はReact Nativeのソースコードから直接生成されるようになり、TypeScript定義と実際のランタイム動作の間のドリフトが解消されます。 ```typescript // component-refs.tsx import { useRef } from 'react'; import { View, TextInput, ViewInstance, TextInputInstance } from 'react-native'; export function FormComponent() { // 新しい専用ref型がジェネリックRefObjectを置き換え const containerRef = useRef(null); const inputRef = useRef(null); const focusInput = () => { // 型安全なメソッドアクセス inputRef.current?.focus(); }; return ( ); } ``` 移行時に注意が必要な3つの破壊的な型変更があります。 1. **ディープインポートのブロック**: `react-native/Libraries/*`パスは型エラーを生成するようになりました。すべてのエクスポートはルートの`react-native`パッケージから取得する必要があります。 2. **ref型の更新**: `ViewInstance`と`TextInputInstance`がジェネリックref型を置き換えます。`*Properties`型エイリアスは`*Props`に置き換えられて削除されました。 3. **useColorScheme変更**: 以前の`'unspecified'`文字列値の代わりに`ColorSchemeName | null`を返すようになりました。 ## 移行期間中のStrict TypeScriptオプトアウト 移行により多くの時間を必要とするチームは、React Native 0.88までレガシーディープインポートを復元できます。 ```json // tsconfig.json { "extends": "@react-native/typescript-config", "compilerOptions": { "customConditions": ["react-native", "react-native-legacy-deep-imports"] } } ``` このエスケープハッチはReact Native 0.89で削除されます。プロジェクトはそのリリース前に移行を優先する必要があります。 ## Metro 0.87: ソースマップ2倍高速化とメモリ50%削減 Metroバンドラーバージョン0.87は、開発ワークフローとReact Native DevToolsの起動時間に影響する大幅なパフォーマンス改善を同梱しています。 ソースマップ生成は、最適化された文字列処理により2倍高速化されました。DevToolsは、開発ビルド中にソースマップがより効率的に生成されるため、より速く読み込まれるようになりました。 メモリ使用量は、より効率的なソースマップストレージにより50%削減されました。これは、長時間の開発セッション中にMetroが大量のRAMを消費していた大規模コードベースにとって重要です。 その他のMetro変更点: - TypeScript設定ファイル(`metro.config.mts`)の安定サポート - CommonJSと並行したESM設定ファイルサポート - リゾルバーでのパッケージ自己解決 - `.es6`ファイル拡張子とYAML設定ファイルのサポート廃止 ## React Native 0.87の最小ツールチェーン要件 本リリースでは、ツールチェーン全体の最小バージョン要件が引き上げられています。CIパイプラインと開発環境は、アップグレード前に更新が必要です。 | 要件 | バージョン | |------|----------| | Node.js | ≥ 22.13.0 | | Kotlin | ≥ 2.0(バンドル版: 2.2.0) | | Android minCompileSdk | 34 | | Android compileSdk | 37 | | Android Gradle Plugin | 9.x | AGP 9互換性の問題については、`android/gradle.properties`にオプトアウトを追加します。 ```properties # android/gradle.properties # AGP 9移行のための一時的なオプトアウト android.builtInKotlin=false android.newDsl=false ``` ## React Native 0.87で削除されたAPI 本リリースでは、いくつかの非推奨APIが削除されています。これらのAPIを使用しているプロジェクトは、アップグレード前にリファクタリングが必要です。 | 削除されたAPI | 代替 | |---------------|------| | `InteractionManager` | `requestIdleCallback` | | `Modal` animatedプロパティ | デフォルトのトランジション動作を使用 | | `NativeMethods`型 | `HostInstance` | | `useTurboModules`フラグ | 常に有効、フラグ削除 | | `Touchable`ルートエクスポート | `ViewProps`を直接拡張 | | `react-native/rn-get-polyfills` | `@react-native/js-polyfills` | 将来の削除を対象とした追加の非推奨には、`ImageBackground`(絶対位置指定の`Image`を持つ`View`を使用)、`DrawerLayoutAndroid`([react-native-drawer-layout](https://github.com/react-navigation/react-navigation/tree/main/packages/drawer)を使用)、`react-native/Libraries/Core/InitializeCore`(`react-native/setup-env`を使用)が含まれます。 ## シニア開発者向けReact Native 0.87面接質問 以下の質問は、React Nativeのメジャーリリース後のシニアモバイル開発者面接で出題されます。SwiftPMサポートとStrict TypeScript APIの背後にあるアーキテクチャ上の決定を理解することで、フレームワークレベルの知識を示すことができます。 **Q: なぜReact Native 0.87はCocoaPodsを即座に置き換えるのではなく、SwiftPMを実験的機能として導入したのですか?** SwiftPMサポートは、コミュニティライブラリが`Package.swift`ファイルを同梱することに依存しています。中央の`Podspec`レジストリが存在するCocoaPodsとは異なり、SwiftPMでは各ライブラリ作者がネイティブSwiftパッケージ設定を追加する必要があります。実験フェーズにより、CocoaPodsがプロダクションアプリで安定したまま、エコシステムは徐々にSwiftPMを採用できます。さらに、CLIコマンドと生成されるプロジェクトレイアウトは、安定化前に開発者のフィードバックに基づいて変更される可能性があります。 **Q: Strict TypeScript APIは、手動で管理された型定義では解決できなかったどのような問題を解決しますか?** 手動で管理された型定義は、リリース間でランタイム動作からドリフトします。関数シグネチャを変更したりパラメータを追加したりする内部リファクタリングは、型にすぐに反映されない可能性があり、TypeScriptがキャッチすべきランタイムクラッシュを引き起こします。Strict APIはソースコードから直接型を生成し、型を願望的なものではなく権威的なものにします。また、不安定な内部APIにアクセスするディープインポートをブロックし、それらの内部が変更された際の破損を防ぎます。 **Q: SwiftPMオートリンクはReact NativeのCocoaPodsオートリンクとどのように異なりますか?** CocoaPodsオートリンクは`pod install`中に実行され、開発者は依存関係変更後にこれを実行することを覚えておく必要があります。SwiftPMオートリンクはXcodeビルドフェーズ中に自動的に実行されます。ビルドシステムは依存関係の変更を検出し、手動介入なしでパッケージマニフェストを再生成します。これにより、開発者が変更をプルした後に`pod install`を実行し忘れる「自分のマシンでは動く」問題の一般的な原因が排除されます。 React Native面接対策の詳細については、[ネイティブモジュール詳解](/technologies/react-native/interview-questions/rn-native-modules)と[テスト戦略](/technologies/react-native/interview-questions/rn-testing)の質問バンクを参照してください。 ## React Native 0.87プロジェクトのアップグレード戦略 [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/)は、現在のプロジェクトテンプレートと0.87の間のdiffを生成します。このdiffにより、変更が必要なファイルが正確に表示されます。 以下の移行ステップを優先してください。 1. **Node.jsを22.13.0以上に更新**し、CI環境が一致することを確認 2. **TypeScriptコンパイルを実行**してディープインポート違反を特定 3. **ref型を更新**してジェネリックから専用インスタンス型に変更 4. **iOSヘッダーインポートを更新**して名前空間形式に変更 5. **完全なネイティブ依存関係ツリーをテスト**してからSwiftPMを有効化 Expoプロジェクトの場合、React Native 0.87は`expo@canary`リリースで利用可能です。プロダクションExpoプロジェクトは安定版SDKリリースを待つ必要があります。 ## 0.87 SwiftPMサポートがiOSビルド時間に与える影響 SwiftPMは開発ワークフローから`pod install`を排除しますが、初期プロジェクトセットアップにはより多くの時間が必要です。`npx react-native spm`コマンドはソースからSwiftパッケージを解決するため、プリビルトCocoaPodsバイナリをダウンロードするよりも時間がかかります。 後続のビルドは、Xcodeのインクリメンタルパッケージ解決の恩恵を受けます。変更されたパッケージのみが再取得されます。依存関係の変更が頻繁なチームにとって、このインクリメンタルアプローチは繰り返しの`pod install`サイクルよりも速い可能性があります。 CI最適化は2つのアプローチで異なります。CocoaPodsは`Pods/`ディレクトリを効果的にキャッシュします。SwiftPMはXcodeのderived dataを通じてキャッシュするため、異なるキャッシュキー戦略が必要です。CIパイプラインを移行するチームは、特定の依存関係セットで両方のアプローチをベンチマークする必要があります。 関連するiOSビルド最適化テクニックについては、Hermes V1とブリッジレスモードのパフォーマンス特性をカバーする[React Native New Architectureガイド](/blog/react-native/react-native-new-architecture-hermes-v1-bridgeless)を参照してください。 --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/ja/blog/react-native/react-native-087-swiftpm-ios-build-interview-questions