Xin chào các đồng nghiệp developer trên Lộ trình React! Chúng ta đã cùng nhau đi qua một chặng đường khá dài, khám phá những viên gạch nền tảng vững chắc để xây dựng nên các ứng dụng web hiện đại với React. Từ React là gì, cách Hiểu về JSX, quản lý State và Props, đến làm việc với Hooks mạnh mẽ (useState, useEffect), và thậm chí là tạo Custom Hooks hay quản lý State phức tạp với Context hoặc Redux Toolkit. Chúng ta đã sẵn sàng chinh phục thế giới Frontend trên trình duyệt web.
Tuy nhiên, trong thế giới phát triển phần mềm, ứng dụng không chỉ tồn tại trên web. Mobile Apps đóng vai trò cực kỳ quan trọng. Và đây là lúc chúng ta gặp một cái tên nghe rất quen thuộc, nhưng lại có những khác biệt cốt lõi: React Native.
Nếu bạn từng thắc mắc: “Tôi đã học React Web rồi, vậy chuyển sang làm Mobile App với React Native có dễ không? Chúng giống và khác nhau ở điểm nào?”, thì bài viết này chính là dành cho bạn. Chúng ta sẽ cùng nhau mổ xẻ sự khác biệt then chốt giữa React và React Native để giúp bạn định hình rõ hơn con đường tiếp theo trong lộ trình phát triển của mình.
Mục lục
Điểm Chung: Gia Đình React
Trước khi đi sâu vào khác biệt, hãy nhìn vào những điểm chung quan trọng nhất:
- Cốt lõi React: Cả React và React Native đều sử dụng cùng một thư viện React để xây dựng giao diện người dùng. Điều này có nghĩa là các khái niệm cốt lõi như Component, State, Props, JSX, Hooks (useState, useEffect, useContext, custom hooks…), Virtual DOM (mặc dù cách “render” cuối cùng khác nhau), lifecycle (vòng đời component)… đều tương tự nhau. Nếu bạn đã vững React Web, bạn đã nắm được 80% lý thuyết nền tảng của React Native.
- Ngôn ngữ: Cả hai đều sử dụng JavaScript (thường là kết hợp với TypeScript).
- Triết lý: Đều tuân theo triết lý phát triển component-based, khai báo (declarative) và quản lý state hiệu quả.
- Công cụ: Nhiều công cụ chung có thể được sử dụng như Babel (transpiling), Webpack (đóng gói – dù cấu hình khác), ESLint, Prettier, các thư viện quản lý state (Redux, MobX, Recoil, Zustand…), thư viện gọi API (Axios, Fetch),…
Nhờ những điểm chung này, một lập trình viên React Web có thể chuyển đổi sang React Native (hoặc ngược lại) dễ dàng hơn rất nhiều so với việc học một framework/ngôn ngữ hoàn toàn mới như Swift/Kotlin (Native Mobile) hay Angular/Vue (Web Framework khác).
Sự Khác Biệt Cốt Lõi: Nền Tảng Render
Đây là khác biệt quan trọng nhất và là nguồn gốc của hầu hết các khác biệt còn lại:
- React (cho Web): Render ra các phần tử DOM (Document Object Model) chuẩn của trình duyệt (như
<div>
,<p>
,<button>
,<input>
, v.v.). React thao tác với Virtual DOM và sau đó cập nhật DOM thật một cách hiệu quả. Giao diện được hiển thị thông qua trình duyệt web. - React Native (cho Mobile): Render ra các Native Components của nền tảng di động (iOS và Android). Ví dụ: thay vì
<div>
, bạn dùng<View>
; thay vì<p>
hay<span>
, bạn dùng<Text>
; thay vì<button>
, bạn dùng<Button>
hoặc<TouchableOpacity>
. React Native sử dụng một “cầu nối” (Bridge hoặc Fabric Architecture mới hơn) để giao tiếp giữa mã JavaScript của bạn và các API UI gốc của hệ điều hành. Giao diện được hiển thị trực tiếp bởi hệ điều hành, mang lại trải nghiệm và hiệu năng gần như ứng dụng native viết bằng ngôn ngữ gốc.
Sự khác biệt này quyết định cách bạn xây dựng giao diện, cách bạn style, cách bạn tương tác với môi trường xung quanh (trình duyệt vs thiết bị di động).
Giao Diện Người Dùng (UI Components)
Vì nền tảng render khác nhau, các component UI cơ bản cũng khác nhau:
- React (Web): Sử dụng các thẻ HTML chuẩn. Bạn viết JSX trông giống HTML:
function GreetWeb({ name }) {
return (
<div style={{ padding: '20px', border: '1px solid blue' }}>
<h1>Xin chào, {name}!</h1>
<p>Đây là một đoạn văn trên web.</p>
<button onClick={() => alert('Bạn vừa click nút Web!')}>Click tôi</button>
</div>
);
}
- React Native (Mobile): Sử dụng các component được cung cấp bởi thư viện React Native. Bạn viết JSX trông tương tự, nhưng các thẻ là Native Components:
import { View, Text, Button, StyleSheet } from 'react-native';
function GreetMobile({ name }) {
return (
<View style={styles.container}>
<Text style={styles.title}>Xin chào, {name}!</Text>
<Text>Đây là một đoạn văn trên mobile.</Text>
<Button
title="Click tôi"
onPress={() => alert('Bạn vừa click nút Mobile!')}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
padding: 20,
borderWidth: 1, // Sử dụng borderWidth thay vì border
borderColor: 'blue',
},
title: {
fontSize: 24,
fontWeight: 'bold',
},
});
Bạn sẽ thấy các component như View
, Text
, Image
, ScrollView
, TextInput
là những khối xây dựng cơ bản trong React Native, thay thế cho <div>
, <p>
, <img>
, <div style="overflow: scroll">
, <input type="text">
trên web.
Styling (Tạo Phong Cách)
Đây cũng là một điểm khác biệt lớn xuất phát từ nền tảng render:
- React (Web): Sử dụng CSS. Bạn có thể viết CSS truyền thống trong file
.css
, sử dụng CSS Modules, các thư viện CSS-in-JS (Styled Components, Emotion), hoặc các framework Utility-First (Tailwind CSS). Styling thường dựa trên các bộ chọn CSS (class, id, tag). - React Native (Mobile): Sử dụng JavaScript để style. Thay vì CSS, bạn dùng đối tượng JavaScript theo kiểu camelCase để định nghĩa style. Style được áp dụng trực tiếp vào component thông qua prop
style
. React Native cung cấp APIStyleSheet.create
để tạo và quản lý style, giúp tối ưu hóa hiệu năng và dễ đọc hơn. Các thuộc tính style cũng khác với CSS (ví dụ:padding
thànhpadding
,border-width
thànhborderWidth
,flex-direction
thànhflexDirection
, không códiv:hover
,p::before
, v.v.). Flexbox là mô hình layout chính trong React Native.
Ví dụ style trong React Native:
import { StyleSheet } from 'react-native';
const styles = StyleSheet.create({
container: {
flex: 1, // Thay vì display: 'flex' và flex-grow: 1
backgroundColor: '#fff',
alignItems: 'center', // Tương tự align-items trong CSS Flexbox
justifyContent: 'center', // Tương tự justify-content
},
textBold: {
fontWeight: 'bold',
color: 'red',
},
});
Điều Hướng (Navigation)
Web và Mobile có các pattern điều hướng khác nhau:
- React (Web): Sử dụng các thư viện routing dựa trên URL của trình duyệt, phổ biến nhất là React Router. Điều hướng giữa các trang thông qua việc thay đổi URL.
- React Native (Mobile): Sử dụng các thư viện navigation mô phỏng hành vi navigation của ứng dụng native (như Stack Navigator, Tab Navigator, Drawer Navigator). Thư viện phổ biến nhất hiện nay là React Navigation. Việc điều hướng là quản lý stack các màn hình.
Bạn sẽ không sử dụng <a href="...">
hay useNavigate
từ React Router trong React Native (mặc dù React Navigation có hook tương tự). Thay vào đó, bạn dùng các component và hooks của thư viện navigation được chọn (ví dụ: navigation.navigate('ScreenName')
).
Truy Cập API Nền Tảng
Ứng dụng mobile cần tương tác với các tính năng của thiết bị mà trình duyệt web không có quyền truy cập trực tiếp:
- React (Web): Tương tác với các Web APIs chuẩn (như Local Storage, Geolocation API của trình duyệt, Fetch API để gọi mạng) và DOM API (Refs cho phép truy cập DOM element).
- React Native (Mobile): Tương tác với các Native Device APIs (camera, microphone, GPS, danh bạ, push notifications, bộ nhớ cục bộ của thiết bị, v.v.). React Native cung cấp các module tích hợp sẵn cho một số tính năng cơ bản, và có một hệ sinh thái các thư viện cộng đồng rất phong phú để truy cập hầu hết các API gốc. Nếu cần, bạn có thể viết Native Module bằng Swift/Kotlin/Objective-C/Java và gọi chúng từ JavaScript.
Môi Trường Phát Triển và Công Cụ
- React (Web): Thường bắt đầu với Create React App (CRA – so sánh với Vite) hoặc Vite cho các dự án client-side rendering (CSR). Đối với Server-Side Rendering (SSR) hoặc Static Site Generation (SSG), các framework như Next.js hoặc Remix là phổ biến. Phát triển và debug chủ yếu trên trình duyệt.
- React Native (Mobile): Có hai cách khởi tạo chính:
- Expo CLI: Dễ dàng bắt đầu, quản lý nhiều cấu hình native cho bạn. Thích hợp cho các ứng dụng không cần nhiều tính năng native tùy chỉnh phức tạp hoặc sử dụng các thư viện native không được Expo hỗ trợ sẵn. Cho phép test nhanh trên thiết bị thật bằng app Expo Go.
- React Native CLI: Yêu cầu cấu hình môi trường native (Android Studio, Xcode) phức tạp hơn. Cung cấp quyền kiểm soát hoàn toàn đối với dự án native, cần thiết khi sử dụng các thư viện native đặc thù hoặc cần tùy chỉnh sâu ở lớp native.
Phát triển và debug thường thông qua các công cụ tích hợp (Metro bundler), debug trên thiết bị thật hoặc giả lập, và sử dụng các công cụ native debugger.
Bạn cần cài đặt môi trường phát triển Android/iOS (JDK, Android SDK, Xcode trên macOS) để làm việc hiệu quả với React Native CLI hoặc khi muốn build ứng dụng cuối cùng với Expo.
Hiệu Năng
- React (Web): Hiệu năng phụ thuộc vào nhiều yếu tố: độ phức tạp của DOM, cách bạn tối ưu hóa component (useMemo, useCallback), kích thước bundle, tốc độ mạng, hiệu năng trình duyệt và thiết bị của người dùng.
- React Native (Mobile): Vì render ra Native Components, hiệu năng thường rất tốt và gần với ứng dụng native. Việc render giao diện được xử lý bởi luồng native UI, không phải luồng JavaScript. Cầu nối (Bridge/Fabric) có thể là điểm nghẽn nếu có quá nhiều thông tin được truyền qua lại liên tục, nhưng nhìn chung, trải nghiệm người dùng mượt mà hơn so với các giải pháp Hybrid khác sử dụng WebView.
Chia Sẻ Mã (Code Sharing)
Một trong những lợi ích của việc dùng React/React Native là khả năng chia sẻ mã. Tuy nhiên, không phải mọi thứ đều có thể chia sẻ:
- Logic chung: Code xử lý logic nghiệp vụ, gọi API, quản lý state (Redux store, Context provider), các hàm tiện ích (utility functions), validation logic (React Hook Form validation schema)… có thể được chia sẻ giữa dự án React Web và React Native.
- Component UI và Styling: Hầu như không thể chia sẻ trực tiếp. Một component
<button>
trên web không thể chạy trên React Native, và ngược lại, một component<View>
không có nghĩa gì với trình duyệt. Styling cũng hoàn toàn khác nhau. Có các thư viện như React Native Web cố gắng giải quyết vấn đề này bằng cách ánh xạ Native Components sang DOM, nhưng nó có những giới hạn và không phải lúc nào cũng mang lại trải nghiệm tối ưu trên cả hai nền tảng.
Vì vậy, khi làm việc với cả hai, bạn thường tổ chức mã nguồn để tách biệt rõ ràng logic chung và giao diện đặc thù cho từng nền tảng.
Xử Lý Nền Tảng Cụ Thể (Platform Specific)
Mặc dù React Native cho phép viết mã một lần chạy trên cả iOS và Android, đôi khi bạn cần xử lý khác nhau cho từng nền tảng (ví dụ: giao diện khác một chút, sử dụng API chỉ có trên một HĐH). React Native hỗ trợ điều này thông qua:
- Platform Module: Sử dụng
Platform.OS
('ios'
hoặc'android'
) để viết logic điều kiện. - Platform-Specific File Extensions: Sử dụng các file có đuôi
.ios.js
hoặc.android.js
. Khi import một file (ví dụ:Button.js
), React Native sẽ tự động chọnButton.ios.js
hoặcButton.android.js
tùy thuộc vào nền tảng đang chạy.
Điều này không tồn tại trong React Web vì bạn chỉ nhắm mục tiêu một nền tảng duy nhất (trình duyệt).
Bảng Tóm Tắt Khác Biệt Chính
Để dễ hình dung, dưới đây là bảng tóm tắt các khác biệt quan trọng:
Tính năng | React (cho Web) | React Native (cho Mobile) |
---|---|---|
Mục đích chính | Xây dựng giao diện Web Apps | Xây dựng Native Mobile Apps (iOS & Android) |
Nền tảng Render | DOM (Trình duyệt) | Native UI Components (iOS & Android) |
Component UI cơ bản | HTML tags (<div> , <p> , <button> , …) |
React Native Components (<View> , <Text> , <Button> , …) |
Styling | CSS (File CSS, CSS-in-JS, Utility-first) | JavaScript Style Objects (StyleSheet.create ), dùng prop style |
Layout | CSS Box Model, Flexbox, Grid, positioning… | Flexbox (mô hình chính), một số thuộc tính style native |
Navigation | Routing dựa trên URL (React Router) | Navigation Stack, Tabs, Drawer (React Navigation) |
Truy cập API nền tảng | Web APIs, DOM API | Native Device APIs (Camera, GPS, Storage…), Native Modules |
Phân phối ứng dụng | Triển khai lên Web Server | Đóng gói thành IPA (iOS) và APK/AAB (Android) và phân phối qua App Stores |
Môi trường Dev | Trình duyệt, Node.js, Webpack/Vite | Giả lập/Thiết bị thật, Metro bundler, Node.js, Android Studio/Xcode |
Kiểm thử UI | React Testing Library (cho DOM), Cypress/Playwright (E2E) | React Native Testing Library, Detox (E2E) |
Khi Nào Chọn React, Khi Nào Chọn React Native?
Quyết định phụ thuộc vào mục tiêu của bạn:
- Chọn React (Web) khi:
- Bạn muốn xây dựng trang web động, ứng dụng web (web app), hoặc single-page application (SPA).
- Mục tiêu là chạy ứng dụng trên trình duyệt desktop và mobile thông qua web.
- Bạn muốn tận dụng tối đa hệ sinh thái và các công cụ phát triển web truyền thống.
- Chọn React Native khi:
- Bạn muốn xây dựng ứng dụng mobile native cho iOS và Android từ một codebase duy nhất.
- Bạn cần truy cập các tính năng native của thiết bị (camera, GPS, offline storage hiệu quả…).
- Bạn muốn ứng dụng có hiệu năng và trải nghiệm người dùng gần giống với ứng dụng viết bằng ngôn ngữ native.
- Bạn có đội ngũ đã quen thuộc với React và muốn mở rộng sang phát triển mobile.
Đôi khi, các công ty chọn xây dựng cả ứng dụng web (React) và ứng dụng mobile (React Native) và chia sẻ phần lớn logic nghiệp vụ để tiết kiệm thời gian và công sức.
Kết Luận
React và React Native là hai công cụ mạnh mẽ, sinh ra từ cùng một ý tưởng cốt lõi của Facebook, nhưng phục vụ hai mục đích khác nhau: Web và Mobile Native. Nếu React là “ông vua” của Frontend Web hiện đại, thì React Native là một trong những lựa chọn hàng đầu cho Cross-Platform Mobile Development.
Việc bạn đã nắm vững React Web là một lợi thế cực lớn khi muốn chuyển sang React Native. Các khái niệm về component, state, props, JSX, Hooks… sẽ giúp bạn làm quen rất nhanh. Thử thách chính sẽ nằm ở việc học các component UI mới, hệ thống styling khác biệt, cách quản lý navigation và tương tác với các API native.
Nếu lộ trình React của bạn có đích đến là phát triển mobile app, thì việc tìm hiểu sâu hơn về React Native là bước đi hoàn toàn hợp lý. Bài viết “Bắt Đầu Với React Native Cho Lập Trình Viên Web” trong series này sẽ là điểm khởi đầu tuyệt vời cho bạn.
Chúc bạn thành công trên con đường chinh phục cả Web và Mobile với sức mạnh của React! Hẹn gặp lại trong các bài viết tiếp theo của series React Roadmap!