- Framework ứng dụng desktop dựa trên TypeScript sử dụng Bun cho tiến trình chính và Zig cho native binding
- Hỗ trợ đầy đủ macOS, Windows, Ubuntu, đồng thời tự động tạo trình cài đặt, cập nhật tự động và artifact vá vi sai
- Cung cấp bộ tính năng desktop đầy đủ như điều khiển cửa sổ, menu, phím tắt, clipboard, hộp thoại, session storage..., đồng thời triển khai webview ổn định dựa trên OOPIF
- Cấu trúc nội bộ tận dụng FFI và mô hình bộ nhớ chia sẻ của Bun để duy trì hiệu quả ngay cả trong môi trường đa tiến trình
- Được phát triển trực tiếp trong 2 năm bởi một nhà phát triển từng trải qua giới hạn của Electron và Tauri, đồng thời học Zig, C, C++, Objective-C
- Mục tiêu là một quy trình làm việc tích hợp cho phép viết mã trong 5 phút và triển khai trong 10 phút
Tổng quan và mục tiêu của dự án Electrobun
- Cấu trúc chạy tiến trình chính bằng Bun, bundle TypeScript cho webview, và viết native binding bằng Zig
- Cả tiến trình chính lẫn webview đều được viết bằng TypeScript, nhưng vẫn duy trì cách ly (isolation) giữa các tiến trình đồng thời cung cấp RPC nhanh, có kiểu rõ ràng
- Kích thước app bundle tự giải nén khoảng 12MB (khi dùng system webview, phần lớn là kích thước runtime Bun)
- Cập nhật vi sai dựa trên bsdiff có thể giảm kích thước bản vá xuống tối thiểu 14KB
- Mục tiêu là cung cấp một quy trình làm việc tích hợp duy nhất để có thể bắt đầu viết mã trong 5 phút và hoàn tất triển khai trong 10 phút
- Có thể khởi tạo dự án theo mẫu bằng lệnh
npx electrobun init
Bối cảnh ra đời
- Tác giả đã làm ứng dụng desktop từ thời Visual Basic 6, và nền tảng kinh nghiệm bắt nguồn từ giai đoạn Adobe AIR, khi từng phát hành nhiều sản phẩm startup cho hàng nghìn người dùng
- Dù đã hơn 20 năm làm kỹ sư giai đoạn đầu tại các startup, xây dựng và mở rộng các sản phẩm ở quy mô kỳ lân, môi trường phát triển desktop lại ngày càng thụt lùi
- Trong quá trình xây dựng co(lab) — một trình duyệt web lai + trình soạn thảo mã + terminal PTY — tác giả gặp quá nhiều bất tiện nên quyết định tự tạo framework
- Phiên bản đầu tiên được làm bằng Electron, nhưng quá trình ký mã, công chứng, phát hành và cập nhật tạo cảm giác như đang chiến đấu với framework nhiều hơn là phát triển ứng dụng
- Tác giả muốn continuous shipping như trên web, nhưng chuỗi công cụ hiện có lại khiến việc này trở nên khó hơn mức cần thiết
- Cũng đã thử Tauri, nhưng cho rằng Rust không phù hợp với mọi nhà phát triển, và khi đó Bun vẫn còn vài tháng nữa mới phát hành 1.0 nên đã bắt tay tự xây dựng
Từ macOS sang đa nền tảng
- Ban đầu chỉ có thể build ứng dụng cho macOS, nhưng hiện nay đã hỗ trợ ở mức ưu tiên cao việc build và phát hành trên macOS, Windows, Ubuntu
- Trình cài đặt, artifact cập nhật tự động và bản vá vi sai (differential patches) đều được tạo tự động
- Chỉ cần kết nối với static host (R2, S3, GitHub Releases) là có thể hoàn tất phát hành
- Cập nhật vi sai được xử lý bởi zig-bsdiff, một bản port từ C sang Zig và được tối ưu bằng SIMD và zstd
- Khi FFI của Bun trở nên ổn định, phần lớn lớp FFI Zig viết trước đó đã được thay thế bằng Bun
- Kiến trúc vì thế chuyển biến theo hướng tích cực: Bun dùng bộ nhớ chia sẻ khi tạo worker, nên vẫn duy trì hiệu quả trong môi trường đa tiến trình
Các tính năng đã phát hành
- Hiện framework đã cung cấp đầy đủ điều khiển cửa sổ đa nền tảng, menu, phím tắt (accelerators), global shortcut, clipboard, dialog, phân vùng webview, session storage, tìm trong trang (find-in-page), cùng công cụ bundle và cập nhật
- Việc triển khai OOPIF (Out-of-Process Iframe) đã đạt đến mức thực sự hoạt động
- Thẻ
<webview> của Electron đã bị Chromium deprecate nhưng vẫn chưa có giải pháp thay thế phù hợp
<electrobun-webview> là một “super iframe” thực thụ với định vị DOM, cách ly tiến trình và phân lớp hoạt động đúng đắn
- Hoạt động đa nền tảng mà không gặp vấn đề nhấp nháy con trỏ (cursor flicker), cũng không cần vá browser engine
Tình trạng hỗ trợ nền tảng
- macOS 14+: hỗ trợ chính thức
- Windows 11+: hỗ trợ chính thức
- Ubuntu 22.04+: hỗ trợ chính thức
- Các bản phân phối Linux khác (gtk3, webkit2gtk-4.1): hỗ trợ từ cộng đồng
Kế hoạch sắp tới
- Đã hoàn tất viết lại toàn bộ co(lab) trên Electrobun, và sẽ tập trung nghiêm túc vào phát triển co(lab) dựa trên sự ổn định của v1
- Mục tiêu cốt lõi là ổn định framework đủ để có thể xây dựng các sản phẩm dài hạn đầy tham vọng mà không bị biến động nền tảng (platform churn) làm chao đảo
- Cộng đồng Discord đang phát triển, và những người dùng đóng góp qua beta test, gửi issue và phản hồi đã góp phần định hình framework
- Electrobun là sản phẩm lớn đầu tiên do Blackboard phát hành
5 bình luận
Có ghi là viết lại toàn diện co(lab), nên tôi đã nghĩ đây là thứ được Google cùng làm để cải thiện độ ổn định của đám mây khi chạy
ipynb, nhưng hóa ra lại là một dự án phát triển của nhóm Blackboard hoàn toàn không liên quan.Dù vậy, việc OOPIF có thể truy cập và được cài bằng
npxvẫn có vẻ là một trải nghiệm quan trọng."Quá trình ký mã, công chứng, phân phối và cập nhật mang lại cảm giác như đang chiến đấu với framework hơn là phát triển ứng dụng"
Trong phần thân bài có nhắc đến bối cảnh ra đời như trên,
thực tế có những trường hợp việc phân phối còn tốn nhiều công sức hơn cả phát triển ứng dụng.
Chỉ riêng việc khắc phục được vấn đề này thôi cũng đã rất đáng được đánh giá cao.
Việc gắn
zigvào Flutter hóa ra cũng khá dễ và đơn giản. Tài liệu Dart/C FFI cũng không khác biệt nhiều...Nếu là một hệ điều hành có môi trường GUI thì có lẽ giờ WebView nên trở thành một thành phần mặc định.
Ý kiến trên Hacker News
Xin chào, mình là người tạo ra Electrobun
Lần này mình đã phát hành bản ổn định v1. Kiến trúc đã được cố định, và nếu bạn cần bug được sửa hoặc cần API từng dùng trong Electron/Tauri, hãy để lại ở GitHub issue, mình sẽ ưu tiên xử lý
Trong một tháng qua, mình đã sửa 50 nghìn dòng mã để hoàn tất công việc ổn định hóa
Cũng có video demo của dự án mã nguồn mở Colab (trình duyệt web + trình soạn thảo mã + terminal PTY) được tạo bằng Electrobun
Electrobun mặc định dùng WebView của hệ thống, nhưng cũng có thể kèm CEF bằng tùy chọn
bundleCEF. Về mặt cấu trúc, nó độc lập với WebView nên khi Servo hay Ladybird sẵn sàng thì có thể thay thế ngayNgoài ra, mỗi bản phát hành đều có thể tạo gói nén tự động dựa trên zstd để giảm kích thước tải ban đầu, còn bản cập nhật có thể giữ nhỏ ở mức khoảng 14KB
partitionvào BrowserWindow thì TypeScript báo lỗiElectrobun trông rất hứa hẹn. Mình định làm dự án tiếp theo bằng cái này
Trong stack TypeScript hoàn chỉnh, đây là lựa chọn có năng suất cao nhất. Mình rất vui khi có được một giải pháp thay thế Electron nhẹ hơn và nhanh hơn mà không cần Rust hay quá trình biên dịch dài
Trên Discord có rất nhiều nhà phát triển game đang thử nghiệm game desktop bằng Electrobun
Nó có thể thay thế một phần Electron trong thị trường game indie trên Steam
Đặc biệt, trải nghiệm phát triển game TypeScript với reload tức thì bằng
bun --watch game.tsrất nhanh và mượtVấn đề chính của Tauri là chất lượng WebView hệ thống khác nhau theo từng OS
Linux không có WebView chính thức, còn Windows 7 hay các bản Windows 10 đầu tiên thì không dùng Edge WebView. Vì những khác biệt này mà đôi khi khởi động mất hơn 20 giây
Mình không chắc có đáng đánh đổi như vậy chỉ để tiết kiệm 100MB hay không
Phần lớn người dùng có internet nhanh nên tốc độ tải xuống không phải vấn đề lớn
Mình từng thắc mắc liệu Electrobun có hỗ trợ trình kết xuất Chromium tích hợp hay không, nhưng tài liệu không nói rõ
Giá mà tiêu đề ghi rõ đây là một bài blog nhìn lại dự án
Với dự án thực tế, có lẽ xem liên kết tài liệu chính thức sẽ phù hợp hơn
Trang chính của dự án ở đây
Giao diện trông gọn gàng, và vì mình quen với Zig nên có lẽ sẽ dễ tiếp cận hơn Rust
Tuần này công ty mình sẽ phát hành một ứng dụng Electron mới, nên mình thấy giá mà Electrobun ra sớm hơn 1 năm thì tốt biết mấy
Electron Builder có đơn giản hóa phần nào quá trình cập nhật và ký, nhưng vẫn còn khá phiền phức
Mình định sẽ thử Electrobun cho dự án cá nhân tiếp theo
Bài viết có nhắc đến vấn đề notarizing và stapling, mà nếu không dùng Xcode thì Apple khiến quy trình này trở nên rất khó
Windows cũng không dễ tự động hóa CI. Nếu Electrobun cung cấp giải pháp tốt hơn thì mình rất quan tâm
notarize: truelà đượcMình đã ký và công chứng nhiều lần với Electrobun mà không gặp vấn đề gì. Nó cũng cung cấp escape hatch cho những trường hợp phức tạp
Nếu cần trợ giúp thì cứ DM trên Discord. (Mình không liên quan đến Electrobun, nhưng rất hiểu nỗi khổ của hệ thống công chứng Apple)
Nếu ứng dụng Electron nặng hơn 500MB, thì 14MB của Electrobun thực sự là kích thước rất nhỏ
Thật tiếc là các bản phân phối ngoài Ubuntu hiện vẫn nằm ngoài phạm vi hỗ trợ
Có thể xem thảo luận liên quan trong bình luận issue