Expo vs Bare React Native 比較

Node.js LTSでセットアップでき、CNGにより後戻り可能な、マネージドなReact Nativeフレームワーク

VS
Bare React Native

ネイティブツールチェーンを完全にコントロールできる、コアReact Nativeのセットアップ

16 分で読了Cross-Platform

クイック結論

2026年の既定の答えはExpo + CNGです。`expo prebuild`によってネイティブフォルダを再生成できるため、「eject」はもはや後戻りできない一方通行の扉ではなくなりました。config pluginシステムがネイティブ設定の大部分をカバーし、EAS Buildの無料プランは小〜中規模プロジェクトに十分です。Bare React Nativeを選ぶ理由は限定的ですが実在します:EASが対応していない特殊なツールチェーン、オンプレミスCIの必須要件、あるいは非常に稀なネイティブSDKです。この3つに該当しないならExpoから始めましょう。

ExpoBare React Native
結論をすべて読む

スコア比較

グラフを読み込み中...

詳細スコア

詳細スコア: Expo Bare React Native — カテゴリー別10点満点のスコア
カテゴリーExpoBare React Native
パフォーマンス
8/10
8/10
学習のしやすさ
9/10
6/10
エコシステム
8/10
8/10
コミュニティ
8/10
8/10
求人市場
7/10
8/10
将来性
8/10
7/10

長所と短所

Expo

長所

  • セットアップに必要なのはNode.js LTSのみ — Xcode/Android Studioなしで、Expo Go/Snackを使って即座にテスト
  • CNG(`expo prebuild`)によりネイティブフォルダを再生成できる — 「eject」はもはや一方通行の扉ではない
  • config pluginシステムがネイティブプロジェクトをプログラム的かつ再現可能な形で設定する
  • EAS Updateによりネイティブ層と切り離された、即座のOTA JSアップデート
  • EAS Build Freeプランは月15+15ビルドと1,000 MAUのアップデートを含む — 小規模プロジェクトにコスト0で始められる
  • EAS WorkflowsによりGitHubイベント/cronトリガーで、app configから自動的にネイティブビルドが実行される
  • バージョンアップグレードはnpm依存関係の更新+`prebuild --clean`と同じくらいシンプル
  • React Foundationの創設メンバーとしてRNエコシステムと緊密に連携

短所

  • Expo SDKはRNコアより1バージョン遅れる(SDK 57 → RN 0.86であってRN 0.87ではない) — 最新のRN機能に即座にアクセスできない
  • Expo Go(iOS)は2026年9月3日以降、ターミナルとアプリの両方でログインが必要
  • 非常に稀な、または特殊なネイティブSDKにはconfig pluginを書く追加の手間がかかることがある
  • EAS Freeプランの上限を超えるとStarter(月$19)またはProduction(月$199)の有料プランへの移行が必要
  • EASはクラウド優先で設計されているため、企業のオンプレミスCI必須要件との相性が悪い
  • ネイティブフォルダを手動で編集した後にprebuildを実行すると、変更が静かに削除される(config pluginに移していない場合)

最適な用途

新しいReact Nativeプロジェクトを素早く立ち上げたいチームEASのクラウドCI/CDを活用できる小〜中規模プロジェクトMVP/プロトタイプ開発と迅速なイテレーションOTAアップデートのニーズが高く、ストアの審査を待たずにJS修正を配信したいアプリケーションネイティブの要件が標準的なconfig pluginエコシステム(カメラ、通知、位置情報など)でカバーされるプロジェクト

Bare React Native

長所

  • ネイティブプロジェクト(Xcode/Gradle)への直接的かつ無制限のアクセス — 抽象化レイヤーが一切ない
  • RNのすべてのマイナーバージョン(0.85、0.86、0.87...)を、Expo SDKサイクルを待たずにすぐ取得できる
  • EASに一切依存しない — 任意のCI/CDサービスやオンプレミスパイプラインを構築できる
  • config pluginエコシステムに縛られず、任意のネイティブSDKを直接統合できる
  • 126,507個のGitHubスターと25,238件のフォークによる広く成熟したコミュニティサポート
  • MITライセンス、オープンソース、ベンダーロックインなし

短所

  • セットアップにXcode + CocoaPods、Android Studio + SDK + Gradleが必須 — Expoより初回セットアップが明らかに長い
  • ネイティブの`ios`/`android`フォルダが永続的 — バージョンアップのたびにUpgrade Helperで手動diffを適用する必要がある
  • OTAアップデートの既製ソリューションがない — `expo-updates`を手動統合するか、代替を構築する必要がある
  • EASを含むCI/CDを使いたい場合でも、ネイティブビルドの認証情報を手動で同期する必要がある
  • ネイティブパッケージの追加設定(Info.plist権限、Manifestエントリ、Gradle設定)は手動で行う — config pluginの再現性はない
  • 新しく参加した開発者にとって、ツールチェーンのセットアップが最初のビルドまでの時間を大幅に延ばす

最適な用途

EASがサポートしない特殊なツールチェーンやビルド環境が必要なプロジェクト企業のオンプレミス/セルフホストCI必須要件があるチームconfig pluginでカバーできない、非常に稀または特殊なネイティブSDK統合が必要なアプリケーションネイティブコードへの継続的かつ深い介入が必要な、大規模で複雑なアプリケーションSDKサイクルを待たずにRNコアの最新バージョンを使いたいチーム

コード比較

Expo
// Expo — app.config.ts + ローカルconfig pluginでネイティブ権限を追加(TypeScript)

// plugins/withCameraUsage.ts — Info.plistにカメラ権限を追加するconfig plugin
import { ConfigPlugin, withInfoPlist } from "expo/config-plugins";

const withCameraUsage: ConfigPlugin = (config) =>
  withInfoPlist(config, (config) => {
    config.modResults.NSCameraUsageDescription =
      "Profil fotoğrafı çekmek için kameraya erişim gerekiyor";
    return config;
  });

export default withCameraUsage;

// app.config.ts — pluginはファイルパスで参照される(npm i -D tsxが必要)
import "tsx/cjs";
import { ExpoConfig, ConfigContext } from "expo/config";

export default ({ config }: ConfigContext): ExpoConfig => ({
  ...config,
  name: "MyApp",
  slug: "my-app",
  version: "1.0.0",
  plugins: [["./plugins/withCameraUsage.ts"], "expo-router", "expo-updates"],
  updates: { url: "https://u.expo.dev/your-project-id" },
  runtimeVersion: { policy: "appVersion" },
});

// Terminal: ネイティブフォルダを生成(CNG)して適用
// npx expo prebuild --clean

// EAS Buildを実行してOTAアップデートを公開
// eas build --platform all --profile production
// eas update --branch production --message "Bug fix: login crash"
Bare React Native
// Bare React Native — パッケージインストール + 手動ネイティブ設定(TypeScript)

// 1) パッケージをインストール:autolinkingが接続し、podを取得し、再ビルド
// $ npm install react-native-vision-camera react-native-nitro-modules react-native-nitro-image
// $ npx pod-install
// $ npm run ios     # Android: npm run android

// 2) 権限を手動で追加 — このステップはautolinkingには含まれない
// ios/MyApp/Info.plist:
// <key>NSCameraUsageDescription</key>
// <string>Profil fotoğrafı çekmek için kameraya erişim gerekiyor</string>
// android/app/src/main/AndroidManifest.xml:
// <uses-permission android:name="android.permission.CAMERA" />

// 3) JS側での使用(共有コード)
import React, { useEffect } from "react";
import { Camera, useCameraPermission } from "react-native-vision-camera";

function ProfileCamera() {
  const { hasPermission, requestPermission } = useCameraPermission();

  useEffect(() => {
    if (!hasPermission) requestPermission();
  }, [hasPermission, requestPermission]);

  return <Camera style={{ flex: 1 }} isActive={true} device="back" />;
}

export default ProfileCamera;

// 4) バージョンアップグレード(0.86 -> 0.87):これに対応するCLIコマンドは存在しない
// Upgrade Helper (web): https://react-native-community.github.io/upgrade-helper/
// -> diffをPodfile.lock、build.gradle、AppDelegate.swiftに手動で適用

// 5) 独自のCIパイプライン(GitHub Actions、概要)
// - run: npx pod-install
// - run: xcodebuild -workspace ios/MyApp.xcworkspace -scheme MyApp -configuration Release

結論

2026年の既定の答えはExpo + CNGです。`expo prebuild`によってネイティブフォルダを再生成できるため、「eject」はもはや後戻りできない一方通行の扉ではなくなりました。config pluginシステムがネイティブ設定の大部分をカバーし、EAS Buildの無料プランは小〜中規模プロジェクトに十分です。Bare React Nativeを選ぶ理由は限定的ですが実在します:EASが対応していない特殊なツールチェーン、オンプレミスCIの必須要件、あるいは非常に稀なネイティブSDKです。この3つに該当しないならExpoから始めましょう。

無料相談を受ける
FAQ

よくある質問

2026年の既定の答えはExpo + CNGです。config pluginシステムがほとんどのネイティブモジュールをカバーし、EAS Buildの無料プラン(月15+15ビルド)は小〜中規模プロジェクトに十分で、`expo prebuild`のおかげでネイティブコードに踏み込むことはもはや後戻りできない決断ではありません。Bare RNを選ぶ正当な理由は、EASが対応していない特殊なツールチェーン、企業のオンプレミスCI必須要件、またはconfig pluginでカバーできない非常に稀なネイティブSDKです。

関連ブログ記事

すべての記事を見る
すべての比較