Bridge cũ (Legacy):
- Gọi native = serialize tham số thành JSON → đẩy vào queue bất đồng bộ → native deserialize → chạy → trả kết quả qua queue ngược lại.
- Chỉ async, message được gom thành batch.
- JS không giữ được tham chiếu trực tiếp tới object native — chỉ giao tiếp qua module ID + tên method.
JSI (JavaScript Interface) là C++ API do JS engine (Hermes, JSC) cung cấp, cho phép native gắn function/object thẳng lên runtime JS:
// Phía C++ — đăng ký function lên JS
auto fn = jsi::Function::createFromHostFunction(
runtime, jsi::PropNameID::forAscii(runtime, "myNativeFn"), 0,
[](jsi::Runtime& rt, const jsi::Value& thisVal, const jsi::Value* args, size_t count) {
return jsi::Value(42);
});
runtime.global().setProperty(runtime, "myNativeFn", std::move(fn));// Phía JS — gọi như function thường, đồng bộ
const result = global.myNativeFn() // = 42Khác biệt cốt lõi:
- Gọi đồng bộ: global.myNativeFn() chạy và trả giá trị ngay, không cần Promise.
- HostObject / HostFunction: native expose object/function trực tiếp lên JS.
- Không serialize JSON: tham số đi qua C++ dưới dạng jsi::Value; ArrayBuffer có thể trỏ thẳng vào vùng nhớ native mà không copy.
- Không gắn với một engine: Hermes, JSC, V8 đều có thể implement JSI.
Hệ quả thực tế:
- Reanimated chạy worklet trên UI thread, đọc shared value đồng bộ → animation không phụ thuộc JS thread.
- VisionCamera đưa frame camera sang JS (frame processor) mà không serialize.
- Thư viện như react-native-mmkv, op-sqlite đọc/ghi đồng bộ qua JSI.
- TurboModules dùng JSI cho mọi lời gọi method.
Lưu ý: "đồng bộ" nghĩa là JS thread bị chặn trong lúc native chạy — việc nặng (I/O, mạng) vẫn nên trả Promise. Thực tế hiếm khi viết JSI bằng tay; thường dùng gián tiếp qua TurboModule + Codegen. Từ RN 0.82, app chỉ chạy New Architecture nên Bridge cũ không còn là đường gọi mặc định.