>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
Rust

Jak renderować HTML i CSS w Rustu bez rozdętego Chromium

Za każdym razem, gdy ktoś pakuje małą aplikację desktopową w Electron, gdzieś płacze patyk pamięci RAM. Nawet alternatywy takie jak Tauri nadal zależą od systemowego WebView, który ma swoje dziwactwa na różnych systemach operacyjnych. Deweloperzy frameworka Dioxus postanowili wybrać trudną drogę i napisać własny lekki silnik renderujący w Rust. Nazwali projekt Blitz.

screenshot

Dlaczego zbudować kolejny silnik

Chromium lub WebKit zawierają gigabajty kodu. Zawierają wsparcie dla WebGL, WebSockets, WebRTC, Bluetooth, IndexedDB i setek API przeglądarki. Ale jeśli potrzebujesz tylko wyrenderować interfejs użytkownika oparty na HTML i CSS, prawie wszystko to staje się niepotrzebnym balastem.

Blitz pozbywa się wszystkiego, co zbędne. Silnik koncentruje się na jednym zadaniu: parsuj HTML/CSS, obliczaj układ strony i wyprowadzaj wynik na ekran lub teksturę GPU. Domyślnie nie ma silnika JavaScript. Stos sieciowy jest minimalny i może ładować zasoby przez HTTP tylko wtedy, gdy jawnie tego chcesz. Interakcja z systemem pozostaje w twoim kodzie Rust.

Modułowa architektura

Twórcy Blitz nie zaczynali od zera. Wzięli sprawdzone komponenty ze społeczności open-source i złożyli je w jednolity system:

  • Parsowanie CSS i obliczanie stylów obsługuje Stylo — silnik CSS z Mozilla Firefox i Servo.
  • Obliczenia układu Flexbox i CSS Grid obsługuje biblioteka Taffy.
  • Renderowanie tekstu odbywa się za pomocą Parley.
  • Parsowanie HTML obsługuje html5ever.
  • Renderowanie grafiki odbywa się przez abstrakcję AnyRender i Vello.

Ta struktura zapewnia elastyczność. Jeśli potrzebujesz parsować HTML i określać wymiary elementów bez renderowania na ekranie, potrzebujesz tylko crate'ów blitz-dom i blitz-html. Do budowania natywnych aplikacji Dioxus integrujesz dioxus-native.

Jak to wygląda w kodzie

Projekt jest we wczesnej fazie pre-alfa, więc będziesz musiał zbudować go ze źródeł. Możesz wypróbować przykłady w minutę:

git clone https://github.com/DioxusLabs/blitz
cd blitz
cargo run --release --package browser

Repozytorium zawiera kilka skryptów demonstracyjnych. Na przykład możesz uruchomić prosty podglądacz Markdown bezpośrednio z konsoli:

cargo run --release --package readme ./README.md

Dla tych, którzy już piszą w Dioxus i chcą wyeliminować zależność od WebView, repozytorium oferuje natywną kompilację. Po prostu dodaj bezpośredni link do wersji git w Cargo.toml:

[dependencies]
dioxus-native = { git = "https://github.com/DioxusLabs/blitz", features = ["prelude"] }

Po tym standardowy import use dioxus::prelude::* zmienia się na use dioxus_native::prelude::*, a interfejs użytkownika renderuje się przez Blitz.

Ograniczenia i obecny status

Budowanie komercyjnych produktów z Blitz jest wciąż przedwczesne. Deweloperzy uczciwie ostrzegają o licznych błędach i niezaimplementowanych funkcjach. Podstawowe selektory CSS, Flexbox, proste formularze i zmienne CSS już działają. Jednak złożone zapytania medialne lub specyficzne atrybuty układu mogą zachowywać się nieprzewidywalnie.

Projekt ma jednak pewne mocne strony. Integracja z biblioteką AccessKit zapewnia wsparcie dla czytników ekranu i systemów ułatwień dostępu od razu po wyjęciu z pudełka. A renderowanie przez WGPU pozwala osadzać interfejsy HTML bezpośrednio w silnikach gier lub scenach 3D.

Czy warto wypróbować

Blitz jest zaprojektowany jako narzędzie dla tych, którzy są zmęczeni ciężkimi wrapperami przeglądarki w tworzeniu aplikacji desktopowych. Nie stanie się pełnym zamiennikiem Electrona w najbliższym czasie.

Na razie projekt przypadnie do gustu programistom systemowym Rust, badaczom silników graficznych i entuzjastom ekosystemu Dioxus. Śledzenie rozwoju repozytorium jest warte zachodu, choćby po to, by zobaczyć, jak Stylo i Taffy ewoluują w lekką alternatywę dla CEF.

Powiązane projekty