Quay lại so sánh

Giải pháp thay thế Electron cho lập trình viên TypeScript

Electron đã giúp lập trình viên web dễ dàng xây dựng ứng dụng desktop, và cái giá về kích thước cũng như bộ nhớ của nó đã biến “giải pháp thay thế Electron” thành một truy vấn tìm kiếm vĩnh viễn. Nếu TypeScript là ngôn ngữ của bạn, có bốn hướng đi thực tế vào năm 2026: ở lại với Electron, chuyển sang Tauri, xây dựng binary nhúng runtime bằng Bun, hoặc biên dịch sang gốc bằng Perry. Chúng có những đánh đổi rất khác nhau.

Bốn cách tiếp cận

Electron — đường cơ sở

Đóng gói Chromium và Node.js cùng mọi ứng dụng. Điểm mạnh là hơn một thập kỷ trưởng thành trong sản xuất và một UI stack (HTML/CSS/JS) mà đội của bạn đã quen thuộc — VS Code, Slack và Discord đều chạy trên đó. Điểm yếu là cái giá cơ bản: trình cài đặt hello-world khoảng 80–150 MB, nhiều tiến trình Chromium, và hàng trăm MB RAM lúc nhàn rỗi. Chỉ dành cho desktop. So sánh đầy đủ Perry vs Electron.

Tauri — UI web trong webview hệ thống, backend Rust

Tauri giữ lại frontend web nhưng bỏ Chromium đóng gói: UI được render trong webview của OS (WKWebView, WebView2, WebKitGTK), nên trình cài đặt chỉ ở mức vài MB. Nó ổn định, tài liệu đầy đủ, và Tauri 2 đã thêm iOS/Android. Đánh đổi: backend là Rust, không phải TypeScript — logic ứng dụng ngoài UI nghĩa là phải viết Rust và đi qua một bridge IPC — và việc render hơi khác nhau giữa các nền tảng vì mỗi OS dùng một webview khác nhau. So sánh đầy đủ Perry vs Tauri.

Bun — binary đơn tệp, không có lớp GUI

Những người tìm kiếm “bun electron” thường muốn sự tiện lợi của Electron mà không có sự nặng nề của nó. bun build --compile tạo ra một tệp thực thi duy nhất bằng cách nhúng runtime Bun cùng TypeScript đã đóng gói của bạn — tuyệt vời cho CLI và server, với khả năng tương thích npm đầy đủ vì nó chính là runtime. Nhưng binary có kích thước khoảng 60 MB (macOS arm64) đến hơn 100 MB (Linux/Windows), mã vẫn được thực thi bằng JIT, và Bun không có framework UI — một ứng dụng desktop vẫn cần Electron, Tauri, hoặc một thư viện webview ở trên. So sánh đầy đủ Perry vs Bun.

Perry — TypeScript biên dịch thành widget gốc

Perry biên dịch ahead-of-time TypeScript thành mã máy và render UI qua các widget nền tảng thực sự — AppKit, UIKit, GTK4, Win32, Android qua JNI — không có webview và không có bridge IPC. Một ngôn ngữ duy nhất cho cả UI và logic, hello world ~330 KB, binary điển hình 2–5 MB, khởi động ~1 ms, và mười mục tiêu bao gồm di động, watch và TV. Điểm cần lưu ý thẳng thắn: Perry vẫn ở giai đoạn trước 1.0, API UI của nó là riêng biệt (khai báo, kiểu SwiftUI — không phải HTML/CSS), và hệ sinh thái còn non trẻ so với Electron.

So sánh cạnh nhau

PerryElectronTauriBun (--compile)
Ngôn ngữTypeScript ở mọi nơiJS/TS + HTML/CSSFrontend JS/TS, backend RustTypeScript
Cách tiếp cận UIWidget nền tảng gốcChromium đóng góiWebview hệ thốngKhông có (CLI/server)
Kích thước hello-world~330 KB~80–150 MB~3–10 MB~60–116 MB tùy nền tảng
Thực thiMã máy AOTJIT (V8)JIT (engine JS của webview) + Rust gốcJIT (JavaScriptCore)
Bộ nhớ lúc nhàn rỗiVài chục MB (một tiến trình gốc duy nhất)Hàng trăm MB (Chromium đa tiến trình)Thấp hơn Electron (webview của OS)Điển hình của runtime
Di động / watch / TViOS, iPadOS, Android, watchOS, tvOSKhôngiOS, Android (Tauri 2)Không
Độ trưởng thànhTrước 1.0Hơn một thập kỷ trong sản xuấtỔn định (1.x/2.x)Ổn định

Còn React Native hay Flutter thì sao?

Chúng luôn xuất hiện trong mọi cuộc thảo luận về Electron, nhưng chúng trả lời một câu hỏi khác. React Native ưu tiên di động: JavaScript của bạn chạy trong engine Hermes và điều khiển view gốc qua một bridge, còn hỗ trợ desktop chỉ tồn tại qua các fork riêng của cộng đồng/Microsoft — nó không phải là một thay thế trực tiếp cho Electron (Perry vs React Native). Flutter bao phủ cả desktop và di động nhưng đồng nghĩa với việc rời TypeScript để dùng Dart, và nó tự vẽ widget của riêng mình thay vì dùng widget của nền tảng. Nếu việc ở lại với TypeScript là ràng buộc, danh sách thực tế cho desktop vẫn là bốn lựa chọn ở trên.

Bạn nên chọn cái nào?

Ở lại với web stack

Nếu UI của bạn đã được xây dựng bằng React/Vue/Svelte và bạn cần phân phối desktop đã được thử thách ngay hôm nay, Electron vẫn là lựa chọn rủi ro thấp nhất — bạn trả giá bằng kích thước và bộ nhớ. Nếu cái giá đó làm bạn khó chịu và bạn thoải mái viết backend bằng Rust, Tauri mang lại phần lớn trải nghiệm web stack với dấu chân nhỏ hơn nhiều.

Bỏ lại webview phía sau

Nếu điều bạn thực sự muốn là đưa TypeScript vào, nhận ứng dụng gốc ra — một ngôn ngữ duy nhất, widget nền tảng thực sự, binary nhỏ, và di động/watch/TV từ cùng một mã nguồn — đó chính xác là khoảng trống mà Perry tồn tại để lấp đầy, với cái giá phải trả là độ trưởng thành trước 1.0. Và nếu bạn chỉ cần một CLI hay server dưới dạng một tệp duy nhất với rủi ro tương thích bằng không, --compile của Bun là lựa chọn thực dụng.

Tự mình trải nghiệm

Cài đặt Perry và xuất bản một ứng dụng gốc từ TypeScript.