Flutter vs React Native
GoogleのDartベースFlutterと、MetaのJavaScript/TypeScriptベースReact Nativeをあらゆる角度から比較します。2025年、どちらのクロスプラットフォームフレームワークが優勢なのか?
Node.js LTSでセットアップでき、CNGにより後戻り可能な、マネージドなReact Nativeフレームワーク
ネイティブツールチェーンを完全にコントロールできる、コアReact Nativeのセットアップ
2026年の既定の答えはExpo + CNGです。`expo prebuild`によってネイティブフォルダを再生成できるため、「eject」はもはや後戻りできない一方通行の扉ではなくなりました。config pluginシステムがネイティブ設定の大部分をカバーし、EAS Buildの無料プランは小〜中規模プロジェクトに十分です。Bare React Nativeを選ぶ理由は限定的ですが実在します:EASが対応していない特殊なツールチェーン、オンプレミスCIの必須要件、あるいは非常に稀なネイティブSDKです。この3つに該当しないならExpoから始めましょう。
| カテゴリー | Expo | Bare 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 — 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 — パッケージインストール + 手動ネイティブ設定(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 Release2026年の既定の答えはExpo + CNGです。`expo prebuild`によってネイティブフォルダを再生成できるため、「eject」はもはや後戻りできない一方通行の扉ではなくなりました。config pluginシステムがネイティブ設定の大部分をカバーし、EAS Buildの無料プランは小〜中規模プロジェクトに十分です。Bare React Nativeを選ぶ理由は限定的ですが実在します:EASが対応していない特殊なツールチェーン、オンプレミスCIの必須要件、あるいは非常に稀なネイティブSDKです。この3つに該当しないならExpoから始めましょう。
無料相談を受ける2026年の既定の答えはExpo + CNGです。config pluginシステムがほとんどのネイティブモジュールをカバーし、EAS Buildの無料プラン(月15+15ビルド)は小〜中規模プロジェクトに十分で、`expo prebuild`のおかげでネイティブコードに踏み込むことはもはや後戻りできない決断ではありません。Bare RNを選ぶ正当な理由は、EASが対応していない特殊なツールチェーン、企業のオンプレミスCI必須要件、またはconfig pluginでカバーできない非常に稀なネイティブSDKです。