React Native vs Flutter

So sánh chi tiết mọi khía cạnh tính đến tháng 10/2026 — đào sâu vào hiệu năng native và triển khai đa thiết bị. Điểm cốt lõi của năm 2026: khoảng cách hiệu năng từng rất lớn đã thu hẹp đáng kể — React Native đã xóa hoàn toàn "cái bridge" cũ, còn Flutter đã xóa "shader jank" bằng Impeller.

React Native 0.87 (0.88 vừa ra ~15/10 ⚠) Flutter 3.47.7 (10/10/2026) Dữ liệu kiểm tra ngày 18/10/2026
React NativeMeta → React Foundation
Chọn khi team đã có JS/TS và cần cảm giác native thật
  • UI là component native thật (UIKit / Android Views) qua Fabric
  • OTA trưởng thành nhất: EAS Update (CodePush đã chết 3/2025)
  • TV mạnh nhất: react-native-tvos + Expo TV
  • Tuyển người ở VN dễ nhất — pool JS lớn gấp 10–15 lần
  • Web/desktop qua cộng đồng (react-native-web; Windows/macOS do Microsoft duy trì)
FlutterGoogle
Chọn khi cần animation nặng và web/desktop first-class
  • Tự vẽ từng pixel bằng engine Impeller — giao diện giống hệt mọi máy
  • Cold start nhanh hơn ~25–30%, FPS duy trì ổn định 60–120
  • Web + Windows + macOS + Linux first-class từ 1 codebase
  • Dart AOT ra mã máy ARM — không engine script lúc chạy
  • OTA qua Shorebird (trả phí theo lượt cài patch)
Kết luận nhanh: team đã có dev JS/TS → React Native + Expo. Cần web/desktop "xịn" từ cùng 1 codebase, hoặc app xoay quanh animation/custom UI nặng → Flutter. Cần TV → React Native. Với ~90–95% app nghiệp vụ (form, list, navigation, gọi API), người dùng không phân biệt được hai bên.
Phần 1

Kiến trúc nền tảng

Khác biệt gốc rễ: React Native mượn UI native của hệ điều hành và gọi xuống native đồng bộ; Flutter tự vẽ mọi pixel bằng engine riêng sau khi biên dịch Dart thành mã máy. Mọi khác biệt về hiệu năng, kích thước app và cảm giác sử dụng đều bắt nguồn từ đây.

React Native — đường đi của một thao tác

Viết TypeScript/React → build ra bytecode Hermes → chạy gọi native trực tiếp qua JSI → Fabric render view native thật.
TypeScript / ReactCode bạn viết, component khai báo UI
→
Hermes bytecode (.hbc)Biên dịch sẵn lúc build — máy không phải parse JS lúc chạy
→
JSIGọi trực tiếp C++ đồng bộ, giữ reference tới object native, không serialize
→
Fabric + TurboModulesRender native view thật; module native lazy-load khi cần
→
UIKit / Android ViewsButton, list… là của hệ điều hành thật
Đường cũ đã bị xóa: JS thread → cầu JSON bất đồng bộ (bridge) → native — code bridge bị xóa hoàn toàn khỏi repo ở bản 0.85 (4/2026).

Flutter — đường đi của một thao tác

Viết Dart → build release biên dịch AOT thành mã máy ARM → Impeller vẽ trực tiếp lên GPU, không qua view của hệ điều hành.
DartCode bạn viết, widget tree khai báo UI
→
Dart AOTBiên dịch trước thành mã máy ARM khi build release
→
ImpellerEngine render, shader đã precompile lúc build — không jank frame đầu
→
Metal / VulkanVẽ từng pixel trực tiếp lên GPU
→
Màn hìnhGiao diện giống hệt nhau trên mọi máy, mọi OS
Đổi lại: app phải "gánh" cả engine render (~4–6MB), và khi cần nhúng view native (map, WebView) phải bọc qua PlatformView — tốn RAM, dễ jank trong layout phức tạp.

Hành trình xóa bridge của React Native

10/2024 · 0.76

New Architecture mặc định cho project mới (JSI + Fabric + TurboModules).

10/2025 · 0.82

Kiến trúc cũ bị tắt vĩnh viễn, không còn flag bật lại.

2/2026 · 0.84

Hermes V1 thành JS engine mặc định. Case Expensify (production): tổng thời gian đến interactive cải thiện 7.6% Android, 2.5% iOS ⚠ (trích 1 nguồn, chưa xác minh độc lập).

4/2026 · 0.85

Code bridge cũ bị xóa hoàn toàn — module kiểu RCTBridgeModule / ReactContextBaseJavaModule không còn chạy được; lớp tương thích (interop layer) cũng bị xóa. Expo SDK 55 (2/2026) cũng đã bỏ hỗ trợ kiến trúc cũ.

8/2026 · 0.87

Bản latest theo docs chính thức (kiểm tra live 18/10/2026). 0.88 vừa release ~15/10/2026 theo GitHub/devtalk ⚠ docs chưa kịp cập nhật. Nhịp release ~2 tháng/bản.

Flutter & Impeller

3.10 → 3.16

Impeller mặc định trên iOS (từ 3.10) rồi Android (từ 3.16), thay Skia. Điểm mấu chốt: shader được precompile tại lúc build → xóa "shader compilation jank" — giật frame đầu tiên khi animation chạy lần đầu, lời phàn nàn lâu năm nhất về Flutter Android.

13/8/2026 · 3.47

Nhánh 3.47 stable; 3.47.7 release 10/10/2026 kèm Dart 3.13.5. Impeller thành mặc định trên cả macOS/Windows/Linux. Web vẫn dùng Skia. Desktop hiện dùng backend OpenGL ES; Vulkan cho desktop vẫn là bản thiết kế chưa xong ⚠.

11/2026 · 3.50

Dự kiến: xóa hoàn toàn backend Skia trên Android 10+ (Impeller là đường render duy nhất); WebAssembly lazy/deferred loading lên GA; Dart 3.14 (Augmentations giúp codegen gọn hơn); hỗ trợ day-zero Android 17 và iOS mới.

Tín hiệu dài hạn: tháng 10/2025, Meta công bố chuyển React + React Native sang React Foundation thuộc Linux Foundation (board gồm Amazon, Callstack, Expo, Meta, Microsoft, Software Mansion, Vercel) — giảm rủi ro "Meta bỏ rơi". Flutter vẫn do Google chủ quản.
Phần 2 · Đào sâu

Hiệu năng native

Flutter nhỉnh hơn ở cold start và FPS duy trì; RN kiến trúc mới đã thu hẹp mạnh khoảng cách so với thời pre-Fabric. Dưới đây là số đo thực tế 2025–2026 từ 3 nguồn độc lập.

⚠ Lưu ý phương pháp: các nguồn dùng thiết bị và app đo khác nhau nên số tuyệt đối khác nhau giữa các nguồn — chỉ nên đọc theo hướng, và hướng thì nhất quán. Không dùng số liệu benchmark nào trước 2024 (thời còn bridge cũ / Skia).
React Native Flutter

Cold start — thời gian khởi động lạnh

Giây · càng thấp càng tốt · Galaxy A54 + iPhone 15
Nguồn A: Nordstone, 4/2026 — đo trên app client thật.

Tốc độ khung hình (FPS)

FPS · càng cao càng tốt · trần hiển thị 60fps
Nguồn A: Nordstone, 4/2026. Flutter giữ 60fps ổn định ở cả 3 kịch bản; RN đuối nhất ở animation phức tạp (48fps).

RAM tiêu thụ

MB · càng thấp càng tốt
Nguồn A: Nordstone, 4/2026. "Màn hình nặng" = feed 50 ảnh.

Kích thước app release

MB · càng thấp càng tốt
Nguồn A: Nordstone, 4/2026 (iOS release / Android AAB). Lưu ý nguồn C cho kết quả ngược ở build tối giản — xem bảng đối chiếu bên dưới.

Đối chiếu 3 nguồn benchmark

Chỉ sốReact NativeFlutterNguồn
Cold start Android 1.84s · iOS 1.12s (app client thật); tổng hợp khác: iOS trung vị ~480ms; e-commerce 450ms Android / 350ms iOS Android 1.61s · iOS 1.09s; tổng hợp: iOS trung vị ~310ms; e-commerce 320ms / 280ms — nhanh hơn ~25–30% A (Nordstone 4/2026) · B (tech-insider 2026) · C (weelorum 2026)
Frame trong ngân sách 16ms 95.2% frame đạt ngân sách 98.5% frame đạt ngân sách (list 1.000 item có ảnh) C (weelorum, 50 lần chạy, app e-commerce 5 màn hình)
Scroll list 55–60 FPS (58fps list thuần, 52fps khi có ảnh mạng) 60–120 FPS (59–60fps ổn định trong đo của nguồn A) A + B
RAM Idle 112MB · nặng 198MB; tổng hợp app vừa ~110–140MB; e-commerce 95MB Idle 98MB · nặng 167MB; tổng hợp ~90–120MB; e-commerce 85MB A · B · C
App size hello-world iOS ~8MB / Android ~25MB; APK release tối giản 10.8MB (Hermes bytecode gọn) iOS ~11MB / Android ~16MB; APK 12.5MB ⚠ Đảo chiều so với nguồn A — cách đóng gói/module native ảnh hưởng nhiều hơn framework khi app lớn dần. B (trích SynergyBoat/Appiko 2025, Completedigi 2026) · C

Điểm nghẽn còn lại của React Native

  • Bridge JSON cũ — đã chết (xóa ở 0.85). JSI gần như zero-cost cho đa số thao tác.
  • Vẫn còn JS thread (Hermes): animation nặng muốn mượt phải chạy hoàn toàn trên UI thread qua Reanimated v4 (worklets, không chạm JS thread lúc animate).
  • Particle system tùy biến, xử lý video từng frame, tracking gesture 120Hz với biến đổi toán học nặng → Flutter vẫn hơn hẳn.
  • Ngược lại RN thắng khi nhúng component native phức tạp (WebView, map native, video player): là native thật nên mượt, không tốn lớp texture riêng.

Điểm nghẽn còn lại của Flutter

  • Shader jank lịch sử — đã giải quyết bằng Impeller (precompile tại build; 3.50 xóa nốt Skia trên Android 10+).
  • PlatformView: nhúng view native (map, WebView, video) phải qua texture layer riêng → tốn RAM, dễ jank/glitch trong layout phức tạp.
  • Thiết bị Android rất cũ (< API 29) vẫn fallback OpenGL ES.
  • App gánh engine render ~4–6MB trong mọi bản build.
Kết luận hiệu năng: Flutter giữ lợi thế đo được ở cold start, animation custom nặng duy trì 60/120fps, và RAM nhỉnh hơn một chút. RN đã xóa điểm nghẽn lịch sử lớn nhất của mình; muốn chốt cho dự án thật, hãy đo prototype trên đúng máy mục tiêu thay vì tin số tuyệt đối của bất kỳ nguồn nào.
Phần 3 · Đào sâu

3D, AR và AI/ML on-device

Ba nhóm tác vụ nặng nhất trên mobile. Nguyên tắc chung: hiệu năng thật do engine/runtime native quyết định (three.js, ARKit/ARCore, LiteRT/ExecuTorch/ONNX Runtime) — framework chỉ là lớp bọc. Khác biệt nằm ở độ chín của thư viện, đường truyền dữ liệu (zero-copy hay serialize) và chi phí bộ nhớ cộng thêm. Phiên bản dưới đây kiểm tra live ngày 18/10/2026.

3.1 · 3D: three.js/R3F vs hệ Flutter 3D

Khía cạnhReact NativeFlutter
Đường 3D chính three.js + @react-three/fiber (R3F) — renderer React cho three.js, chạy trên RN qua expo-gl (WebGL). Hệ sinh thái web 3D lớn nhất hành tinh dùng lại gần như nguyên vẹn, kèm @react-three/drei (helper: camera controls, loader, environment…). Không có "three.js của Flutter". Xem model: flutter_3d_controller / model_viewer_plus (bọc web component <model-viewer> trong WebView). Game 3D: flame_3d — vẫn ở bản 0.x thử nghiệm.
Phiên bản (18/10/2026) @react-three/fiber 9.8.0 (22/9/2026; v9 đi cặp React 19, v10 đang alpha), three.js r186. R3F 9 đã hỗ trợ đường WebGPURenderer ở phía web. flutter_3d_controller 2.3.0 (pub.dev, cập nhật 13/9/2025) · model_viewer_plus 1.10.0 · flame 1.38.2 stable (2.0.0-dev.1 preview) · flame_3d 0.3.1 (2/10/2026, yêu cầu Flutter ≥ 3.47).
Cách render Scene graph do JS/TS điều khiển, GPU vẽ qua WebGL (OpenGL ES). Render loop chạy ngoài React nên overhead React ≈ 0; điểm nghẽn là JS thread khi scene rất nhiều object/cập nhật mỗi frame. Viewer glTF/GLB chạy trong WebView (model-viewer) → render native của trình duyệt con, nhưng cộng chi phí WebView + PlatformView. OBJ có renderer thuần Flutter riêng (nhẹ, ít tính năng). flame_3d vẽ qua Impeller nhưng API chưa ổn định.
Định dạng & tính năng glTF/GLB chuẩn, PBR, animation, post-processing, physics qua thư viện three.js — ngang bản web. GLB/glTF + OBJ (FBX mới "planned" ở flutter_3d_controller); animation/texture/camera control đủ cho use case xem sản phẩm 3D, không phải làm game/scene phức tạp.
Hiệu năng & RAM FPS do three.js + GPU quyết định; scene vừa (viewer sản phẩm, configurator) mượt 60fps. RAM cộng thêm: JS heap giữ scene graph — scene lớn cần kỷ luật dispose texture/geometry. Render trong WebView cho FPS tốt với model đơn lẻ, nhưng RAM cộng thêm của WebView + lớp PlatformView và nguy cơ jank khi 3D nằm trong layout cuộn phức tạp (đúng điểm yếu PlatformView đã nêu ở Phần 2).
Chốt Thắng rõ — 3D là sân nhà của hệ three.js. Đủ tốt cho viewer model đơn giản; 3D/game 3D nghiêm túc → cân nhắc Unity/native.

3.2 · AR: ViroReact vs ar_flutter_plugin

Khía cạnhReact NativeFlutter
Thư viện chính ViroReact — @reactvision/react-viro (ReactVision duy trì, MIT): bọc ARKit (iOS) + ARCore (Android), khai báo scene bằng component React (<ViroARScene>, <Viro3DObject>), có PBR, particles, physics. ar_flutter_plugin (cộng đồng): widget ARView + platform channel xuống ARKit/ARCore — detect mặt phẳng ngang/dọc, anchor, đặt model 3D. Đường phụ: model_viewer_plus mở AR qua Scene Viewer (Android) / Quick Look (iOS) cho use case xem sản phẩm.
Phiên bản & nhịp bảo trì (18/10/2026) react-viro 2.57.3 — đã test & hỗ trợ qua Expo SDK 57 / RN 0.86, tương thích New Architecture. Release đều đặn trong 2026. Plugin gốc nhịp release chậm hơn hẳn (bản tham chiếu phổ biến vẫn 0.6.x/0.7.x) ⚠ — khi chốt dự án AR bằng Flutter cần audit kỹ trạng thái maintainer và tính năng cần dùng.
Mở rộng nền tảng Vượt trội: cùng codebase mở rộng lên Meta Quest (VR/MR qua OpenXR, cần Expo SDK 55+/RN 0.83+) và visionOS (peer package riêng), thêm bản web renderer. Chỉ iOS/Android. Không có đường chính thức lên Quest/visionOS.
Hiệu năng & RAM Tracking/SLAM do ARKit/ARCore native làm → chất lượng tracking ngang nhau ở cả hai bên. Render scene trong Viro là native; chi phí framework gần như bằng 0 lúc chạy AR session. Tracking cũng do ARKit/ARCore; nhưng AR view là PlatformView → cộng chi phí compositing/RAM, và lệnh điều khiển qua platform channel bất đồng bộ. AR toàn màn hình thì chênh lệch nhỏ; AR nhúng trong UI cuộn thì Flutter bất lợi hơn.
Chốt Thắng rõ — AR là một trong số ít mảng RN có thư viện chín vượt trội. AR cơ bản (đặt model, detect plane) làm được; AR là tính năng lõi của sản phẩm → rủi ro thư viện cao hơn.

3.3 · AI/ML on-device: ExecuTorch/TFLite/ONNX vs tflite_flutter/ONNX/FFI

Khía cạnhReact NativeFlutter
Runtime chính react-native-executorch (Software Mansion, chạy ExecuTorch của Meta — LLM, TTS, vision có model đóng gói sẵn) · react-native-fast-tflite (LiteRT/TFLite qua Nitro Modules) · onnxruntime-react-native (Microsoft) · thêm Callstack react-native-ai: Apple Foundation Models + Gemini Nano + llama.rn sau cùng một API kiểu Vercel AI SDK. tflite_flutter (binding FFI tới LiteRT/TFLite C API) · flutter_onnxruntime (FFI, ONNX Runtime) · flutter_onnxruntime_genai (chạy LLM/VLM kiểu Phi-3.5 Vision) · google_mlkit_*: bọc ML Kit native cho các tác vụ có sẵn (OCR, face, barcode…).
Phiên bản (18/10/2026) react-native-executorch 0.10.5 (6/10/2026) — bản 0.10 viết lại: thêm backend Core ML, MLX, Vulkan; yêu cầu RN ≥ 0.76, chỉ New Architecture, iOS 17+/Android 13+ · react-native-fast-tflite 3.0.1. Runtime nền: LiteRT 2.3.0 (7/10/2026 — TFLite đã đổi tên thành LiteRT từ 9/2024). tflite_flutter 0.12.1 (cuối 2025 ⚠ nguồn howto) · flutter_onnxruntime chạy ONNX Runtime 1.28.0 (Android/iOS/macOS) / 1.28.3 (desktop) · flutter_onnxruntime_genai 0.1.6.
Đường truyền dữ liệu camera → model VisionCamera + frame processors (v4.7.2, 9/2025 ⚠): frame được xử lý trong worklet trên camera thread, fast-tflite dùng zero-copy ArrayBuffer qua Nitro/JSI — không copy frame qua bridge, không serialize. Đây là pattern "frame processor" giữ reference object native mà JSI mở ra (xem Phần 5). tflite_flutter/onnxruntime qua dart:ffi: gọi trực tiếp, đồng bộ, không serialize tensor — nhưng nên chạy trong isolate riêng (IsolateInterpreter) để không block UI isolate. ML Kit qua platform channel thì frame phải qua serialize → hợp tác vụ lẻ (quét 1 ảnh), không hợp pipeline realtime dày.
Tăng tốc phần cứng Delegate theo runtime: CoreML/Metal (iOS), NNAPI/XNNPACK/GPU delegate (Android); ExecuTorch 0.10 thêm MLX + Vulkan. fast-tflite hỗ trợ GPU delegate CoreML/Metal/OpenGL. Cùng các delegate đó qua FFI (GpuDelegateV2, CoreML delegate, NNAPI). Ngang nhau — delegate là của runtime native, không phải của framework.
Hiệu năng suy luận Thời gian inference của cùng một model gần như do runtime + delegate + chip quyết định, không do framework: cả hai bên đều chạm tới cùng LiteRT/ONNX/ExecuTorch native. Khác biệt thực tế nằm ở đường đi của frame (mục trên) và chi phí copy bộ nhớ. Đo độc lập hiếm hoi (dev.to, cuối 2026, RN 0.87, chạy trên Mac/simulator — không phải số trên điện thoại ⚠): Apple Foundation Models cho structured output hợp lệ 20/20 lần vs ExecuTorch Llama 3.2 1B chỉ 2/20 — bài học là chất lượng model/engine quan trọng hơn framework bọc ngoài.
Bộ nhớ RAM ≈ kích thước model (sau lượng tử hoá) + buffer frame. Zero-copy giúp tránh nhân đôi buffer camera. LLM 1B chạy on-device là khả thi (ExecuTorch đóng gói sẵn Llama 3.2 1B) nhưng ngốn RAM theo cỡ model — không phải do RN. Tương tự: model + tensor arena của interpreter chiếm phần lớn. FFI tránh serialize nhưng quên giải phóng bộ nhớ native (FFI tự quản lý) → leak/OOM theo thời gian, đúng cảnh báo ở Phần 5. Chạy inference trong isolate cộng thêm heap của isolate đó.
Chốt Nhỉnh hơn ở camera-ML realtime (VisionCamera frame processor + zero-copy là hệ sinh thái hoàn chỉnh nhất) và ở mảng LLM on-device đóng gói sẵn (ExecuTorch, react-native-ai). Ngang sức cho inference từng ảnh/tác vụ rời; FFI rất mạnh khi model là thư viện C/C++ (vd. llama.cpp). Camera pipeline realtime cần tự ghép nhiều mảnh hơn.
⚠ Trung thực về số liệu: hiện chưa có benchmark đối đầu trực tiếp RN vs Flutter cho 3D/AR/ML được công bố với cùng thiết bị + cùng model/scene. Vì vậy phần này không trình bày biểu đồ FPS/RAM đối đầu cho 3 nhóm tác vụ — mọi con số FPS/RAM "đối đầu" trên mạng cho các tác vụ này gần như đều đo khác thiết bị, khác model. Kết luận ở đây dựa trên kiến trúc đường truyền dữ liệu và trạng thái thư viện (đã kiểm chứng ở trên), không dựa trên benchmark bịa.
Phần 4 · Đào sâu

Triển khai đa thiết bị

iOS/Android ngang nhau. Khác biệt nằm ở các nền tảng phụ: Flutter first-class gần như mọi nơi; RN dựa vào cộng đồng và Microsoft — nhưng lại thống trị mảng TV.

Nền tảngReact NativeFlutter
iOSFirst-classFirst-class
AndroidFirst-classFirst-class
Web Cộng đồng react-native-web — ổn cho UI đơn giản/app-like; web phức tạp cần kiến trúc cẩn thận. Có Tamagui (zero-runtime cho web) và React Strict DOM (mốc 2026, đơn nguồn ⚠) giúp share code mobile–web. First-class chính thức Wasm lazy loading GA từ 3.50 (11/2026). Hợp dashboard/web-app, không hợp web cần SEO.
Windows Qua Microsoft react-native-windows do Microsoft duy trì — v0.82 (2026) chỉ chạy Fabric, hỗ trợ XAML cho community modules; dùng nhiều trong enterprise (Teams, Messenger Desktop). First-class
macOS Cộng đồng/Microsoft react-native-macos. First-class
Linux Không có đường chính thức First-class
TV (Android TV / tvOS) Mạnh nhất Fork react-native-tvos theo kịp bản core; Expo có tài liệu build TV chính thức; Amazon dùng cho Fire OS/Vega, DIRECTV dùng production. Tái dùng 70–80% business logic từ app RN mobile. Thử nghiệm Android TV được, tvOS experimental; LG công bố hỗ trợ webOS từ 2024.
Embedded Không first-class Có flutter-pi, Fuchsia — chưa phổ biến rộng.

Chia sẻ code thực tế: RN ~80–90%, Flutter ~95–100% giữa iOS/Android (logic share gần hết; phần lệch là UI tinh chỉnh theo platform và native module). Lưu ý: trang TV trên docs RN chính thức đã deprecated và chuyển sang repo react-native-tvos (kiểm tra live 18/10/2026).

Đọc cho kế hoạch "sau này mở rộng": web/desktop là mục tiêu chắc chắn → Flutter lợi thế rõ (first-class, 1 codebase). Web chỉ là "có thể" và team đã có web React → RN + react-native-web/Tamagui vẫn là đường hợp lý, rẻ hơn về nhân sự.
Phần 5

Truy cập API native & module bên thứ ba

Khi cần SDK lạ (thanh toán, BLE, camera ML…), cả hai đều bắt buộc viết Swift/Kotlin — không framework nào miễn được. Khác nhau ở công cụ sinh binding và mô hình gọi.

React Native — TurboModules + Codegen

  • Định nghĩa spec bằng TypeScript → Codegen tự sinh binding C++/Kotlin/Swift type-safe.
  • JS gọi native đồng bộ qua JSI, giữ được reference tới object native — mở ra pattern trước đây bất khả thi (vd. frame processor của VisionCamera).
  • Expo Modules API làm việc viết module Swift/Kotlin đơn giản hơn nhiều so với thời viết thủ công.
  • ⚠ Mọi module native cũ kiểu bridge JSON phải viết lại mới chạy từ 0.85. Khi audit thư viện bên thứ ba: ~85% package phổ biến đã tương thích New Architecture (2026), ~15% còn bridge-only/hỗ trợ một phần (nguồn pkgpulse — đơn nguồn ⚠, nên tự audit react-native-directory khi chốt dependency).

Flutter — 3 tầng, chọn theo việc

  • MethodChannel/EventChannel: dễ nhất, bất đồng bộ + serialize message; nhưng "stringly-typed" — tên method/arg khớp bằng tay, sai thì nổ lúc runtime.
  • Pigeon: codegen type-safe trên nền platform channel — khuyến nghị chính thức khi API native lớn; vẫn kế thừa mô hình async/serialize nên chậm hơn FFI ở hot path.
  • dart:ffi: gọi trực tiếp, đồng bộ hàm C/C++, không serialize — hợp thư viện C và tính toán nặng (vd. chạy LLM local qua llama.cpp); nhưng tự quản lý bộ nhớ (quên free → leak, OOM sau thời gian dài). Từ Flutter 3.38: flutter create --template=package_ffi + build hooks + ffigen.
  • Từ 3.29, Dart có thể chạy trên platform thread trong một số kịch bản → giảm nhảy thread quanh platform channel/FFI.

Với SDK vendor chỉ có sẵn cho iOS/Android native (không wrapper), chi phí viết wrapper tương đương nhau. RN có bề dày module cộng đồng hơn cho tích hợp "dị"; Flutter có Pigeon sạch hơn cho API lớn và FFI vượt trội khi SDK là thư viện C/C++.

Phần 6

Trải nghiệm developer & tuyển dụng

TypeScript thắng ở pool nhân lực; Dart thắng ở tính nhất quán của toolchain. Ở Việt Nam, đây thường là yếu tố quyết định hơn cả benchmark.

10–15×
Pool dev RN lớn gấp bấy nhiêu lần Flutter (job posting LinkedIn Mỹ: RN ~6.400 vs Flutter ~1.070)
2–4 tuần
Thời gian dev JS giỏi làm việc hiệu quả với Dart (biết TS/Kotlin/Swift thì 1–2 tuần)
+35%
Tăng trưởng nhu cầu tuyển Flutter tại Việt Nam trong 2025 — thị trường đang nóng lên nhanh
₫15–120tr
Dải lương Flutter tại VN theo level (Second Talent, 5/2026 ⚠ nguồn tuyển dụng); freelance Flutter TP.HCM $13–27/giờ (Upwork)

Ngôn ngữ & tuyển người

  • TypeScript (RN): team đã làm web React/Node → gần như không có đường cong học cho mobile; share được logic/API client/validation với web.
  • Dart (Flutter): ngôn ngữ hiện đại (null safety, records, patterns, sealed class từ Dart 3). Rào cản không phải độ khó mà là độ phổ biến.
  • Lương senior Mỹ: Flutter cao hơn 10–20% ($135–180k vs $125–160k) — do khan hiếm, không phải do giỏi hơn. Tuyển senior RN ở Mỹ mất 4–8 tuần vs Flutter 8–16 tuần.
  • Ở VN: tuyển RN dễ và rẻ hơn; các công ty như Globant, AgileTech (Hà Nội) tuyển cả hai.

Hot reload & debugging

  • Cả hai đều hot reload giữ state. Đo 2026: Flutter ~300ms; RN Fast Refresh ~500ms–1s (thi thoảng vẫn cần restart).
  • RN DevTools nay là app desktop độc lập: network panel (log fetch/XHR/image kèm header/timing + chỉ ra dòng code gọi request), performance tracing hợp nhất. "Debug JS Remotely" cũ bị xóa từ 0.79.
  • Flutter DevTools: profiling hiệu năng được đánh giá trưởng thành hơn; widget inspector mạnh.
Expo 2026 (docs RN chính thức khuyên bắt đầu project mới bằng Expo/framework): SDK 57 (30/6/2026, RN 0.86), SDK 58 beta (15/9/2026, RN 0.88 RC, build cho iOS 27, Expo Modules 2.0 beta), SDK 56 (21/5/2026, RN 0.85: Hermes V1 mặc định, diffed updates bật mặc định), SDK 55 (2/2026: bỏ kiến trúc cũ). Dùng bare RN khi: nhúng RN vào app native sẵn có (kiểu Shopify), SDK native "đánh nhau" với build Expo, hoặc team native muốn toàn quyền Xcode/Gradle. ⚠ Một nguồn cho biết "Expo Go cho SDK 56 không còn trên App Store/Play Store" — đơn nguồn, chưa xác minh. Flutter tooling: một toolchain gọn (1 ngôn ngữ, 1 CLI flutter), CI/CD tốt với GitHub Actions/Codemagic/Bitrise; FlutterFlow là builder low-code "gần chính thức".
Phần 7

Cập nhật OTA (over-the-air)

Cập nhật JS/Dart mà không qua review store. Giới hạn chung của cả hai: OTA chỉ cho code JS/Dart, style, asset — đụng native code, quyền, entitlement, SDK version, icon, splash, app extension → bắt buộc build store mới.

React Native — EAS Update là đường chính

  • CodePush đã chết: Microsoft App Center retired 31/3/2025, repo client/server bị archive (5/2025). Đừng bắt đầu project mới bằng tutorial CodePush cũ.
  • EAS Update (mặc định với Expo, chạy được cho bare RN): Hermes bytecode diffing (~58% nhẹ hơn), channel-based rollout, rollback, tự dừng khi crash tăng.
  • Giá công bố 6/10/2026 ⚠ (nguồn blog, nên đối chiếu expo.dev/pricing): Free $0 (1.000 update users) · Starter $19/tháng (3.000 users) · Production $199/tháng (50.000 users) · Enterprise custom (1M users).
  • Phương án khác: Bitrise CodePush (fork SDK Microsoft, free 100k MAU), Hot Updater (open-source, tự host), Revopush, Stallion, Codemagic Patch — đều hỗ trợ New Architecture từ RN 0.76.

Flutter — Shorebird

  • Shorebird: engine Flutter tùy biến + per-function linker + interpreter; shorebird release / shorebird patch; patch chỉ Dart (không native/asset), tải nền lúc mở app, áp dụng khi restart.
  • Giá: free 5.000 patch installs/tháng · Pro $20/tháng (50k installs) · Business $400/tháng (1M) · vượt gói $1/2.500 installs — chỉ tính tiền lượt cài patch thực tế (Expo tính theo MAU).
  • Ví dụ 500k users patch hàng tháng: Shorebird ~$400/tháng (~$4.800/năm) vs kịch bản tương đương phía Expo ~$25–30k/năm ⚠ (nguồn shorebird.dev — blog của vendor, mang tính marketing; tự tính lại theo MAU thực tế).
Chính sách store (cả hai): Apple Guideline 2.5.2 / DPLA §3.3.2 cho phép tải interpreted code nếu không đổi mục đích chính của app, không tạo store lậu, không bypass review — bug fix, chỉnh UI, content update, A/B test thì ok; "nhét" tính năng lớn chưa từng được review thì vi phạm. Shorebird cho code patch chạy qua interpreter trên iOS để tuân thủ; Google Play cấm tự-update ngoài Play, ngoại lệ cho code chạy trong VM/interpreter. OTA là cách làm hành vi đã được review an toàn hơn, không phải đường vòng review.
Phần 8

Hệ sinh thái & cộng đồng 2026

Chỉ số (giữa–cuối 2026)React NativeFlutter
Package registrynpm 2M+ (ước ~400k dùng được cho RN); React Native Directory: 2.707 thư viện (25/9/2026)pub.dev ~40–45k packages, có hệ thống scoring lọc chất lượng
Download / tuầnreact-native ~9,7–11M (npm)n/a (pub.dev)
GitHub stars~126k~178k
Stack Overflow surveyUsage 8,4% · admired 56,5%Usage 9,4% · admired 60,6%
FirebaseCộng đồng duy trìFirst-party (FlutterFire)

Flutter — "mở hộp là đẹp"

Material 3 mặc định + Cupertino — bộ UI "chính hãng", đồng nhất, ít phải chọn. Đánh đổi: muốn thoát khỏi chất Material/Cupertino mặc định thì phải tự custom nhiều hơn.

React Native — linh hoạt, tốn 1 quyết định đầu dự án

  • NativeWind v4/v5 — Tailwind CSS cho RN, web parity, dark mode, container queries; hợp team quen Tailwind, prototype nhanh.
  • Tamagui 3 — compiler sinh atomic style, native runtime (beta): apply theme/style thẳng lên Fabric view không re-render React (cần RN 0.82+); zero-runtime cho web. Hợp design system dùng chung mobile + web.
  • Unistyles 3.0 — nhẹ (~40KB), cú pháp gần StyleSheet, tích hợp JSI/Fabric (đổi theme không qua JS thread), TypeScript xuất sắc.
  • Ngoài ra: Gluestack-UI, React Native Paper (Material).
Phần 9

App lớn đang dùng (production)

React Native

Meta — Facebook, Instagram, Messenger (một phần) · Shopify (toàn bộ mobile apps, cam kết từ 2020) · Microsoft — Office mobile, Outlook, Teams, Xbox · Discord (iOS) · Coinbase · Walmart · Bloomberg · Pinterest · Tesla · Duolingo (~95% app)

Flutter

Google Pay (gộp 1,7 triệu dòng code iOS+Android thành 1 codebase, 100M+ users) · Google Ads, Classroom, Earth, NotebookLM · BMW (My BMW) · Toyota (infotainment RAV4 2026) · Alibaba Xianyu (50M+ users — app Taobao chính không phải Flutter) · Nubank (80–100M+ users) · ByteDance/Lark · Tencent · eBay Motors · Philips Hue · Wolt · KFC India · Hamilton

Ghi chú: case Airbnb rời RN năm 2018 vẫn hay bị trích — đã lỗi thời, xảy ra trước New Architecture 5+ năm, không còn giá trị tham chiếu.

Phần 10

Khung quyết định: khi nào chọn bên nào

Tiêu chí→ Chọn React Native→ Chọn Flutter
1 · Team hiện cóTeam đã biết JS/TS/React (đặc biệt có web React) — lên tay ngay, share được logic/API client/validation với web.Team bắt đầu từ số 0, hoặc team mobile thuần không vướng JS — học Dart 2–4 tuần rồi đi một mạch.
2 · Web/desktop sau nàyWeb là "có thể", hoặc web app React đã tồn tại → share logic qua RN Web/Tamagui.Web/desktop là mục tiêu chắc chắn → Flutter first-class cả 5 nền tảng từ 1 codebase.
3 · UI / hiệu năngCần cảm giác native từng platform "miễn phí"; nhúng sâu SDK native (map, camera pipeline, BLE, AR).Animation nặng, custom UI, pixel-perfect đồng nhất mọi máy; 120fps; vẽ canvas/chart/telemetry realtime.
4 · Ngân sách & tuyển dụng (VN)Ngân sách hạn chế, cần scale team nhanh ở VN — pool JS lớn gấp 10–15 lần, lương mềm hơn.Chấp nhận trả premium 10–20% và tuyển lâu hơn, đổi lấy toolchain gọn + ít bug lệch platform dài hạn.
5 · Vận hành sau releaseCần OTA mạnh, rẻ, trưởng thành (EAS Update: diff nhỏ, rollback, crash-halt) để hotfix hàng ngày.Chấp nhận OTA Dart-only qua Shorebird (phí theo lượt cài), hoặc release theo nhịp store truyền thống.
6 · 3D / AR / AI on-device3D three.js, AR (ViroReact + Quest/visionOS), camera-ML realtime (VisionCamera frame processor), LLM on-device đóng gói sẵn.3D chỉ ở mức viewer model; ML qua FFI rất mạnh với thư viện C/C++; AR cơ bản đủ dùng.
Luật ngón tay cái: Startup VN có team JS → RN + Expo (nhanh nhất, rẻ nhất, OTA tốt nhất). App "brand-first", animation là linh hồn sản phẩm → Flutter. Roadmap có desktop/web app thật → Flutter. Roadmap có TV → RN. App CRUD/form/list chuẩn → không có đáp án sai; hãy chọn theo team mình có, không theo benchmark.
Phần 11

Bảng tổng hợp so sánh nhanh

React NativeFlutter
Chủ quảnMeta → React Foundation (Linux Foundation)Google
Ngôn ngữTypeScript / JavaScriptDart
Bản mới nhất (18/10/2026)0.87 (docs); 0.88 vừa release ~15/10 ⚠3.47.7 (10/10/2026); 3.50 stable 11/2026
Kiến trúc 2026JSI + Fabric + TurboModules; bridge cũ đã xóa (0.85); Hermes V1 mặc địnhDart AOT; Impeller thay Skia (xóa nốt trên Android 10+ ở 3.50)
Vẽ UINative view thậtTự vẽ từng pixel
Cold startNhanh (thua Flutter ~25–30%)Nhanh hơn
FPS animation nặng60fps đa số case (Reanimated v4); đuối ở particle/canvas cực nặng60–120fps ổn định
RAM / app sizeTương đương; nhỉnh hơn một chút ở build tối giản (Hermes bytecode)Nhỉnh hơn một chút ở app thật
Web / DesktopCộng đồng (RN Web; Win/macOS via Microsoft)First-class
TVMạnh nhất (react-native-tvos, Expo TV)Thử nghiệm
3Dthree.js + R3F 9.8 — hệ sinh thái 3D lớn nhấtViewer qua WebView (flutter_3d_controller 2.3); flame_3d 0.3 thử nghiệm
ARViroReact 2.57 — ARKit/ARCore + Quest + visionOSar_flutter_plugin (cộng đồng, nhịp chậm) ⚠
AI/ML on-deviceExecuTorch 0.10.5 · fast-tflite (zero-copy) · ONNX · VisionCamera frame processortflite_flutter (FFI) · flutter_onnxruntime (ORT 1.28) · ML Kit
Native moduleTurboModules + Codegen (đồng bộ qua JSI)MethodChannel / Pigeon (codegen) / dart:ffi
Hot reloadFast Refresh (~0,5–1s)~300ms, giữ state tốt
OTAEAS Update (trưởng thành); CodePush chết 3/2025Shorebird (phí theo lượt cài)
UI libraryNativeWind / Tamagui 3 / Unistyles 3 (phải chọn)Material 3 + Cupertino (có sẵn)
Packagenpm 2M+ (~400k dùng được); RN Directory 2.707 libpub.dev ~45k (có scoring)
Tuyển dụng VNDễ, rẻ (pool JS khổng lồ)Khó hơn, lương cao hơn, cầu +35%/2025
App lớnInstagram, Shopify, Teams, Tesla, DuolingoGoogle Pay, BMW, Toyota, Nubank, Xianyu
Chọn khiTeam JS sẵn; cần native-feel; cần OTA; có web ReactAnimation nặng; cần web/desktop 1 codebase; team từ số 0
Minh bạch

Chưa xác minh được ⚠ — cần kiểm tra thêm trước khi chốt

  1. RN 0.88 stable chính thức: docs reactnative.dev ngày 18/10/2026 vẫn ghi 0.87; GitHub/devtalk ghi 0.88.0 release 15/10/2026 — có thể docs chậm cập nhật vài ngày. Check lại reactnative.dev/versions.
  2. Giá EAS (Free/Starter/Production/Enterprise) lấy từ blog zyneto "công bố 6/10/2026" — đối chiếu expo.dev/pricing trước khi lập ngân sách.
  3. "Expo Go cho SDK 56 không còn trên store" — đơn nguồn (dev.to); nếu workflow dev phụ thuộc Expo Go thì phải verify.
  4. Số Expensify/Hermes V1 (TTI +7,6% Android / +2,5% iOS) — trích 1 bài, chưa có nguồn độc lập thứ hai.
  5. React Strict DOM / "share 90% code mobile–web" — đơn nguồn blog zignuts; coi là định hướng, chưa phải thực tế phổ biến.
  6. Số liệu lương/tuyển VN (Second Talent, Upwork) là nguồn marketing/tuyển dụng — đúng hướng nhưng thiếu khảo sát độc lập (vd. ITviec/TopDev report).
  7. So sánh chi phí OTA Shorebird vs EAS ($4,8k vs $25–30k/năm) lấy từ blog của chính Shorebird — mang tính marketing, cần tự tính lại theo MAU thực tế.
  8. Benchmark tuyệt đối khác nhau giữa các nguồn (thiết bị/app đo khác nhau) — trong trang này chỉ dùng làm khoảng tham chiếu; quyết định nên dựa vào prototype đo trên máy mục tiêu.
  9. Phiên bản thư viện 3D/AR/ML kiểm tra live 18/10/2026 qua npm/pub.dev/docs chính thức của từng dự án; riêng tflite_flutter 0.12.1 và VisionCamera 4.7.2 lấy từ nguồn howto/blog — kiểm tra lại trên pub.dev/npm khi chốt dependency. Nhịp bảo trì của ar_flutter_plugin được đánh giá từ lịch sử phiên bản phổ biến (0.6.x/0.7.x), nên audit trực tiếp repo trước dự án AR nghiêm túc.
  10. Chưa có benchmark đối đầu RN vs Flutter cho 3D/AR/ML trên cùng thiết bị + cùng model/scene được công bố — phần 3 vì thế trình bày theo kiến trúc và trạng thái thư viện, không có biểu đồ đối đầu.
Tham chiếu

Nguồn đã dùng

Báo cáo nghiên cứu kiểm tra live ngày 18/10/2026, cộng phần kiểm tra phiên bản thư viện 3D/AR/ML cùng ngày.