React Native 0.87とSwiftPM 2026: iOS最新ビルド環境と面接対策

React Native 0.87のSwift Package Manager対応、CocoaPodsからの移行方法、Strict TypeScript API、Metro 0.87の高速化について詳しく解説します。

React Native 0.87とSwiftPM 2026: iOS最新ビルド環境と面接対策

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を評価するチームは、移行を確定する前にブランチでプロトタイプを作成し、完全な依存関係ツリーをテストする必要があります。

React Nativeの面接対策はできていますか?

インタラクティブなシミュレーター、flashcards、技術テストで練習しましょう。

破壊的変更: iOS名前空間付きヘッダーインポート

React Native 0.87は新しいXCFrameworks(ReactNativeHeaders.xcframeworkおよびReactNativeDependenciesHeaders.xcframework)を同梱しています。ベアフォームのアングルインクルードを使用しているネイティブモジュールは、React/名前空間プレフィックスを追加する必要があります。

AppDelegate.mobjective-c
// 0.87以前 - ベアインクルード
#import <RCTAppDelegate.h>
#import <RCTBridge.h>
#import <RCTRootView.h>

// 0.87以降 - 名前空間付きインクルード
#import <React/RCTAppDelegate.h>
#import <React/RCTBridge.h>
#import <React/RCTRootView.h>

この変更はCocoaPodsビルドとSwiftPMビルドの両方に適用されます。カスタムネイティブモジュールを持つプロジェクトは、アップグレード前にすべてのヘッダーインポートを更新する必要があります。

Strict TypeScript API: 新しいデフォルトJavaScriptインターフェース

0.80でプレビューされたStrict TypeScript APIが、0.87でデフォルトになりました。型はReact Nativeのソースコードから直接生成されるようになり、TypeScript定義と実際のランタイム動作の間のドリフトが解消されます。

component-refs.tsxtypescript
import { useRef } from 'react';
import { View, TextInput, ViewInstance, TextInputInstance } from 'react-native';

export function FormComponent() {
  // 新しい専用ref型がジェネリックRefObject<T>を置き換え
  const containerRef = useRef<ViewInstance>(null);
  const inputRef = useRef<TextInputInstance>(null);

  const focusInput = () => {
    // 型安全なメソッドアクセス
    inputRef.current?.focus();
  };

  return (
    <View ref={containerRef}>
      <TextInput ref={inputRef} placeholder="Email" />
    </View>
  );
}

移行時に注意が必要な3つの破壊的な型変更があります。

  1. ディープインポートのブロック: react-native/Libraries/*パスは型エラーを生成するようになりました。すべてのエクスポートはルートのreact-nativeパッケージから取得する必要があります。

  2. ref型の更新: ViewInstanceTextInputInstanceがジェネリックref型を置き換えます。*Properties型エイリアスは*Propsに置き換えられて削除されました。

  3. useColorScheme変更: 以前の'unspecified'文字列値の代わりにColorSchemeName | nullを返すようになりました。

移行期間中のStrict TypeScriptオプトアウト

移行により多くの時間を必要とするチームは、React Native 0.88までレガシーディープインポートを復元できます。

tsconfig.jsonjson
{
  "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 minCompileSdk34
Android compileSdk37
Android Gradle Plugin9.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代替
InteractionManagerrequestIdleCallback
Modal animatedプロパティデフォルトのトランジション動作を使用
NativeMethodsHostInstance
useTurboModulesフラグ常に有効、フラグ削除
TouchableルートエクスポートViewPropsを直接拡張
react-native/rn-get-polyfills@react-native/js-polyfills

将来の削除を対象とした追加の非推奨には、ImageBackground(絶対位置指定のImageを持つViewを使用)、DrawerLayoutAndroidreact-native-drawer-layoutを使用)、react-native/Libraries/Core/InitializeCorereact-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面接対策の詳細については、ネイティブモジュール詳解テスト戦略の質問バンクを参照してください。

React Nativeの面接対策はできていますか?

インタラクティブなシミュレーター、flashcards、技術テストで練習しましょう。

React Native 0.87プロジェクトのアップグレード戦略

React Native 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ガイドを参照してください。

今すぐ練習を始めましょう!

面接シミュレーターと技術テストで知識をテストしましょう。

今日のチャレンジ

React Native のバグを見つけられますか

実際のコード、隠れたバグ、1日1回。アカウントなしで試せます。

Anthony Fillion-Maillet

執筆

Anthony Fillion-Maillet

SharpSkill 創業者

10 年以上フルスタック開発に携わっています。SharpSkill を運営し、ここで公開される内容に責任を負っています。

2026年9月3日 更新

共有

関連記事