Chào bạn! Bạn có sẵn sàng khám phá một siêu năng lực mới trong React Native 0.79 chưa? Giờ đây, việc kết nối với code native đã trở nên mượt mà và hiệu quả hơn bao giờ hết, đặc biệt là khi chúng ta dùng đến các Module Native C++ đa nền tảng. Tưởng tượng xem, viết code một lần bằng C++ mà chạy phà phà trên cả Android lẫn iOS! Điều này không chỉ giúp bạn giảm đáng kể việc lặp lại code mà còn tăng tốc độ ứng dụng lên vù vù nữa đấy. Nghe hấp dẫn đúng không? Trong bài viết này, chúng ta sẽ cùng nhau "lặn sâu" vào thế giới của C++ Turbo Native Module, từng bước một, như một cuộc phiêu lưu thực thụ: Tạo một C++ Turbo Native Module siêu tốc. Cấu hình Codegen để nó tự động "dựng xương" cho module của bạn. Viết logic native MỘT LẦN duy nhất cho cả hai nền tảng (Android và iOS). Đăng ký module này vào "hệ sinh thái" của Android và iOS. Cuối cùng là kiểm tra xem module của chúng ta hoạt động trơn tru trên JavaScript chưa nhé! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/roadmaptour.png' alt='Mô tả lộ trình xây dựng C++ Turbo Module'> Đợi chút! Trước khi "xắn tay áo" vào code, hãy cùng giải đáp một câu hỏi cực kỳ quan trọng: Tại sao C++ lại là "kẻ thay đổi cuộc chơi" (game changer) trong các module native của chúng ta? Lý do đây này: **Viết một lần, dùng muôn nơi!** Với C++, bạn chỉ cần viết logic một lần duy nhất và "hô biến" nó chạy mượt mà trên cả Android và iOS. Tạm biệt việc nhân đôi code bằng Kotlin và Swift/Objective-C nhé! Điều này giúp giảm tải công sức phát triển và bảo trì xuống đáng kể luôn. **Tốc độ thần sầu!** C++ nổi tiếng là "ông trùm" về hiệu năng. Nó cho phép bạn tiếp cận sâu hơn với hệ thống, và tối ưu hóa cực đỉnh cho các tác vụ nặng đô như mã hóa, xử lý chuỗi phức tạp, hay thậm chí là âm thanh/video. Khi cần "cân" những tác vụ ngốn CPU, C++ sẽ bỏ xa JavaScript và cả nhiều API native cấp cao khác nữa đấy. **Chia sẻ code dễ dàng hơn!** Không chỉ dùng lại giữa các nền tảng, các module C++ còn có thể tái sử dụng cho nhiều ứng dụng hay đội nhóm khác nhau, đặc biệt nếu bạn đang xây dựng SDK hay thư viện. Đảm bảo logic luôn nhất quán trên mọi mặt trận. **Tận dụng kho thư viện C++ khổng lồ!** C++ có một hệ sinh thái thư viện cực kỳ đồ sộ và "già dặn" (như OpenCV, SQLite, Boost...). Viết module bằng C++, bạn có thể thoải mái "mượn" sức mạnh từ những thư viện này mà không cần tốn công viết lại từ đầu. **Giao tiếp "khớp lệnh" với kiến trúc mới của React Native!** TurboModules và JSI (JavaScript Interface) chính là cầu nối thần kỳ, giúp JavaScript và C++ giao tiếp với nhau một cách mượt mà và hiệu quả. Điều này đồng nghĩa với việc quản lý bộ nhớ tốt hơn, các cuộc gọi nhanh hơn, và ít "gánh nặng" hơn cho hệ thống. <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/cpp_bridge.png' alt='C++ là cầu nối giữa Android và iOS'> Bắt đầu thôi! Bước 1: **Tạo file "hợp đồng" JavaScript Specs!** Để Turbo Native Module của bạn hoạt động, chúng ta cần một file "hợp đồng" (hay còn gọi là specification file) viết bằng TypeScript. File này sẽ định nghĩa rõ ràng những gì module của bạn có thể làm. Đầu tiên, hãy tạo một thư mục `specs` ngay tại thư mục gốc của dự án. Sau đó, trong thư mục `specs` này, bạn hãy tạo file `NativeSampleModule.ts`. Nội dung của file này sẽ trông giống như một bản kế hoạch, nơi bạn khai báo các chức năng mà module của mình cung cấp. Cụ thể, nó sẽ định nghĩa một hàm `reverseString` nhận vào một chuỗi và trả về một chuỗi đảo ngược. Lưu ý cực kỳ quan trọng: File này phải bắt đầu bằng chữ "Native" (ví dụ: `NativeSampleModule.ts`) và phải luôn là file TypeScript (.ts), đừng bao giờ đổi thành .js nhé, nếu không Codegen sẽ "ngó lơ" bạn ngay đấy! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/typescript_contract.png' alt='File TypeScript là hợp đồng cho module'> Bước 2: **"Sai khiến" Codegen!** Sau khi có "hợp đồng", chúng ta cần chỉ cho Codegen biết nơi tìm thấy các specs này để nó có thể tự động "dựng khung xương" cần thiết. Bạn hãy mở file `package.json` lên và thêm (hoặc cập nhật) phần `codegenConfig`. Nhớ thay thế `com.yourpackagename` bằng package name thực tế của ứng dụng bạn nhé! Đoạn cấu hình này sẽ cho Codegen biết rằng các file spec của chúng ta nằm trong thư mục `specs` và cách để nó tạo ra các file native cần thiết cho Android (ví dụ, với package Java là `com.yourpackagename.specs`). <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/codegen_gear.png' alt='Cấu hình Codegen tự động tạo khung sườn'> Bước 3: **Chinh phục C++! Viết code Native Module của chúng ta!** Đây là lúc chúng ta thực sự viết "linh hồn" của module bằng C++. Đầu tiên, hãy tạo một thư mục tên là `shared` ngang hàng với các thư mục `android` và `ios` của bạn. Trong thư mục `shared` này, chúng ta sẽ tạo hai file: `NativeSampleModule.h` (file header, giống như bản khai báo chức năng) và `NativeSampleModule.cpp` (file implementation, nơi chúng ta viết code thực hiện chức năng). File `.h` sẽ khai báo cấu trúc của module, bao gồm hàm `reverseString` mà chúng ta đã định nghĩa trong TypeScript spec. Còn file `.cpp` chính là nơi "phép thuật" đảo ngược chuỗi diễn ra! Đây chính là đoạn logic mà bạn chỉ cần viết MỘT LẦN duy nhất nhưng sẽ chạy trên cả Android và iOS. Thật vi diệu phải không nào? <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5rre8fpnu9g01jyov7y3.png' alt='Cấu trúc file C++ Module'> Bước 4: **Đăng ký Module của chúng ta với Android!** Để Android "nhận ra" và sử dụng được module C++ của chúng ta, bạn cần thực hiện vài bước nhỏ sau: 1. **Thêm file CMakeLists.txt:** Bạn hãy tạo một file `CMakeLists.txt` trong `android/app/src/main/jni/`. File này sẽ giống như một "bản đồ" giúp hệ thống build của Android tìm thấy các file C++ của chúng ta. Bạn cần khai báo nguồn (`target_sources`) và đường dẫn include (`target_include_directories`) đến thư mục `shared` chứa module C++ của mình. 2. **Cập nhật build.gradle:** Tiếp theo, mở file `android/app/build.gradle` và thêm phần `externalNativeBuild` vào bên trong khối `android`. Điều này sẽ cho Gradle biết rằng chúng ta đang sử dụng CMake để build các thư viện native. 3. **Đăng ký Turbo Native Module mới:** Đây là bước cuối cùng và quan trọng nhất! Chúng ta cần "giới thiệu" module C++ của mình với React Native runtime trên Android. Đầu tiên, hãy tải file `OnLoad.cpp` từ GitHub (bằng lệnh `curl` được cung cấp). Sau đó, bạn cần chỉnh sửa file `android/app/src/main/jni/OnLoad.cpp` này. Cụ thể, bạn sẽ thêm dòng `include` cho `NativeSampleModule.h` và một đoạn code để tạo ra thể hiện (`instance`) của `NativeSampleModule` khi JavaScript yêu cầu nó. Khi đó, mỗi khi JavaScript "gọi tên" module của bạn, Android sẽ biết đường mà trả về đúng "người"! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/android_cpp_reg.png' alt='Đăng ký C++ Module trên Android'> Bước 5: **"Chào hàng" Module với iOS!** Để ứng dụng iOS của bạn cũng có thể "kết bạn" với C++ Turbo Native Module, chúng ta cần làm vài việc tương tự như với Android: 1. **Cài đặt Pods và chạy Codegen:** Đầu tiên, bạn hãy di chuyển vào thư mục `ios` và chạy lệnh `bundle install` rồi `bundle exec pod install`. Việc này sẽ giúp cài đặt các thư viện cần thiết và chạy lại Codegen để tạo ra các file mới. 2. **Thêm thư mục 'shared' vào dự án iOS:** Bước này quan trọng lắm nhé! Nó giúp Xcode "nhìn thấy" được các file C++ mà chúng ta đã viết. Bạn hãy mở `SampleApp.xcworkspace` trong Xcode, sau đó nhấp vào project `SampleApp` ở bên trái, chọn "Add files to 'Sample App'...". Chọn thư mục `shared` và nhấp vào Add. (Xem hình minh họa 1, 2, 3 để biết thêm chi tiết.) <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dmlnfl03uoof88sx7vm.png' alt='Thêm files vào Xcode bước 1'> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjeawb8o40q9z59n31cur.png' alt='Thêm files vào Xcode bước 2'> Khi làm xong, cấu trúc dự án của bạn trong Xcode sẽ có thêm thư mục `shared` trông rất gọn gàng. <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63i2dfgwluh5ggxttanu.png' alt='Cấu trúc project Xcode sau khi thêm shared folder'> 3. **Đăng ký C++ Turbo Native Module trong ứng dụng:** Để iOS hiểu cách tạo ra module C++ thuần túy của chúng ta, bạn cần: Tạo một `ModuleProvider` cho Native Module này. Cấu hình `package.json` để liên kết tên module JavaScript với lớp `ModuleProvider`. `ModuleProvider` này là một file Objective-C++ đặc biệt, nó sẽ là "người phiên dịch" giúp module C++ của bạn giao tiếp với phần còn lại của ứng dụng iOS. **3.1 Tạo ModuleProvider:** Trong Xcode, tạo một file mới (⌘ + N), chọn `Cocoa Touch Class`, đặt tên là `SampleNativeModuleProvider` và nhớ đổi đuôi từ `.m` sang `.mm` (để Xcode hiểu đây là Objective-C++ nhé!). File `.h` sẽ khai báo `NativeSampleModuleProvider` tuân thủ protocol `RCTModuleProvider`. Còn file `.mm` sẽ là nơi triển khai, bạn chỉ cần một hàm `getTurboModule` trả về một thể hiện của `NativeSampleModule` của chúng ta. **3.2 Cập nhật package.json:** Quay lại `package.json`, bạn cần thêm một phần `ios` vào `codegenConfig`. Trong đó, bạn sẽ "mách" cho React Native biết rằng khi JavaScript gọi `NativeSampleModule`, nó hãy dùng `NativeSampleModuleProvider` để tạo ra module native tương ứng. Sau khi cập nhật, đừng quên chạy lại `pod install` để Codegen tạo các file mới nhé! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/ios_cpp_reg.png' alt='Đăng ký C++ Module trên iOS'> Bước 6: **Kiểm tra thành quả trên JavaScript!** Giờ là lúc hái quả ngọt! Bạn chỉ cần chỉnh sửa file `App.tsx` của mình để sử dụng module `NativeSampleModule` mà chúng ta vừa tạo. Hãy thêm vào một `TextInput` để nhập chuỗi, một `Button` để kích hoạt việc đảo ngược chuỗi, và một `Text` để hiển thị kết quả đã đảo ngược. Khi bạn chạy ứng dụng và nhập một chuỗi vào, rồi nhấn nút "Reverse", bạn sẽ thấy chuỗi đó được đảo ngược ngay lập tức nhờ vào module C++ siêu tốc của chúng ta! Thật tuyệt vời đúng không? <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/app_screenshot.png' alt='Ứng dụng React Native hiển thị kết quả đảo chuỗi'> 🎉 **Lời kết hoành tráng!** Chúc mừng bạn! Bạn đã chinh phục thành công việc tạo ra một C++ Turbo Native Module đa nền tảng trong React Native 0.79 rồi đấy! Chúng ta vừa cùng nhau đi qua một hành trình thú vị với rất nhiều lợi ích: Có một codebase duy nhất cho cả Android và iOS, tiết kiệm tối đa công sức. Hiệu năng vượt trội nhờ sức mạnh của C++. An toàn về kiểu dữ liệu với sự hỗ trợ từ Codegen. Giờ thì sao? Hãy thử mở rộng module này bằng cách thêm nhiều phương thức khác, hoặc thậm chí là tích hợp các thư viện C++ bên thứ ba mà bạn yêu thích vào xem sao! **🚀 Chúc bạn code vui vẻ nhé! 🚀**
Khám phá cách xây dựng Turbo Native Module đa nền tảng bằng C++ trong React Native 0.79 để tối ưu hiệu suất, tái sử dụng mã và đơn giản hóa việc phát triển ứng dụng di động.
Khám phá kiến trúc React Native mới với Fabric, TurboModules và JSI giúp tối ưu hiệu suất, linh hoạt và mở rộng cho ứng dụng di động. Bài viết đi sâu vào các thành phần, cách di chuyển và gỡ lỗi hiệu quả.
Bạn muốn 'phù phép' cho ứng dụng React Native của mình chạy nhanh hơn, mượt hơn và 'ngầu' hơn? Với phiên bản React Native 0.79 mới toanh, việc kết nối với code native đã trở nên siêu hiệu quả, đặc biệt là khi bạn dùng đến 'Thần chú' C++: Cross-Platform C++ Native Modules! Tưởng tượng xem, bạn chỉ cần viết một lần bằng C++ mà ứng dụng của bạn có thể chạy ngon lành trên cả Android và iOS. Nghe đã thấy 'mát ruột' rồi đúng không? Giảm trùng lặp, tăng hiệu suất, còn gì bằng! Trong hướng dẫn này, chúng ta sẽ cùng nhau khám phá cách tạo một Turbo Native Module bằng C++, cấu hình Codegen, triển khai logic native cho cả hai nền tảng, đăng ký module trên Android & iOS, và cuối cùng là kiểm tra hoạt động của nó trong JavaScript. Chuẩn bị tinh thần để nâng cấp kỹ năng React Native của bạn lên một tầm cao mới nhé!
Bạn có đang băn khoăn về việc nâng cấp dự án React Native lên Kiến trúc Mới (New Architecture) không? Bài viết này sẽ hướng dẫn chi tiết hai cách tiếp cận thực tế, chia sẻ những thách thức thường gặp và giải pháp để bạn có thể nâng cấp mượt mà, tối ưu hiệu suất với TurboModules và Fabric.