2 điểm bởi GN⁺ 2024-08-13 | 1 bình luận | Chia sẻ qua WhatsApp
  • Blitz là engine kết xuất dạng mô-đun tập trung vào kết xuất HTML/CSS; thiết kế của nó không cung cấp sẵn toàn bộ chức năng của trình duyệt, mà để các tính năng bổ sung cần thiết ở dạng tùy chọn
  • Trạng thái hiện tại là pre-alpha; trình kết xuất đã có khá nhiều tính năng, nhưng vẫn còn nhiều lỗi và chức năng thiếu, nên hiện chưa được khuyến nghị dùng để phát triển ứng dụng
  • Mục tiêu hỗ trợ gồm modern HTML layout, advanced CSS, HTML form controls, khả năng truy cập dựa trên AccessKit và mở rộng bằng custom widgets; các tính năng như WebRTC, WebSockets, Bluetooth, localStorage không được cung cấp
  • Kiến trúc được chia thành phần trừu tượng core DOM cùng các mô-đun networking, rendering, window và quản lý trạng thái; hai crate wrapper cấp caoblitzdioxus-native phụ trách kết xuất HTML/Markdown hoặc Dioxus VirtualDom
  • Phiên bản mới Blitz v0.2+ sử dụng Stylo; mã nguồn v0.1 vẫn nằm ở nhánh legacy nhưng không còn được phát triển tích cực

Engine tập trung vào kết xuất HTML/CSS

  • Blitz là engine kết xuất HTML/CSS, xuất phát từ nhận thức rằng trình duyệt quá cồng kềnh so với use case cơ bản là kết xuất HTML/CSS
  • Mục tiêu không phải là triển khai toàn bộ chức năng của trình duyệt, mà đặt trọng tâm vào các chức năng cần cho kết xuất HTML/CSS và biến phần còn lại thành opt-in khi có thể
  • Hiện đang ở trạng thái pre-alpha
    • Trình kết xuất đã có khá nhiều tính năng
    • Vẫn còn nhiều lỗi và chức năng thiếu
    • Hiện chưa khuyến nghị dùng để xây dựng ứng dụng
    • Có thể xem tiến độ chi tiết hơn trong roadmap issue

Các tính năng muốn hỗ trợ và các tính năng loại trừ

  • Phạm vi mà Blitz muốn hỗ trợ được định hướng cho kết xuất UI HTML/CSS
    • modern HTML layout như flexbox, grid, table, block, inline, absolute/fixed
    • advanced CSS như complex selectors, media queries, CSS variables
    • HTML form controls
    • Khả năng truy cập dựa trên AccessKit
    • Khả năng mở rộng thông qua custom widgets
  • Blitz không cung cấp các tính năng như WebRTC, WebSockets, Bluetooth, localStorage
    • Trong ứng dụng native, phần lớn các tính năng này có thể được xử lý bằng các Rust crate thông thường
    • Quan điểm của dự án là các tính năng này không cần gắn chặt với trình kết xuất
  • Chưa có binding cho các ngôn ngữ khác như JavaScript, Python, nhưng có thể tiếp nhận đóng góp liên quan

Cách chạy và ví dụ

  • Sau khi clone repository, có thể chạy package browser
cargo run --release --package browser
  • Các ví dụ được cung cấp gồm một ứng dụng TODO nhỏ, trình kết xuất Markdown và tích hợp kết xuất raw WGPU
cargo run --release --package todomvc
cargo run --release --package readme ./README.md
cargo run --release --package wgpu_texture

Kiến trúc mô-đun

  • Blitz gồm core DOM abstraction, các mô-đun chức năng bổ sung và hai wrapper cấp cao
    • Các chức năng như networking, rendering, window và quản lý trạng thái được tách thành những mô-đun riêng
    • Có thể kết hợp các mảnh này để tạo thành một web engine
  • Crate wrapper cấp cao

    • blitz: frontend HTML/Markdown có thể kết xuất chuỗi HTML
    • Hữu ích để xem trước file HTML hoặc Markdown
    • Hiện chưa có tương tác
    • Sử dụng blitz-dom, blitz-html, blitz-shell, blitz-renderer-vello
    • dioxus-native: frontend Dioxus kết xuất Dioxus VirtualDom
    • Hỗ trợ tương tác đầy đủ thông qua xử lý sự kiện Dioxus
    • Sử dụng blitz-dom, dioxus-core, blitz-shell, blitz-renderer-vello
    • Cả hai wrapper đều có thể tùy chọn sử dụng blitz-net để lấy các tài nguyên con
  • Crate lõi và crate bổ sung

    • blitz-dom: core DOM abstraction bao gồm style resolution, layout, event handling
    • Không bao gồm parsing, rendering, system integration
    • Sử dụng Stylo, Taffy, Parley
    • blitz-traits: crate nền tảng tối thiểu giúp các crate khác tương tác với nhau mà không phụ thuộc trực tiếp lẫn nhau
    • blitz-net: mô-đun networking lấy tài nguyên từ HTTP, hệ thống file và encoded data URI
    • Sử dụng reqwest
    • blitz-paint: chuyển đổi cây blitz-dom thành các draw command của anyrender
    • Sử dụng anyrender
    • blitz-html: thêm HTML parsing vào blitz-dom
    • Sử dụng html5everxml5ever
    • blitz-shell: shell cho phép Blitz kết xuất vào cửa sổ
    • Tích hợp Winit event loop, AccessKit, Muda, v.v.
    • Sử dụng winit, accesskit, muda
    • Phần trừu tượng kết xuất AnyRender đã được chuyển sang repository riêng là anyrender

Sử dụng phiên bản phát triển của Dioxus Native

  • Phiên bản phát triển mới nhất của Dioxus Native nằm trong repository này
  • Vì Dioxus Native đang được phát triển nhanh, nếu muốn dùng các tính năng mới nhất và bản sửa lỗi trước bản phát hành chính thức, có thể dùng phiên bản git
  • Quy trình dùng phiên bản git như sau
    • Loại bỏ hoàn toàn dependency crate dioxus
    • Thêm dioxus-native = { git = "https://github.com/DioxusLabs/blitz";, rev = "e64a3d8", features = ["prelude"] }
    • Thay e64a3d8 bằng git commit id của phiên bản mong muốn
    • Trong mã Rust, đổi use dioxus::prelude::* thành use dioxus_native::prelude::*
    • Nếu cần các tính năng dioxus mà Dioxus Native prelude không export, hãy import từ từng sub-crate riêng như dioxus-html, dioxus-signals, dioxus-router
  • Phiên bản git của Dioxus Native vẫn phụ thuộc vào phiên bản ổn định Dioxus v0.7.x trên crates.io
    • Các thư viện bổ sung như dioxus-sdk, dioxus-components, dioxus-free-icons vẫn nên tiếp tục hoạt động

Phiên bản và giấy phép

  • Repository này chứa phiên bản mới Blitz v0.2+ và sử dụng Stylo
  • Mã nguồn phiên bản cũ v0.1 vẫn nằm ở nhánh legacy
    • v0.1 không được phát triển tích cực
  • Dự án được phân phối theo dual license Apache 2.0 và MIT
  • Crate stylo_taffy còn áp dụng thêm MPL 2.0 để dễ tương tác với dự án Servo
    • Vì vậy stylo_taffy có triple license gồm Apache 2.0, MIT và MPL 2.0
  • Các đóng góp được chủ ý gửi vào Blitz sẽ được xử lý theo dual license Apache 2.0 và MIT, trừ khi có điều kiện riêng
    • Đóng góp gửi vào stylo_taffy cũng bao gồm MPL 2.0

1 bình luận

 
GN⁺ 2024-08-13
Ý kiến trên Hacker News
  • Tôi là lập trình viên chính của Blitz. Nó vẫn chưa ở giai đoạn hoàn thiện, và hệ thống nhập văn bản/focus còn rất cơ bản, đồng thời chưa hỗ trợ cuộn ngoài viewport gốc Các bộ chọn CSS phức tạp như nth-child, :has vẫn chưa hoạt động đúng, và việc tích hợp xử lý sự kiện với Dioxus, một framework kiểu React chạy trên Blitz, cũng mới chỉ ở mức click được, thậm chí còn chưa có preventDefault Phần networking hiện rất đơn giản, đang thực hiện các request đồng bộ trên luồng chính, và cần có networking bất đồng bộ hoặc đa luồng đúng nghĩa Công việc tối ưu hiệu năng cũng gần như chưa làm, nên ở mỗi frame đều tính lại style/layout/paint, và còn có vài chỗ rò rỉ bộ nhớ do các node không được dọn dẹp Đổ bóng, web font, calc, float layout, và cả các form control ngoài nhập văn bản cũng vẫn còn thiếu. Nói cho cùng thì nó gần với kiểu “làm một webview là việc rất lớn và chúng tôi vẫn chưa tới được đó”, nhưng tôi kỳ vọng trong 2~3 tháng tới sẽ có một hình hài hoàn thiện hơn Ảnh chụp màn hình cũng có ở đây: https://github.com/DioxusLabs/blitz/issues/23

    • Cá nhân tôi muốn thiết kế một định dạng tài liệu mới có ngữ nghĩa đơn giản hơn và dễ render hơn HTML cho cảm giác khá phức tạp, và vốn cũng không được thiết kế cho render động. Với người thích lean và KISS như tôi, HTML không có vẻ đủ nhẹ hay đủ đơn giản
    • Tôi đang tìm một giải pháp để chụp ảnh màn hình website, và nếu có thể thì muốn tạo ra từ biểu diễn đã crawl trước đó Các dịch vụ hiện có phần lớn đều theo kiểu khởi chạy một instance Chromium rồi nhận yêu cầu chụp screenshot, nên cả chi phí vận hành lẫn chi phí SaaS đều có vẻ khá đắt. Nếu vậy thì Blitz có vẻ rất phù hợp, nên tôi muốn biết liệu hiện tại có thể chạy ở chế độ headless để lưu screenshot hay không
    • Tôi tò mò về động cơ khiến bạn không xây trên Servo hay WebKit, mà lại tự kết hợp nhiều component
    • Tôi muốn biết phần kỹ thuật nào là phức tạp nhất về mặt công trình mà phải xử lý. Dù vẫn đang làm dở, sẽ rất hay nếu có thể chia sẻ tài liệu thiết kế Cá nhân tôi quan tâm đến việc trong tương lai có thể xây các engine như Blitz, Servo bằng phương pháp hình thức như thế nào. Ví dụ bắt đầu từ đặc tả rồi sinh ra một phần hệ thống; dạo này LLM cũng được đưa vào đây, nhưng tôi xem chúng gần với công cụ tốt hơn là hệ thống AI. Tôi cũng nghĩ đến những thứ như Z3 Một vài công ty của tôi cũng có tổ chức nghiên cứu về chủ đề này
    • Tôi muốn biết liệu Blitz có được tạo ra để giúp người khác có thể làm trình duyệt hay không Tôi đang làm Wootzapp(https://github.com/wootzapp/wootz-browser), một dịch vụ kiểu Robinhood cho gán nhãn dữ liệu, nơi người dùng có thể dành thời gian cho dữ liệu web hoặc gán nhãn hình ảnh rồi nhận thưởng Hiện tại nó dựa trên Chromium, và tôi muốn biết liệu Blitz có đang hướng tới trở thành một renderer có thể cắm vào các trình duyệt khác hay không. Chúng tôi cũng làm mobile; hiện là Android, tiếp theo là iOS
  • Dự án này chỉ nhìn qua cũng đã thấy rất hữu ích Ý tưởng là tạo ứng dụng native bằng mô hình layout HTML/CSS được dùng rộng rãi, nhưng bỏ đi phần nặng nề ngầm đi kèm với JS/DOM/browser API đầy đủ. Nó có vẻ có thể mang lại cải thiện lớn hơn nhiều so với việc đóng gói cả browser engine như Electron Tình cờ là gần đây tôi nghe Casey Muratori nói rất phê phán về CSS trong podcast của Richard Feldman. Những ví dụ ông ấy đưa ra, như phải prerender webpage và đo đạc động chỉ để tạo quan hệ layout đơn giản, đặc biệt gây ấn tượng với tôi Như Muratori nói, viết CSS không giống xây dựng trên những phần tử cơ bản đơn giản, mà gần như giống đang tranh tụng một vụ án trước tòa Tất nhiên, vì độ quen thuộc, tính tương thích, và việc “CSS theo lối mòn chạy tốt” cực kỳ năng suất, nên nhu cầu mà các dự án kiểu này đáp ứng là rất lớn. Dù vậy, cũng có vẻ tồn tại cơ hội cung cấp một tầng đơn giản và tổng quát hơn để người dùng có thể đi xuống và dùng trực tiếp Có thể lấy cảm hứng từ CSS Houdini, nơi muốn làm CSS có thể mở rộng bằng JS API, và biết đâu đó cũng là điều “Custom Widgets” muốn nói đến

    • Điều đó gần như chính là đề xuất của Blitz Thuật toán layout có thể cắm được là một phần tôi rất muốn làm cho Blitz. Nếu làm layout bằng JS thì trong đa số trường hợp có lẽ sẽ quá chậm, nhưng API là Rust nên đây là một lợi thế Engine layout Taffy(https://github.com/DioxusLabs/taffy) cũng đã khá mô-đun rồi Custom widgets không chỉ dừng ở layout, mà còn nhằm cho phép layout, paint, accessibility, xử lý sự kiện hoàn toàn tùy biến, giống như widget trong các GUI toolkit truyền thống Tôi cũng có một đề xuất thêm đơn vị mới vào chính CSS. Nó được lấy cảm hứng từ cách nhiều hệ thống UI không phải web làm layout, và có thể đơn giản hóa layout web rất nhiều trong trường hợp phổ biến: https://github.com/w3c/csswg-drafts/issues/8267 Nó đã bị đẩy lùi ưu tiên một thời gian, nhưng đến lúc nào đó tôi phải quay lại, và tôi muốn thật sự thử triển khai thuật toán đó
    • Không biết nó có giống một Dillo được cải tiến không: https://en.m.wikipedia.org/wiki/Dillo Với duyệt web đơn giản hoặc ứng dụng thì có thứ như vậy sẽ rất tốt. Thứ tương tự duy nhất tôi biết là Sciter, dù là phần mềm độc quyền nhưng cách cấp phép của nó khá sáng tạo
    • Cần có một dạng CSS nghiêm ngặt loại bỏ phần rườm rà và hứa hẹn cải thiện hiệu năng. Tôi không hiểu vì sao các trình duyệt vẫn chưa cung cấp, ví dụ chỉ cần bỏ float đi cũng được
  • Vài năm trước, không, phải là 20 năm trước, tôi đã làm một dự án mã nguồn mở tương tự tên là Flying Saucer. Đó là một renderer HTML + CSS2 thuần Java Tôi từng hình dung nó sẽ được dùng để render UI văn bản phong phú trong game, nhưng ứng dụng cốt lõi thực tế lại là tạo PDF phía máy chủ. Hồi đó, so với việc dùng các API tạo báo cáo PDF có sẵn, thì tạo HTML rồi render thành PDF dễ hơn nhiều Blitz trông rất ngầu, và tôi rất mong sẽ có thêm nhiều thư viện GUI bằng Rust hơn https://en.wikipedia.org/wiki/Flying_Saucer_(library) Thật đáng ngạc nhiên là nó vẫn còn được cập nhật: https://github.com/flyingsaucerproject/flyingsaucer/releases...

  • Nghe như “một webview nhẹ thay thế engine JavaScript bằng API Rust native”, có vẻ rất hứa hẹn. Về cơ bản, nếu nó giống Tauri không có JS trong luồng xử lý thì chỉ nghe thôi đã thấy thích rồi

    • Cũng đúng phần nào, nhưng Tauri dùng webview của hệ thống, còn chúng tôi đang tự xây webview riêng Một phần dựa trên các thành phần của Servo và các thư viện đa dụng, một phần là tự viết. Ở vài khía cạnh, nó gần với Sciter không có JS hơn
    • Có lẽ Sciter là đối tượng so sánh phù hợp hơn: https://sciter.com/ Nó tự triển khai render HTML và CSS từ đầu. Nếu nhớ không nhầm thì trước đây nó có ngôn ngữ lập trình riêng, còn bây giờ dùng JS Tôi quan tâm đến kiểu này đã lâu nhưng chưa từng dùng Sciter sâu. Trước đây tôi lo về giấy phép, nhưng nhìn trang web hiện tại thì có vẻ điều khoản đã linh hoạt hơn nhiều Cũng đáng nói thêm là nếu muốn dùng webview hệ thống mà không có JS thì chỉ cần tắt JS trong webview hệ thống
    • Tauri dùng webview native nên khác nhau theo từng nền tảng. Blitz là trình kết xuất riêng
  • Khá thú vị. Đúng hôm nay tôi vừa vật lộn kinh khủng với puppeteer và Chromium headless, và đang tìm một lựa chọn thay thế cho wkhtmltopdf Tuyệt đối đừng bao giờ chạy với jemalloc trong LD_PRELOAD. Tôi đã giải quyết được vấn đề, nhưng vẫn thích hướng một trình kết xuất đơn giản hơn

    • Bạn không phải người đầu tiên quan tâm đến trường hợp dùng để render PDF Có lẽ sẽ cần thêm hỗ trợ cho các thuộc tính CSS hướng in và bố cục phân trang. Tức là khả năng chia bố cục qua nhiều trang riêng biệt và kiểm soát vị trí ngắt trang Dù vậy, tôi nghĩ đây chắc chắn là một mảng mà cuối cùng phải hỗ trợ được
    • Trường hợp dùng của tôi hơi khác. Tôi dùng Chromium Headless qua Playwright để render một phần tử trên trang, nhưng Playwright hay ngẫu nhiên báo "Page crashed" và "Timed out after 30s" Khi chuyển sang Firefox Headless thì các vấn đề này biến mất, và thực tế renderer với Firefox còn nhanh hơn Chromium Headless khoảng 3 lần Blitz rất đáng chú ý và khá gần với thứ tôi cần. Tôi đang dùng trình duyệt headless thay vì tự render mọi thứ bằng Java Graphics2D, vì bố cục của thứ cần render hơi phức tạp nên tôi không muốn tự làm lại cả một layout engine từ đầu
    • Hãy thử xem gotenberg[0], có thể nó đáp ứng được nhu cầu của bạn. Tôi đang dùng nó trong GitHub Actions để chuyển CV sang PDF [0]: https://github.com/gotenberg/gotenberg
    • Đúng vậy, Wkhtmltopdf thật sự là quái vật ngốn tài nguyên Các giải pháp khác thì hỗ trợ đặc tả HTML không đầy đủ nên khó tạo đúng file PDF mong muốn. Trừ khi ai đó tìm ra cách làm chỉ với các tính năng kém hiện đại hơn
  • Không hẳn là nói về chính Blitz, nhưng đây là lần đầu tôi biết đến Dioxus Tôi tự hỏi có phải có một luật bất thành văn nào đó rằng các framework biên dịch sang WASM либо không trình diễn demo cho ra hồn, либо không tự host chính website của họ bằng framework đó. Tôi nghĩ mình đã thấy chuyện này 5~6 lần rồi Trên trang chủ Dioxus tôi thấy file WASM được tải xuống, nhưng không rõ nó được dùng vào đâu hay có thực sự được dùng không

    • Trang của Dioxus được host bằng chính framework của họ, nhưng vì nó hỗ trợ server-side rendering và hydration, nên gói WASM chỉ được dùng cho các tính năng tương tác Chúng tôi cũng đang chuẩn bị demo bằng video. Bạn có điều gì cụ thể muốn xem không
  • Dùng cùng backend và htmx có thể sẽ rất hay. Chỉ là có vẻ không hề có JS engine chen vào, nên tôi tò mò không biết sẽ làm được thế nào

    • Có thể sẽ là một tổ hợp huyền thoại Lý tưởng nhất là web renderer hỗ trợ HTMX ở mức native Ý tưởng chung của HTMX là hỗ trợ các khả năng giúp HTML trở nên đầy đủ hơn. Tại sao chỉ mới có thể thực hiện yêu cầu HTTP, tại sao chỉ sự kiện click và submit mới có thể kích hoạt yêu cầu, tại sao chỉ có GET và POST, tại sao chỉ có thể thay thế toàn bộ màn hình Nhìn theo cách khác, HTMX làm cho các phần tử HTML bớt bị giới hạn và tổng quát hơn. Nếu web renderer tính đến điều đó ngay từ khi thiết kế thì có khi còn đơn giản hơn
    • Đang có xu hướng đưa các tính năng cốt lõi của HTMX vào đặc tả HTML, nên có thể sẽ không cần JS nữa https://www.reddit.com/r/htmx/comments/1ehjw7v/comment/lg09w...
    • Đơn giản thôi. Hãy thay htmx bằng Dioxus, hoặc sau này có thể là leptos
  • Hôm nay là lần đầu tôi biết đến Dioxus https://dioxuslabs.com/

  • Thật sự rất ngầu. Tôi muốn thử dùng nó trong một dự án C++ Một câu hỏi hiện lên ngay là hiệu năng. Tôi tò mò liệu nó có thể render những trang tương đối phức tạp với tốc độ khung hình cao hay không Bình thường tôi dùng ImGUI, và nó tuyệt vời đến mức gần như không phải nghĩ về vấn đề hiệu năng khi hiển thị dữ liệu thời gian thực. Trong khi đó, render web của Chromium lại đốt CPU chỉ để cập nhật văn bản DOM đơn giản ở mức 10 khung hình/giây; nếu chuyện này được giải quyết thì có thể sẽ thay đổi cuộc chơi

    • Hiện tại hiệu năng rất tệ Nhưng chúng tôi vẫn chưa hề dồn sức vào tối ưu hóa, và nó được xây trên những dependency khá nhanh, nên vẫn có khả năng tốt lên nhiều Tôi không nghĩ nó sẽ đánh bại Chromium trong một “cuộc đấu công bằng”, nhưng nó có tiềm năng làm được những điều Chrome không thể. Ví dụ như một API kiểu canvas mạnh hơn nhiều