Flutter vs React Native
نقارن Flutter من Google المبني على Dart مع React Native من Meta المبني على JavaScript/TypeScript من كل الجوانب. أي إطار عمل عابر للمنصات (cross-platform) يتصدر المشهد في 2025؟
إطار عمل RN مُدار يُثبَّت باستخدام Node.js LTS، وقابل للرجوع بفضل CNG
إعداد React Native الأساسي (core) الذي يمنح تحكمًا كاملاً في سلسلة الأدوات الأصلية (native toolchain)
الإجابة الافتراضية في 2026 هي Expo + CNG: بما أن `expo prebuild` يعيد توليد المجلدات الأصلية (native)، لم يعد "eject" بابًا باتجاه واحد، ونظام config plugin يغطي معظم التهيئة الأصلية، والطبقة المجانية من EAS Build تكفي للمشاريع الصغيرة والمتوسطة. الأسباب التي تبرر Bare React Native ضيقة لكنها حقيقية: سلسلة أدوات مخصصة لا يدعمها EAS، إلزامية CI داخلي (on-prem)، أو SDK أصلي نادر جدًا. إن لم تنطبق هذه الأسباب الثلاثة، ابدأ بـ 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 — config plugin يضيف إذن الكاميرا إلى Info.plist
import { ConfigPlugin, withInfoPlist } from "expo/config-plugins";
const withCameraUsage: ConfigPlugin = (config) =>
withInfoPlist(config, (config) => {
config.modResults.NSCameraUsageDescription =
"الوصول إلى الكاميرا مطلوب لالتقاط صورة الملف الشخصي";
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" },
});
// الطرفية: توليد المجلدات الأصلية (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، اسحب الـ pods، أعد البناء
// $ 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>الوصول إلى الكاميرا مطلوب لالتقاط صورة الملف الشخصي</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 (ويب): 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` يعيد توليد المجلدات الأصلية (native)، لم يعد "eject" بابًا باتجاه واحد، ونظام config plugin يغطي معظم التهيئة الأصلية، والطبقة المجانية من EAS Build تكفي للمشاريع الصغيرة والمتوسطة. الأسباب التي تبرر Bare React Native ضيقة لكنها حقيقية: سلسلة أدوات مخصصة لا يدعمها EAS، إلزامية CI داخلي (on-prem)، أو SDK أصلي نادر جدًا. إن لم تنطبق هذه الأسباب الثلاثة، ابدأ بـ Expo.
احصل على استشارة مجانيةالإجابة الافتراضية في 2026 هي Expo + CNG: نظام config plugin يغطي معظم الوحدات الأصلية، والطبقة المجانية من EAS Build (15+15 بناء/شهر) تكفي المشاريع الصغيرة والمتوسطة، وبفضل `expo prebuild` لم يعد النزول إلى الكود الأصلي قرارًا بلا رجعة. الأسباب الحقيقية التي تبرر bare RN: سلسلة أدوات مخصصة لا يدعمها EAS، إلزامية CI داخلي (on-prem) للمؤسسات، أو SDK أصلي نادر جدًا لا يغطيه config plugin.