Hướng Dẫn Phát Triển Ứng Dụng React Native 2026: Xây Dựng Ứng Dụng Production và Câu Hỏi Phỏng Vấn
Hướng dẫn toàn diện về phát triển ứng dụng React Native 2026 bao gồm New Architecture, Expo SDK 56, Hermes V1, và các câu hỏi phỏng vấn dành cho developer React Native.

Phát triển ứng dụng React Native năm 2026 tập trung vào New Architecture, Expo SDK 56, và các công cụ sẵn sàng cho production đã trưởng thành đáng kể trong năm qua. Hướng dẫn này đề cập đến quy trình làm việc thực tế để xây dựng ứng dụng production và giải đáp các câu hỏi phỏng vấn phổ biến giúp phân biệt các developer React Native có kinh nghiệm.
Stack production được khuyến nghị: Expo SDK 56 với EAS Build, React Native 0.85+, Hermes V1 engine, và New Architecture được bật mặc định. Thời gian build giảm 16% trên iOS và 60% trên Android so với SDK 55.
Thiết Lập Dự Án React Native Sẵn Sàng Production
Bắt đầu một dự án React Native mới vào năm 2026 có nghĩa là chọn giữa Expo (được khuyến nghị) và bare React Native. Expo đã phát triển từ một wrapper thân thiện với người mới thành đề xuất chính thức từ đội ngũ React Native cho hầu hết các ứng dụng production.
# Tạo dự án Expo mới với SDK 56
npx create-expo-app@latest my-production-app
cd my-production-app
# Xác minh New Architecture đã được bật (mặc định từ RN 0.76)
npx expo config --type introspect | grep newArchEnabledNew Architecture, bao gồm Fabric, TurboModules, và JSI, loại bỏ JSON bridge bất đồng bộ gây ra các bottleneck hiệu suất trong các ứng dụng phức tạp. JavaScript giờ có thể gọi các module native một cách đồng bộ, loại bỏ toàn bộ một danh mục lỗi timing.
{
"expo": {
"name": "MyProductionApp",
"slug": "my-production-app",
"version": "1.0.0",
"newArchEnabled": true, // Mặc định trong SDK 56
"android": {
"package": "com.company.myproductionapp",
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
}
},
"ios": {
"bundleIdentifier": "com.company.myproductionapp",
"supportsTablet": true
},
"plugins": [
"expo-router"
]
}
}Expo Router đã trở thành tiêu chuẩn cho navigation, mang đến routing dựa trên file tương tự như Next.js. Cấu trúc thư mục /app được ánh xạ trực tiếp tới các route.
Hermes V1 Engine và Hiệu Suất JavaScript
Hermes V1 được ra mắt như JavaScript engine mặc định trong React Native 0.84, thay thế cả JavaScriptCore và Hermes phiên bản cũ. Compiler và virtual machine mới mang lại thực thi bytecode nhanh hơn, dung lượng bộ nhớ thấp hơn, và phân phối pause garbage collection tốt hơn.
// Giám sát hiệu suất với Hermes V1
// HermesInternal có sẵn toàn cục khi chạy trên Hermes
declare global {
var HermesInternal: {
getRuntimeProperties: () => Record<string, unknown>;
enableSamplingProfiler: () => void;
disableSamplingProfiler: () => string;
} | undefined;
}
export function checkHermesStatus(): boolean {
const isHermes = typeof HermesInternal === 'object' && HermesInternal !== null;
if (isHermes && __DEV__) {
const props = HermesInternal.getRuntimeProperties();
console.log('Hermes version:', props['OSS Release Version']);
console.log('Bytecode version:', props['Bytecode Version']);
}
return isHermes;
}Hermes V1 biên dịch trước JavaScript thành bytecode trong quá trình build. Điều này loại bỏ việc phân tích JavaScript tại runtime, chiếm một phần đáng kể thời gian khởi động ứng dụng. Các bản build production có Time to Interactive nhanh hơn 10-30% so với JSC.
Build Với EAS Build và Biên Dịch Tối Ưu
EAS Build xử lý các bản build production trên cloud với caching, signing, và distribution. SDK 56 giới thiệu XCFrameworks prebuilt cho các module Expo trên iOS và plugin compiler Kotlin cho Android loại bỏ reflection tại runtime.
{
"cli": {
"version": ">= 15.0.0"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"ios": {
"simulator": true
}
},
"preview": {
"distribution": "internal",
"ios": {
"resourceClass": "m-medium"
},
"android": {
"buildType": "apk"
}
},
"production": {
"ios": {
"resourceClass": "m-large"
},
"android": {
"buildType": "app-bundle"
},
"env": {
"EXPO_USE_PRECOMPILED_MODULES": "1"
}
}
},
"submit": {
"production": {}
}
}Build ứng dụng production:
# Build cho iOS App Store
eas build --platform ios --profile production
# Build cho Google Play
eas build --platform android --profile production
# Submit lên store sau khi build
eas submit --platform allTính năng precompiled headers cho Android (usePrecompiledHeaders trong expo-build-properties) giảm thời gian biên dịch CMake từ 17 phút xuống 6 phút theo benchmark của Expo.
Sẵn sàng chinh phục phỏng vấn React Native?
Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.
Các Mẫu State Management và Data Fetching
Các ứng dụng React Native production thường kết hợp TanStack Query cho server state với Zustand hoặc Jotai cho client state. Sự phân tách này giữ codebase có thể dự đoán được và tránh sự phức tạp của Redux cho hầu hết các trường hợp sử dụng.
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { api } from '@/lib/api';
import type { Product } from '@/types';
// Query key factory cho quản lý cache type-safe
export const productKeys = {
all: ['products'] as const,
lists: () => [...productKeys.all, 'list'] as const,
list: (filters: ProductFilters) => [...productKeys.lists(), filters] as const,
details: () => [...productKeys.all, 'detail'] as const,
detail: (id: string) => [...productKeys.details(), id] as const,
};
export function useProducts(filters: ProductFilters) {
return useQuery({
queryKey: productKeys.list(filters),
queryFn: () => api.products.list(filters),
staleTime: 5 * 60 * 1000, // 5 phút
gcTime: 30 * 60 * 1000, // 30 phút (trước đây là cacheTime)
});
}
export function useCreateProduct() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: CreateProductInput) => api.products.create(data),
onSuccess: () => {
// Invalidate các query list để refetch
queryClient.invalidateQueries({ queryKey: productKeys.lists() });
},
});
}Để có khả năng offline-first, kết hợp TanStack Query với WatermelonDB hoặc hỗ trợ SQLite tích hợp sẵn thông qua expo-sqlite:
import * as SQLite from 'expo-sqlite';
import NetInfo from '@react-native-community/netinfo';
const db = SQLite.openDatabaseSync('app.db');
export async function initializeOfflineStorage() {
await db.execAsync(`
CREATE TABLE IF NOT EXISTS pending_mutations (
id TEXT PRIMARY KEY,
type TEXT NOT NULL,
payload TEXT NOT NULL,
created_at INTEGER NOT NULL
);
`);
}
export async function queueMutation(type: string, payload: object) {
const id = crypto.randomUUID();
await db.runAsync(
'INSERT INTO pending_mutations (id, type, payload, created_at) VALUES (?, ?, ?, ?)',
[id, type, JSON.stringify(payload), Date.now()]
);
}
export async function syncPendingMutations() {
const state = await NetInfo.fetch();
if (!state.isConnected) return;
const pending = await db.getAllAsync<PendingMutation>(
'SELECT * FROM pending_mutations ORDER BY created_at ASC'
);
for (const mutation of pending) {
try {
await processMutation(mutation);
await db.runAsync('DELETE FROM pending_mutations WHERE id = ?', [mutation.id]);
} catch (error) {
console.error('Đồng bộ thất bại cho mutation:', mutation.id);
break; // Dừng tại lỗi đầu tiên để duy trì thứ tự
}
}
}Hệ Thống Animation Với React Native Reanimated 4
React Native 0.85 giới thiệu backend animation mới phù hợp với New Architecture. Reanimated 4 tận dụng đầy đủ điều này, chạy animation trên UI thread mà không cần qua JS bridge.
import Animated, {
useSharedValue,
useAnimatedStyle,
withSpring,
withTiming,
interpolate,
Extrapolation,
} from 'react-native-reanimated';
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
const SWIPE_THRESHOLD = 120;
export function SwipeableCard({ onSwipe, children }: SwipeableCardProps) {
const translateX = useSharedValue(0);
const opacity = useSharedValue(1);
const panGesture = Gesture.Pan()
.onUpdate((event) => {
translateX.value = event.translationX;
})
.onEnd((event) => {
if (Math.abs(event.translationX) > SWIPE_THRESHOLD) {
const direction = event.translationX > 0 ? 'right' : 'left';
translateX.value = withTiming(
direction === 'right' ? 500 : -500,
{ duration: 200 }
);
opacity.value = withTiming(0, { duration: 200 }, () => {
onSwipe(direction);
});
} else {
translateX.value = withSpring(0, {
damping: 15,
stiffness: 150,
});
}
});
const animatedStyle = useAnimatedStyle(() => ({
transform: [
{ translateX: translateX.value },
{
rotate: `${interpolate(
translateX.value,
[-200, 0, 200],
[-15, 0, 15],
Extrapolation.CLAMP
)}deg`,
},
],
opacity: opacity.value,
}));
return (
<GestureDetector gesture={panGesture}>
<Animated.View style={animatedStyle}>
{children}
</Animated.View>
</GestureDetector>
);
}Chỉ thị worklet (ngầm định trong Reanimated 4 cho các hàm được truyền vào useAnimatedStyle) đảm bảo logic animation chạy trên UI thread. Điều này đạt được tốc độ làm mới 120Hz nhất quán trên các thiết bị hỗ trợ.
Câu Hỏi Phỏng Vấn Cho Developer React Native
Các buổi phỏng vấn kỹ thuật cho vị trí React Native năm 2026 tập trung nhiều vào New Architecture, tối ưu hóa hiệu suất, và deployment production. Khám phá thêm câu hỏi phỏng vấn React Native để thực hành các chủ đề cụ thể.
Điều gì đã thay đổi với New Architecture và tại sao nó quan trọng?
New Architecture thay thế JSON bridge bất đồng bộ bằng JSI (JavaScript Interface), cho phép giao tiếp đồng bộ giữa JavaScript và mã native. Ba thành phần tạo nên cốt lõi:
- JSI: Một lớp C++ cho phép JavaScript giữ tham chiếu đến các đối tượng native và gọi các phương thức của chúng trực tiếp
- Fabric: Hệ thống rendering mới hỗ trợ đo lường layout đồng bộ và concurrent rendering
- TurboModules: Các module native được tải lazy và giao tiếp qua JSI thay vì bridge
Tác động thực tế: UI thread contention giảm 10-30% trong các ứng dụng điển hình. Các ứng dụng sử dụng nhiều module native thấy cải thiện lên đến 3x trong hiệu suất cross-thread call vì overhead serialization bị loại bỏ.
Hermes V1 khác JavaScriptCore như thế nào?
Hermes V1 biên dịch trước JavaScript thành bytecode tại thời điểm build, loại bỏ bước parsing tại runtime. Các điểm khác biệt chính:
- Thời gian khởi động: Hermes bỏ qua parsing, giảm Time to Interactive 10-30%
- Bộ nhớ: Sử dụng bộ nhớ cơ sở thấp hơn do biểu diễn bytecode được tối ưu
- Debugging: Hermes sử dụng Chrome DevTools Protocol native, trong khi JSC yêu cầu adapter riêng
- Garbage collection: Hermes sử dụng GC generational với thời gian pause ngắn hơn
Đánh đổi: Hermes trong lịch sử có tốc độ thực thi đỉnh chậm hơn cho mã tính toán chuyên sâu, mặc dù V1 đã thu hẹp khoảng cách này đáng kể.
Giải thích sự khác biệt giữa useCallback, useMemo, và React.memo trong React Native
Cả ba đều là công cụ memoization, nhưng phục vụ các mục đích khác nhau:
// useCallback: memoize tham chiếu hàm
const handlePress = useCallback(() => {
navigation.navigate('Detail', { id: item.id });
}, [item.id, navigation]);
// useMemo: memoize giá trị được tính toán
const sortedItems = useMemo(() => {
return items.slice().sort((a, b) => a.price - b.price);
}, [items]);
// React.memo: memoize output render của component
const ProductCard = React.memo(function ProductCard({ product, onPress }: Props) {
return (
<Pressable onPress={onPress}>
<Text>{product.name}</Text>
</Pressable>
);
});Trong React Native, React.memo đặc biệt quan trọng cho các item list được render bởi FlatList. Nếu không có nó, mọi item đều re-render khi state của parent thay đổi, gây ra frame drop trong quá trình cuộn.
Làm thế nào để xử lý deep linking trong ứng dụng React Native production?
Deep linking yêu cầu cấu hình ở nhiều lớp: URL scheme native, universal/app links, và JavaScript router.
{
"expo": {
"scheme": "myapp",
"ios": {
"associatedDomains": ["applinks:myapp.com"]
},
"android": {
"intentFilters": [
{
"action": "VIEW",
"autoVerify": true,
"data": [
{
"scheme": "https",
"host": "myapp.com",
"pathPrefix": "/product"
}
],
"category": ["BROWSABLE", "DEFAULT"]
}
]
}
}
}Expo Router xử lý parsing tự động khi cấu trúc thư mục app khớp với các path URL. Để xử lý tùy chỉnh:
import { useURL } from 'expo-linking';
import { useEffect } from 'react';
import { router } from 'expo-router';
export default function RootLayout() {
const url = useURL();
useEffect(() => {
if (url) {
const parsed = parseDeepLink(url);
if (parsed.requiresAuth && !isAuthenticated) {
// Lưu đích đến dự định, chuyển hướng đến login
router.replace('/login');
}
}
}, [url]);
return <Slot />;
}Universal links (iOS) và App Links (Android) yêu cầu cấu hình phía server: file apple-app-site-association và file assetlinks.json tương ứng, được phục vụ từ domain gốc.
Bắt đầu luyện tập!
Kiểm tra kiến thức với mô phỏng phỏng vấn và bài kiểm tra kỹ thuật.
Điểm Chính Trong Phát Triển React Native 2026
- New Architecture là bắt buộc: bridge cũ đã bị vô hiệu hóa trong React Native 0.82, và 85% các package npm hiện hỗ trợ kiến trúc mới
- Expo SDK 56 với EAS Build cung cấp con đường nhanh nhất đến production, với các module prebuilt cắt giảm thời gian build iOS 16% và biên dịch CMake Android 60%
- Hermes V1 là engine mặc định không cần cấu hình, mang lại khởi động nhanh hơn 10-30% so với JSC
- TanStack Query cộng với thư viện client state nhẹ (Zustand/Jotai) đáp ứng hầu hết nhu cầu quản lý dữ liệu production mà không cần sự phức tạp của Redux
- Reanimated 4 với backend animation mới đạt được animation 120Hz bằng cách chạy hoàn toàn trên UI thread
- Chuẩn bị phỏng vấn nên tập trung vào cơ chế JSI, Fabric rendering, profiling hiệu suất với Hermes, và deployment production với EAS
Bạn có tìm ra lỗi trong React Native không?
Một đoạn mã thật, một lỗi ẩn, mỗi ngày một lượt. Không cần tài khoản để thử.

Viết bởi
Anthony Fillion-MailletNgười sáng lập SharpSkill
Lập trình viên fullstack hơn 10 năm. Anh điều hành SharpSkill và chịu trách nhiệm về mọi nội dung đăng tại đây.
Cập nhật ngày 14 tháng 9, 2026
Thẻ
Chia sẻ
Bài viết liên quan

Kiến Trúc Mới React Native 2026: Hermes V1, Fabric, TurboModules và Bridgeless Mode
Phân tích chuyên sâu về Kiến Trúc Mới React Native trong năm 2026, bao gồm Hermes V1, Fabric Renderer, TurboModules và chế độ Bridgeless. Bài viết cung cấp các ví dụ code thực tế và câu hỏi phỏng vấn phổ biến.

Phát triển ứng dụng React Native 2026: Hướng dẫn đầy đủ và câu hỏi phỏng vấn
Hướng dẫn toàn diện về phát triển ứng dụng React Native năm 2026. Tìm hiểu về New Architecture, JSI, Fabric, TurboModules và các câu hỏi phỏng vấn thường gặp.

Hermes V1 trong React Native 0.84: Hiệu năng, Bytecode Precompiled và Câu hỏi Phỏng vấn
Hướng dẫn chuyên sâu về engine JavaScript Hermes V1 trong React Native 0.84, bao gồm biên dịch bytecode, garbage collector Hades, chiến lược tối ưu bộ nhớ và câu hỏi phỏng vấn kỹ thuật.