Expo vs Bare React Native مقارنة

إطار عمل RN مُدار يُثبَّت باستخدام Node.js LTS، وقابل للرجوع بفضل CNG

VS
Bare React Native

إعداد React Native الأساسي (core) الذي يمنح تحكمًا كاملاً في سلسلة الأدوات الأصلية (native toolchain)

16 دقائق للقراءةCross-Platform

الحكم السريع

الإجابة الافتراضية في 2026 هي Expo + CNG: بما أن `expo prebuild` يعيد توليد المجلدات الأصلية (native)، لم يعد "eject" بابًا باتجاه واحد، ونظام config plugin يغطي معظم التهيئة الأصلية، والطبقة المجانية من EAS Build تكفي للمشاريع الصغيرة والمتوسطة. الأسباب التي تبرر Bare React Native ضيقة لكنها حقيقية: سلسلة أدوات مخصصة لا يدعمها EAS، إلزامية CI داخلي (on-prem)، أو SDK أصلي نادر جدًا. إن لم تنطبق هذه الأسباب الثلاثة، ابدأ بـ 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 — اختبار فوري عبر Expo Go/Snack دون الحاجة إلى Xcode/Android Studio
  • بفضل CNG (`expo prebuild`) يمكن إعادة توليد المجلدات الأصلية — لم يعد "eject" بابًا باتجاه واحد
  • نظام config plugin يهيّئ المشروع الأصلي برمجيًا وبشكل قابل للتكرار
  • تحديث JS فوري عبر OTA منفصل عن الطبقة الأصلية بواسطة EAS Update
  • تتضمن خطة EAS Build المجانية 15+15 عملية بناء شهريًا وتحديثات لـ1000 MAU — بداية بلا تكلفة للمشاريع الصغيرة
  • بناء أصلي تلقائي من app config عبر EAS Workflows، بتشغيل من أحداث GitHub أو cron
  • ترقية الإصدار بسيطة بقدر تحديث تبعية npm ثم تنفيذ `prebuild --clean`
  • توافق وثيق مع منظومة RN بصفته عضوًا مؤسسًا في React Foundation

السلبيات

  • إصدارات Expo SDK تتأخر إصدارًا واحدًا عن نواة RN (SDK 57 → RN 0.86 وليس RN 0.87) — لا يمكنك الوصول فورًا إلى أحدث ميزات RN
  • منذ 3 سبتمبر 2026، يتطلب Expo Go (iOS) تسجيل الدخول في الطرفية (terminal) وفي التطبيق معًا
  • قد تتطلب كتابة config plugin لأنظمة SDK أصلية نادرة أو خاصة جدًا جهدًا إضافيًا
  • عند تجاوز حدود خطة EAS المجانية، يلزم الانتقال إلى خطة مدفوعة Starter (19$/شهريًا) أو Production (199$/شهريًا)
  • بما أن EAS مصمم على أساس أولوية السحابة، فتوافقه ضعيف مع إلزامية CI داخلي (on-prem) للمؤسسات
  • لمس المجلدات الأصلية يدويًا ثم تشغيل prebuild يحذف التغييرات بصمت (ما لم تُنقل إلى config plugin)

الأنسب لـ

الفرق التي تريد البدء بسرعة في مشاريع React Native جديدةالمشاريع الصغيرة إلى المتوسطة القادرة على استخدام CI/CD السحابي الخاص بـ EASتطوير MVP/النماذج الأولية والتكرار السريعالتطبيقات ذات الحاجة العالية لتحديثات OTA التي تريد إرسال إصلاحات JS دون انتظار موافقة المتجرالمشاريع التي تُلبَّى احتياجاتها الأصلية عبر منظومة config plugin القياسية (كاميرا، إشعارات، موقع، إلخ)

Bare React Native

الإيجابيات

  • وصول مباشر وغير محدود إلى المشروع الأصلي (Xcode/Gradle) — دون أي طبقة تجريد
  • يمكنك الحصول على كل إصدار فرعي من RN (0.85، 0.86، 0.87...) فورًا، دون انتظار دورة إصدار Expo SDK
  • لست معتمدًا على EAS إطلاقًا — يمكنك إعداد أي خدمة CI/CD تريدها أو خط أنابيب (pipeline) داخلي (on-prem)
  • يمكنك دمج أي SDK أصلي مباشرة دون التقيد بمنظومة config plugin
  • دعم مجتمعي واسع وناضج بـ126,507 نجمة و25,238 fork على GitHub
  • مرخّص بموجب MIT، مفتوح المصدر، بلا اعتماد على مزوّد (vendor)

السلبيات

  • يتطلب التثبيت Xcode + CocoaPods، وAndroid Studio + SDK + Gradle — إعداد أولي أطول بشكل واضح مقارنة بـ Expo
  • مجلدا `ios`/`android` الأصليان دائمان؛ كل ترقية إصدار تتطلب تطبيق الفروقات (diff) يدويًا عبر Upgrade Helper
  • لا يوجد حل جاهز لتحديثات OTA — يجب دمج `expo-updates` يدويًا أو إعداد بديل
  • حتى لو أردت استخدام CI/CD (بما فيها EAS)، يجب عليك مزامنة بيانات اعتماد البناء الأصلي (build credentials) يدويًا
  • التهيئة الإضافية للحزم الأصلية (أذونات Info.plist، مدخلات Manifest، إعدادات Gradle) تتم يدويًا — دون إمكانية التكرار التي يوفرها config plugin
  • بالنسبة لمطوّر جديد، يطيل إعداد سلسلة الأدوات (toolchain) الوقت اللازم للوصول إلى أول بناء بشكل ملحوظ

الأنسب لـ

المشاريع التي تتطلب سلسلة أدوات مخصصة أو بيئة بناء لا يدعمها EASالفرق التي تلتزم بـ CI داخلي (on-prem) أو ذاتي الاستضافة (self-hosted)التطبيقات التي تتطلب دمج SDK أصلي نادر جدًا أو خاص جدًا لا يغطيه config pluginالتطبيقات الكبيرة والمعقدة التي تحتاج إلى تدخل مستمر وعميق في الكود الأصليالفرق التي تريد استخدام أحدث إصدار من نواة RN دون انتظار دورة SDK

مقارنة الكود

Expo
// 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
// 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.

مقالات مدونة ذات صلة

عرض جميع المقالات

مشاريع ذات صلة

عرض جميع المشاريع
جميع المقارنات