تاریخچه
گوگل و فیسبوک در حال حاضر در جامعه وب در حال رقابت هستند. AngularJS گوگل یکی از محبوبترین فریمورکهای جاوااسکریپت است که برای ساخت برنامههای وب استفاده میشود. React که توسط فیسبوک ساخته شده است، یک کتابخانه جاوااسکریپت است که به طور گسترده در توسعه برنامههای وب استفاده میشود.
AngularJS و ReactJS به عنوان رقبای قوی در جامعه وب شناخته میشوند. اما به تازگی، زمانی که تقاضا برای برنامههای تلفن همراه cross-platform افزایش یافت، فیسبوک پلتفرم React Native را برای ساخت برنامههای تلفن همراه cross-platform معرفی کرد. به زودی گوگل نیز Flutter را راهاندازی کرد تا با React Native فیسبوک رقابت کند.
React Native: React Native توسط فیسبوک در مارس 2015 منتشر شد.
Flutter: گوگل Flutter را در ماه مه 2019 راهاندازی کرد.
Flutter به نسبت دیر عرضه شد. قبل از وجود Flutter در بازار، React Native در جامعه توسعه برنامههای تلفن همراه به نام خود را برجسته کرده بود.
معماری
وقتی تصمیم میگیرید یک Framework را انتخاب کنید، مهم است که بر پایه معماری آن تأمل کنید. هر دو React Native و Flutter معماریهای کاملاً متفاوتی دارند.
React Native: بر پایهی معماری Flux است که در فیسبوک استفاده میشود. این برنامه بر اساس مفهوم محیط اجرای JS به نام جس پل ارتباطی استوار است. این پل برای ارتباط با نخهای محلی استفاده میشود. کد به زبان جاوااسکریپت نوشته شده و در طول اجرا به کد Native تبدیل میشود.
Flutter: از Framework دارت استفاده میکند که به طور معکوس از موتور Skia C++ استفاده میکند. برخلاف Flux در React Native، چارچوب دارت نیازی به هیچ پل ارتباطی ندارد زیرا اکثر اجزا را پیشزمینه دارد. این Framework در اندازه بزرگتری قرار دارد. موتور Skia C++ همراه با تمام پروتکلها، کانالها و ترکیبهای لازم میآید.
عملکرد معماری React Native نسبت به Flutter به دلیل استفاده از پل ارتباطی Javascript در React Native ضعیف است. در حالی که Flutter همه چیز لازم را در خودش دارد.

زبان برنامه نویسی
برای یک توسعهدهنده، توسعه هر برنامهای بستگی به زبان برنامهنویسی استفاده شده دارد. امروزه بسیاری از زبانهای برنامهنویسی وجود دارند و اکثر توسعهدهندگان دانش چندین زبان برنامهنویسی را دارند. بیایید زبانهای استفاده شده در React Native و Flutter را مقایسه کنیم.
React Native: زبان برنامهنویسی مورد استفاده در React Native جاوااسکریپت است. جاوااسکریپت یکی از محبوبترین زبانها در جهان است و همچنین یکی از سه تکنولوژی اصلی وب جهان است (WWW).
Flutter: از طرف دیگر، فلاتر از زبان دارت استفاده میکند که نه محبوب است و نه به طور گسترده استفاده میشود. دارت در سال 2011 توسط گوگل معرفی شد. این زبان بسیار ساده و آسان برای یادگیری است زیرا اکثر مفاهیم شیءگرا را پشتیبانی میکند.
هر کسی که حتی تجربه کمی در توسعه وب دارد، با جاوااسکریپت آشنا است. این یکی از محبوبترین زبانها است. بیشتر چارچوبهای وب مانند Angular، React، Vue نیز با استفاده از جاوااسکریپت ساخته شدهاند. اما دارت که توسط فلاتر استفاده میشود، به تازگی توسعه یافته است. در جامعه برنامهنویسی کمتر شناخته شده است.

مراحل نصب
بعد از تصمیمگیری، قدم اول همیشه نصب است. بیشتر اوقات، به ویژه برای تازهکاران، نصب مشکلساز است. هر دو React Native و Flutter روشهای نصب متفاوتی دارند.
React Native: برای نصب React Native در ویندوز و لینوکس از مدیر بستههای نود با نام NPM استفاده میشود. توسعهدهندگانی که تجربهی جاوااسکریپت دارند، با NPM آشنایی دارند زیرا از آن به طور گسترده استفاده میشود. برای مکاو اس، علاوه بر NPM، نیاز به مدیر بستههای Homebrew هم وجود دارد.
Flutter: فلاتر برای نصب نیازی به هیچ مدیر بستهای ندارد. آن را مستقیماً از GitHub برای پلتفرم موردنظر دانلود میکنیم. برای MacOS، نیاز به تنظیم مسیر (Path) نیز وجود دارد.
استفاده از NPM بسیار آسان و ساده است. برای توسعهدهندگانی که تجربهی جاوااسکریپت ندارند، یادگیری NPM به خاطر نیاز به نوشتن سه تا پنج دستور در خط فرمان، به راحتی امکانپذیر است. علاوه بر این، NPM در بسیاری از جاها در دنیای توسعه وب استفاده میشود. بنابراین، یادگیری NPM همواره یک نقطه قوت است.
از طرف دیگر، فلاتر ابتدا از GitHub دانلود میشود و سپس نصب میشود. برای نصب فلاتر، چند مرحله وجود دارد که ممکن است سردرگمی ایجاد کند. فلاتر همچنین نیاز به یک نوع مدیر بسته برای روند بهتر نصب دارد.
کامپوننتهای رابط کاربری و API
یک framework با یک API مناسب برای دسترسی به ماژولهای نیتیو بسیار مهم است.
React Native: مانند React، React Native نیز رابط کاربری (UI) و API دستگاه را فراهم میکند. این مورد به طور قابل توجهی بستگی به ماژولهای third-partyبرای اجزای نیتیو دارد. بدون شک، قسمت رابط کاربری (UI) React Native عالی است، اما بسیاری از وابستگیهای آن به کتابخانههای شخص ثالث است.
Flutter: از طرف دیگر، فلاتر پر از اجزا با امکانات غنی مانند اجزای رابط کاربری، تست، دسترسی به API دستگاه، ناوبری، مدیریت وضعیت و بسیاری از کتابخانههای دیگر است. به شدت به کتابخانههای شخص ثالث نیاز ندارد. علاوه بر این، فلاتر همچنین با ویجتهای طراحی متریال (Material Design) همراه است. همچنین، فلاتر ویجتی به نام کوپرتینو (Cupertino) را نیز ارائه میدهد که برای ایجاد برنامهها با رابط کاربری بهتر برای iOS مناسب است.
وقتی مسئله به اجزای غنی و دسترسی به API میرسد، React Native به طور قابل توجهی به کتابخانههای شخص ثالث وابستگی دارد. این یک ویژگی خوب و بد به صورت همزمان است. برنامهنویس از آزادی برای انتخاب کتابخانههای دلخواه خود برخوردار است، اما در عین حال ممکن است مشکلاتی را به وجود آورد. اما فلاتر با همه اجزای غنی که برنامهنویس برای ایجاد برنامههای موبایل چندسکویی نیاز دارد، ارائه میشود. در حین استفاده از فلاتر نیازی به جستجو برای کتابخانههای شخص ثالث نیست.
جامعه (Community support)
جامعه نقش مهمی در رشد هر فناوری ایفا میکند. در دوران مدرن، برنامهنویسان جوامعی تشکیل میدهند و دانش خود را درباره فناوریای که در حال کار با آن هستند به اشتراک میگذارند. تجربه توسعه و حل مشکلات تأثیر بسیار زیادی دارد.
React Native: از زمان راهاندازی آن در سال 2015، محبوبیت React Native به طرز چشمگیری افزایش یافته است. جامعه React Native در GitHub بسیار بزرگ است و هر سال تعداد زیادی کنفرانس و جلسات برگزار میشود، به صورت آنلاین و حضوری.
Flutter: فلاتر در سال 2017 راهاندازی شد و به تازگی تاسیس شده است. جامعه آن در حال حاضر به اندازه بزرگ نیست، اما با سرعتی چشمگیر در حال رشد است. گوگل هر سال بستر فلاتر را ترویج میدهد و کنفرانسها و جلساتی برگزار میکند.
React Native: React Native یک فریمورک متقاطع محبوب و گسترده است. جامعه آن در حال حاضر بنیانگذاری شده است. از سوی دیگر، فلاتر جدید و به اندازه آن محبوب نیست. جامعه آن با سرعتی چشمگیر در حال بنیانگذاری است و گوگل در بهترین شیوه ممکن آن را ترویج میکند.

تست نویسی (Testing)
تست، یک بخش مهم از هر نوع توسعه نرم افزار است. هر تکنولوژی خوب و عالی، پشتیبانی از تست را فراهم میکند. تستهایی مانند Unit Test، Integration Test و UI Level Test، در زمینه توسعه برنامههای موبایل cross-platform بسیار مهم هستند.
React Native: در React Native، گزینههای تست کمی وجود ندارد. بله، این فریمورک پشتیبانی از Unit Test در سطح اولیه را دارد، اما وقتی به Integration Test و UI Level Testمیرسد، مجدداً به کتابخانههای شخص ثالث وابستگی دارد. Appium و Detox دو ابزار تست محبوب برای برنامههای React Native هستند.
Flutter: وقتی به تست در فلاتر میرسیم، این فریمورک مجموعهای غنی از ابزارها برای Unit Test و Integration Test فراهم میکند. همچنین ابزارهایی برای تست ویجتها و رابط کاربری برنامه نیز دارد. علاوه بر این، مستندات مربوط به تست برنامههای فلاتر به درستی نگهداری میشوند.
مجدداً، React Native برای تست کردن به کتابخانههای شخص ثالث وابستگی دارد در حالی که Flutter با ابزارهای تست زیبا و قدرتمندی همراه است. یک توسعهدهنده در هنگام تست کردن برنامههای Flutter نیازی به جستجو و استفاده از کتابخانههای شخص ثالث ندارد.
CI/CD در Flutter
برای هر برنامه، برای وب یا موبایل، پشتیبانی از CI/CD ضروری است. این امر به دریافت بازخورد مداوم و جلوگیری از بروز اشکال کمک میکند. اما استفاده از CI/CD مشکل است وقتی که مستندات و منابع مناسبی وجود نداشته باشد.
React Native: تاکنون مستندات React Native همواره ضعیف بوده است و وقتی به CI/CD میرسد، هیچ مستندات رسمی وجود ندارد. برای یک توسعهدهنده، استفاده از CI/CD بدون مستندات مناسب بسیار سخت خواهد بود. با این حال، چند منبع همواره در اینترنت در دسترس است.
Flutter: همانطور که قبلاً اشاره شد، فلاتر دارای مستندات عالی برای تقریباً هر موردی است. بخشی مناسب برای توضیح راهاندازی CI/CD مداوم وجود دارد.
راهاندازی CI/CD وابسته به مستندات و منابع است. در حالی که React Native هیچ مستندات رسمی برای آن ندارد، Flutter یک بخش مجزا برای CI/CD دارد. این موضوع به عنوان یک منبع کمکی نه تنها برای توسعهدهندگان تازهکار، بلکه برای توسعهدهندگان حرفهای نیز مفید است.
محبوبیت (Popularity)
محبوبیت یکی از عوامل اصلی است که تأثیرگذار بر انتخاب یک توسعهدهنده است. بدون شک، هر دو React Native و Flutter از محبوبترین چارچوبهای توسعه برنامههای تلفن همراه cross-platform هستند. اما بیایید آنها را مقایسه کنیم تا ببینیم کدامیک محبوبتر است.
React Native: در GitHub، React Native بیش از هشتاد هزار ستاره دارد. تعداد مشکلات (issues) در GitHub کمتر از ششصد است. React Native در سال 2019 یک فناوری بسیار محبوب بود. در چند سال گذشته، محبوبیت آن به طرز چشمگیری افزایش یافته است.
Flutter: برخلاف React Native، Flutter یک فناوری نوپا است، اما با این حال بیش از هفتاد و دو هزار ستاره در GitHub دارد، که فقط هشت هزار کمتر از React Native است. بدون شک، محبوبیت Flutter به سرعت در حال افزایش است، اما در مورد مشکلات، بیش از پنج هزار مشکل در GitHub وجود دارد. این تعداد بسیار بیشتر از React Native است.
React Native در جامعه توسعه برنامههای تلفن همراه cross-platform به طور فوقالعاده محبوب است، در حالی که محبوبیت Flutter نیز در حال افزایش است. اما Flutter به عنوان یک فناوری جدید با یک زبان برنامهنویسی جدید و کمتر معروف، کمی درگیری دارد.
نتیجهگیری
هر دو فریمورک React Native و Flutter برای توسعه اپلیکیشن موبایل cross-platformجز بهترینها هستند. هر یک دارای مزایا و معایب خود هستند. در حالی که React Native از جاوااسکریپت استفاده میکند و شباهتهای زیادی به ReactJS دارد، بسیاری از توسعهدهندگان آن را نسبت به Flutter بیشتر انتخاب میکنند. Flutter رابط کاربری نسبتاً جدیدی است و با یک زبان برنامهنویسی جدید کار میکند. اما Flutter امکانات زیادی از پیش در اختیار دارد، که React Native ارائه نمیدهد. React Native بسیار به کتابخانههای third-party وابسته است که هم خوب و هم بد است. این امکان را به توسعهدهنده میدهد تا آزادی عمل داشته باشد.
بدون شک، هر دوی آنها در آینده به شدت مورد توجه قرار خواهند گرفت.
