22 điểm bởi GN⁺ 2025-05-29 | 7 bình luận | Chia sẻ qua WhatsApp
  • Nhà phát triển đã viết lại Desktop Docs, vốn trước đây là một ứng dụng Electron dành cho Mac, bằng Rust, và kết luận rằng đây là một lựa chọn đúng đắn
  • Ứng dụng ban đầu làm bằng Electron có dung lượng lớn tới 1GB và thường xuyên bị sập do các vấn đề về hiệu năng
    • Đặc biệt, có vấn đề suy giảm hiệu năng khi xử lý ảnh/video quy mô lớn
  • Sau khi xây dựng lại bằng Rust + Tauri, dung lượng ứng dụng giảm 83%, tốc độ lập chỉ mục cải thiện hơn 3 lần, và độ ổn định cũng được nâng cao
    • Kích thước ứng dụng: 1GB → 172MB (giảm 83%)
    • Bộ cài: 232MB → 69.5MB (giảm 70%)
    • Lập chỉ mục video: với video dài 38 phút, thời gian rút từ 10~14 phút xuống còn 3 phút
    • Vận hành ổn định hơn rất nhiều so với ứng dụng Electron vốn thiếu ổn định
  • Quá trình xây dựng lại và các lựa chọn
    • Ứng dụng Electron tiêu tốn hơn 200MB bộ nhớ chỉ riêng Chromium, ngay cả khi chạy nền, và thậm chí gọi video cũng có thể gây crash
    • Ở ứng dụng mới, CLIP embedding và kho vector Redis vẫn được giữ nguyên
    • Tuy nhiên, toàn bộ pipeline xử lý ảnh/video và file I/O đã được viết lại bằng Rust
    • Phần UI cũng không port từ mã cũ mà được viết lại từ đầu, kết quả là hoàn thiện được một giao diện gọn gàng và đơn giản hơn
  • Khó khăn kỹ thuật
    • Đường cong học Rust khá dốc, và cộng đồng Tauri vẫn chưa trưởng thành bằng Electron
    • Trong quá trình đóng gói Redis vào ứng dụng, đã phát sinh vấn đề về xử lý quyền hạn và triển khai
    • Dù vậy, so với Electron, khả năng kiểm soát tổng thể và hiệu năng đều được cải thiện
  • Kết luận
    • Dù vẫn chưa đạt mức tương đương hoàn toàn về tính năng, nhưng các tính năng cốt lõi hoạt động nhanh hơn và ổn định hơn rất nhiều
    • Hãy mạnh dạn vứt bỏ những đoạn mã tuy chạy được nhưng được viết sai cách

7 bình luận

 
choyunsung79 2025-06-02

Electron tích hợp sẵn Chromium, còn Tauri thì dùng engine đã được cài trên hệ điều hành, nên có sự khác biệt.

Tauri (OS WebView) phù hợp hơn khi cần bản phân phối nhẹ và hiệu năng nhanh, nhưng với các dịch vụ mà bảo mật, độ tin cậy và khả năng kiểm soát tính năng là quan trọng thì cách tiếp cận của Electron (tích hợp Chromium) phù hợp hơn.

Tôi không rõ lắm vấn đề trong đoạn mã, nhưng tôi nghĩ đặc tính của nền tảng được phản ánh khá nhiều.

 
bus710 2025-05-30

Nếu là Flutter thì rinf cũng rất hay.

 
aer0700 2025-05-29

Tôi từng dùng Electron, nhưng chưa từng đụng đến Tauri, nên chắc cũng phải thử một lần.

 
GN⁺ 2025-05-29
Ý kiến trên Hacker News
  • Tôi đang làm một ứng dụng desktop bằng Rust và egui, nhưng vì đây là lần đầu tiên tôi làm cả Rust lẫn phát triển desktop nên cảm thấy khá khó khi phải học quá nhiều khái niệm cùng lúc. Lĩnh vực của tôi là công cụ phân tích cơ khí, nên backend cần hiệu năng cao còn frontend cần trực quan hóa dữ liệu. Tôi muốn hỏi khi dùng Tauri thì việc phải quản lý cùng lúc nhiều stack như Rust, JS, HTML có gây vất vả không

  • Gần đây tôi đã có trải nghiệm chuyển một dự án từ Tauri sang Electron. Sự khác biệt trong cách render của webview trên các nền tảng khiến tôi đau đầu. Tôi muốn hỏi liệu bạn có từng gặp bug UI khi làm đa nền tảng không. Yêu cầu UI của tôi khá đơn giản còn phần tính toán thì phức tạp, nên tôi nghĩ dù có tốn chi phí QA thì vẫn xứng đáng. Tôi muốn biết trải nghiệm của mình có phải là trường hợp hiếm hay chênh lệch render thực sự là vấn đề phổ biến. Ngoài ra tôi cũng muốn hỏi bạn dùng Tauri 1.0 hay 2.0. Bản 2.0 phát hành chính thức đúng lúc tôi đang chuyển từ v1 sang, mà việc migration đúng là ác mộng và tài liệu thì thực sự quá thiếu. Tôi muốn biết bây giờ tài liệu đã tốt hơn chưa

    • Bên tôi ở kreya.app tự triển khai và dùng system webview trực tiếp chứ không phải Tauri, nhưng khác biệt giữa các nền tảng trên thực tế hầu như không thành vấn đề. Phần lớn được xử lý bằng polyfill, và chúng tôi chạy kiểm thử tự động end to end trên Linux nên phát hiện được hầu hết vấn đề. Điểm khó nhất là biết webview của người dùng đã lạc hậu đến mức nào. Vấn đề này lớn trên Linux và Mac, còn Windows thì tốt hơn nhiều nhờ WebView2
    • Thực ra với phiên bản Tauri thì tôi vẫn chưa phát hành đa nền tảng, nên sẽ còn phải kiểm chứng thêm. May là yêu cầu UI khá đơn giản. Tôi muốn biết bạn đã gặp những khác biệt render nào trong Tauri. Trên ứng dụng của bạn, nền tảng nào hoạt động tốt nhất hoặc phát sinh vấn đề? Bên tôi cũng muốn hỗ trợ Windows. Với bản Electron thì từng có vấn đề khi chạy binary được bundle trên Mac Intel, và chuyện đó phiền đến mức khi rebuild bằng Tauri chúng tôi quyết định trước tiên chỉ tập trung vào một nền tảng Mac (Apple chip). Chúng tôi dùng Tauri 1.4 và đến giờ vẫn chưa gặp vấn đề. Tôi cũng sẽ tìm hiểu thêm về tài liệu migration 2.0
    • Về câu hỏi có gặp bug UI đa nền tảng không thì tất nhiên là không áp dụng, vì hiện tại tôi chỉ hỗ trợ Mac. Nếu tôi còn định hỗ trợ cả Windows và Linux nữa thì có lẽ bài viết này đã không thể ra đời. UI đa nền tảng thực sự rất khó, và nếu còn muốn giữ cùng một UI và bộ tính năng đồng thời tính đến cả phiên bản online thì càng khó hơn nữa. Đó là lý do mọi người chuyển từ native sang Qt rồi sang web stack. Theo kinh nghiệm của tôi khi làm ở một công ty phát triển ứng dụng desktop đa nền tảng với hàng triệu người dùng, tôi gần như không thể tưởng tượng cách nào khác
    • Khi tôi dùng Tauri V2 khoảng 6 tháng trước thì tài liệu hoàn toàn lộn xộn. Bản thân dự án rất hứa hẹn, nhưng vì không có gì để tham khảo nên việc triển khai cho ra hồn đúng là cực hình
    • Gần đây Tauri đã công bố tin này: trên Discord họ thông báo sẽ giới thiệu các công nghệ mới như webview dựa trên CEF và SERVO trong năm nay
  • Tôi cũng từng đi theo con đường tương tự. Tôi đã làm một trình xem webcam đơn giản được tối ưu cho kính hiển vi USB, vì trước đó không có lựa chọn nào đủ ổn nên tự làm luôn. Gần như mọi tính năng đều được triển khai trong renderer. Khi chuẩn bị gửi lên App Store, tôi bắt đầu tự hỏi một trình xem webcam mà nặng 500mb có hợp lý không, nên đã port sang Tauri V2 và giảm dung lượng xuống còn gần 15mb

    • Tôi tò mò về sự khác nhau giữa Tauri và Electron. Theo hiểu biết của tôi thì cả hai đều dùng trình duyệt để render, nhưng Electron đóng gói cả trình duyệt riêng của nó, còn Tauri thì dùng trình duyệt đã có sẵn trên hệ thống
    • Tôi thấy thật sự quá ấn tượng. Tôi tò mò đó là sản phẩm gì. Bên tôi cũng đang chuẩn bị gửi app lên App Store trong tuần này
  • Tôi thực sự thích mục đích của ứng dụng này. Những ứng dụng khác trong lĩnh vực này thường quá chậm chạp và bất tiện, nên tôi rất quan tâm đến bản viết lại này. Tuy vậy, vì tôi là nhiếp ảnh gia nên phần lớn media của tôi ở định dạng RAW, mà tôi không chắc ứng dụng có hỗ trợ hay không, hoặc nhìn vào cụm “tất cả các định dạng ảnh và video chính” thì có lẽ là không. Tôi muốn biết có tài liệu chính thức, diễn đàn người dùng hay kênh nào khác để kiểm tra những chi tiết như vậy không

  • Tôi không phải người dùng Mac và nhóm của tôi cũng không cân nhắc viết lại sang Rust, nhưng tôi rất vui khi đọc bài này. Tôi kỳ vọng các bài “Show HN” có đúng độ dài như thế này, tóm tắt các đánh đổi kỹ thuật cần thiết để giải quyết vấn đề thực tế. Cảm ơn bạn

    • Tôi rất vui vì có thể chia sẻ trải nghiệm. Quyết định rebuild một thứ vốn đã chạy được không hề dễ, nhưng cuối cùng tôi rất hài lòng
  • Sẽ rất tuyệt nếu có tài liệu benchmark cập nhật so sánh Tauri, Flutter, Electron, React Native và các framework đa nền tảng hiện đại khác. Các chỉ số chính nên gồm kích thước bundle, mức dùng bộ nhớ (RAM), thời gian khởi động, mức dùng CPU khi có tải, dung lượng đĩa, v.v. Đặc biệt với những framework như Tauri, nơi khả năng render và hiệu năng thay đổi theo phiên bản webview, sẽ rất hữu ích nếu có thêm ma trận tương thích theo nền tảng như WebView2, WKWebView, v.v. Nếu các khác biệt này được tổng hợp trực quan thành bảng thì nhà phát triển sẽ đưa ra lựa chọn tốt hơn rất nhiều

    • Có một tài liệu so sánh mới được đăng cách đây 2 tuần. Có thể xem tại web-to-desktop-framework-comparison. Electron khá cạnh tranh về hiệu năng runtime. Tôi nghĩ nên quan tâm đến mức dùng bộ nhớ hơn là dung lượng đĩa.
      • Mức dùng bộ nhớ trên Windows (x64) (một cửa sổ, bản build release):
      1. Electron: khoảng 93MB
      2. NodeGui: khoảng 116MB
      3. NW.JS: khoảng 131MB
      4. Tauri: khoảng 154MB
      5. Wails: khoảng 163MB
      6. Neutralino: khoảng 282MB
      • Mac (arm64):
      1. NodeGui: khoảng 84MB
      2. Wails: khoảng 85MB
      3. Tauri: khoảng 86MB
      4. Neutralino: khoảng 109MB
      5. Electron: khoảng 121MB
      6. NW.JS: khoảng 189MB
      • Linux (x64):
      1. Tauri: khoảng 16MB
      2. Electron: khoảng 70MB
      3. Wails: khoảng 86MB
      4. NodeGui: khoảng 109MB
      5. NW.JS: khoảng 166MB
      6. Neutralino: khoảng 402MB
    • Tôi muốn xem thêm nhiều tài liệu so sánh kiểu này
  • Ở công ty cũ, tôi từng bảo trì một ứng dụng desktop Electron cho Windows và Mac. Ứng dụng quá nặng, và việc cập nhật bằng Squirrel là cực hình.
    Cuối cùng chúng tôi giữ GUI ở dạng web SPA (dựa trên Inferno), còn phần như tải webview thì thay bằng các ứng dụng native nhỏ riêng cho từng nền tảng (C# và Swift). Nhờ vậy dung lượng tải xuống và mức dùng bộ nhớ giảm khoảng 90%, đồng thời chuyển sang phân phối-cập nhật qua app store của từng nền tảng. Tôi nghĩ đó là quyết định đúng đắn nhất

    • Đây gần như là lần đầu tiên tôi thấy ai đó khen việc phân phối/cập nhật qua app store native.
      Tôi lo về thời gian phê duyệt cập nhật và sự bất định, nên rất tò mò không biết những điểm nào đã được cải thiện khi chuyển từ Squirrel sang native
    • Tôi muốn biết quá trình chuyển đổi mất bao lâu
  • Nếu ứng dụng cuối cùng là cho Mac, tôi thật sự tò mò vì sao bạn chọn Rust/Tauri thay vì Swift/SwiftUI

    • Cảm ơn bạn đã hỏi. Mục tiêu của Desktop Docs là đa nền tảng. Có nhiều yêu cầu hỗ trợ Windows, nên tôi đã chọn Rust để chuẩn bị cho phiên bản Windows trong tương lai
    • Tôi cũng muốn hỏi điều tương tự. Swift là một ngôn ngữ khá ổn và tôi thấy nó có nhiều lợi thế tương tự Rust. Tôi cũng tò mò về phần tích hợp CLIP, còn câu chuyện port thì rất thú vị
    • Tôi cũng tò mò như vậy. Tôi sắp làm một ứng dụng desktop, nhưng đã lâu không dùng Swift và chỉ biết Rust chút ít. Tauri trông rất hấp dẫn. Các ứng dụng Electron lúc nào cũng khởi động quá chậm dù máy tính có mạnh đến đâu. Cảm ơn vì những insight của bạn
  • Tôi tò mò điều gì khiến bạn chọn Tauri thay vì egui. Có phải vì trải nghiệm với Electron không? Tôi cũng đang định port một ứng dụng Python Qt sang Rust, nhưng lo rằng các thư viện GUI của Rust hiện vẫn chưa đầy đủ như Qt, rồi cuối cùng sẽ bị mắc kẹt giữa chừng

    • Tôi tò mò nguyên nhân gốc rễ nào khiến bạn bắt đầu nghĩ đến việc port
  • Nhìn nút "Try" trên landing page chính, người dùng sẽ dễ nghĩ là có bản dùng thử, nhưng thực tế lại dẫn thẳng đến mua hàng. Sẽ tốt hơn nếu có dù chỉ là bản dùng thử 1 tuần.
    Tôi rất thích chính sách giấy phép backup dùng vĩnh viễn. $99 là rào cản gia nhập khá cao, nhưng nếu nhắm đến creator/studio thì cũng hợp lý, còn với người tiêu dùng phổ thông thì có lẽ mức $20-$25 sẽ ổn hơn.
    Bài viết nhấn mạnh vào hiệu năng, nhưng landing page lại không hề nhắc đến. Giống như video dài 38 phút kia, các thông tin như benchmark, xử lý song song, yêu cầu VRAM cũng rất quan trọng. Tôi muốn biết khi xử lý hàng trăm đến hàng nghìn giờ media thì thực tế ra sao.
    Thật khó tin khi một tác vụ mất 10~14 phút trên Electron lại xuống còn 3 phút với Tauri. Electron chỉ orchestration CLIP và ffmpeg thôi mà, nên tôi tò mò overhead lớn như vậy xuất phát từ đâu.
    Trước đây tôi cũng từng làm một công cụ tìm kiếm media dựa trên phiên âm video bằng Electron, nhưng không gặp nhiều vấn đề hiệu năng.
    Thông thường lý do chọn Electron hay Tauri là vì đa nền tảng, nên tôi tò mò tại sao ngay từ đầu lại chỉ làm bản Mac, nhất là khi xử lý media khối lượng lớn thì còn có thể tận dụng Nvidia nữa.
    Gần đây tôi cũng dùng lại Swift sau 10 năm và từng phân vân giữa Tauri với Swift cho một dự án mới, rồi cuối cùng chọn Swift; so với khoảng năm 2014 thì mọi thứ đã tiến bộ rất nhiều và trải nghiệm gần như rất dễ chịu.
    Nếu phần nói về người dùng đang hoạt động là thật thì có vẻ bạn đã đạt được một mức thành công nhất định rồi; tôi tò mò trước đó bạn đã có mạng lưới hay tệp khán giả nào trong ngành studio/creator chưa. Tôi cũng muốn nghe thêm về phần marketing

    • Cảm ơn vì phản hồi. Về mặt hạ tầng, hiện tại chúng tôi vẫn chưa thể triển khai bản dùng thử nhưng có kế hoạch cân nhắc trong tương lai.
      Bạn nói là cũng từng tự làm một công cụ tương tự, nên tôi tò mò vì sao bạn chưa phát hành nó.
      Các bản Windows và Linux cũng dự kiến sẽ ra mắt trong vài tháng tới nếu có nhu cầu.
      Chúng tôi có được người dùng từ HN, đợt ra mắt trên reddit và một phần quảng bá trên LinkedIn. Phần lớn vẫn là truyền miệng.
      Về câu chuyện hiệu năng Electron và xử lý video thì nếu đào sâu sẽ còn rất nhiều điều để nói. Tôi cũng không phải chuyên gia Electron, nên có thể là do chúng tôi không dùng worker đúng cách nên phát sinh bottleneck.
      Khi chuyển sang Rust, chúng tôi cũng đưa vào scene detection để giảm số frame cần lập chỉ mục, nhờ đó giảm đáng kể tải xử lý. Chúng tôi cũng thêm các tùy chọn tăng tốc GPU cho ffmpeg nên hiệu năng cải thiện khá nhiều. Việc tạo embedding cho ảnh cũng đã được tối ưu theo kiểu batch processing. Tuy vậy nếu đẩy quá mức thì instance của model vẫn có thể bị crash
 
secret3056 2025-05-29

Trong bảng so sánh hiệu năng được liên kết trên HN, có vẻ như Electron tốt hơn Tauri trong hầu hết các trường hợp....

 
majorika 2025-05-29

Nội dung so sánh hiệu năng trong phần bình luận có cảm giác khá rõ là đã chọn lọc những giá trị có lợi cho Electron trong số các số liệu của kho lưu trữ đó. Dù các con số có chênh lệch đôi chút, phần có số liệu gần nhất có lẽ là mục so sánh "chênh lệch bộ nhớ trống trước khi chạy và sau khi chạy". Tuy nhiên, ngay ở mục phía trên, tổng dung lượng bộ nhớ của tiến trình chính và tiến trình con khi đang chạy được ghi là 258M đối với Electron, nên khá khó để chấp nhận con số mức thay đổi sử dụng bộ nhớ trước và sau khi chạy chỉ là 91MB. Ngoài ra, trong một bình luận trả lời trên HN cũng có ý cho rằng khó tin vào các số liệu đo trong kho lưu trữ đó, vì thời gian khởi động của ứng dụng làm bằng Tauri được ghi là hơn 7 giây.

 

Ừm, có vẻ phần lớn vấn đề đến từ các sự cố liên quan đến engine WebView + OS/driver hơn là từ sự khác biệt giữa Electron hay Tauri.