- Blitz, HTML/CSS render etmeye odaklanan modüler bir render motoru ve tam tarayıcı işlevlerini varsayılan olarak sunmak yerine, gerekli ek özellikleri isteğe bağlı bırakmayı hedefleyen bir tasarıma sahip
- Mevcut durumu pre-alpha; renderer şimdiden oldukça fazla işleve sahip olsa da çok sayıda hata ve eksik özellik bulunduğundan uygulama geliştirmede kullanılması henüz önerilmiyor
- Hedeflenen destek kapsamı modern HTML layout, advanced CSS, HTML form controls, AccessKit tabanlı erişilebilirlik ve custom widgets genişletmeleri; WebRTC, WebSockets, Bluetooth, localStorage gibi özellikler ise sunulmuyor
- Yapı; çekirdek DOM soyutlaması ile ağ, render, pencere ve durum yönetimi modüllerine ayrılıyor;
blitz ve dioxus-native adlı üst seviye wrapper crate’ler ise HTML/Markdown veya Dioxus VirtualDom render işini üstleniyor
- Yeni sürüm olan Blitz v0.2+ Stylo kullanıyor; v0.1 kaynak kodu
legacy dalında kalmaya devam ediyor ancak aktif olarak geliştirilmiyor
HTML/CSS render etmeye odaklanan motor
- Blitz bir HTML/CSS render motoru ve çıkış noktası, temel kullanım senaryosu olan HTML/CSS render etme ihtiyacına kıyasla tarayıcıların fazla şişkin olduğu düşüncesi
- Amaç, tarayıcıdaki tüm işlevleri uygulamak değil; HTML/CSS render için gereken yetenekleri merkeze alıp geri kalan özellikleri mümkün olduğunca opt-in hale getirmek
- Şu anda pre-alpha durumunda
- Renderer şimdiden oldukça fazla işleve sahip
- Hâlâ çok sayıda hata ve eksik özellik var
- Uygulama geliştirmek için kullanılması henüz tavsiye edilmiyor
- Daha ayrıntılı ilerleme durumu roadmap issue üzerinden görülebilir
Hedeflenen ve hariç tutulan özellikler
- Blitz’in desteklemeyi hedeflediği kapsam HTML/CSS UI render etme üzerine kurulu
- flexbox, grid, table, block, inline, absolute/fixed gibi modern HTML layout
- complex selectors, media queries, CSS variables gibi advanced CSS
- HTML form controls
- AccessKit tabanlı erişilebilirlik
- custom widgets ile genişletilebilirlik
- Blitz, WebRTC, WebSockets, Bluetooth, localStorage gibi özellikler sunmuyor
- Native uygulamalarda bu işlevlerin önemli bir kısmı normal Rust crate’leriyle ele alınabiliyor
- Bu tür özelliklerin renderer ile sıkı bağlı olması gerekmediği görüşünde
- JavaScript, Python ve diğer diller için binding’ler henüz yok, ancak bu konuda katkı kabul ediliyor
Çalıştırma ve örnekler
- Depoyu klonladıktan sonra
browser paketini çalıştırabilirsiniz
cargo run --release --package browser
- Örnekler arasında küçük bir TODO uygulaması, Markdown renderer ve ham WGPU render entegrasyonu bulunuyor
cargo run --release --package todomvc
cargo run --release --package readme ./README.md
cargo run --release --package wgpu_texture
Modüler mimari
- Blitz; core DOM abstraction, ek özellik modülleri ve iki üst seviye wrapper’dan oluşuyor
- Ağ, render, pencere ve durum yönetimi gibi işlevler ayrı modüllere bölünmüş durumda
- Bu parçalar birleştirilerek tek bir web motoru oluşturulabiliyor
-
Üst seviye wrapper crate’ler
blitz: HTML string render edebilen bir HTML/Markdown frontend
- HTML veya Markdown dosyalarını önizlemek için kullanışlı
- Şu anda etkileşim yok
blitz-dom, blitz-html, blitz-shell, blitz-renderer-vello kullanıyor
dioxus-native: Dioxus VirtualDom render eden bir Dioxus frontend
- Dioxus event handling sayesinde tam etkileşim desteği sunuyor
blitz-dom, dioxus-core, blitz-shell, blitz-renderer-vello kullanıyor
- Her iki wrapper da alt kaynakları almak için isteğe bağlı olarak
blitz-net kullanabiliyor
-
Çekirdek crate’ler ve ek crate’ler
blitz-dom: style resolution, layout ve event handling içeren core DOM abstraction
- parsing, rendering ve system integration içermez
- Stylo, Taffy, Parley kullanır
blitz-traits: farklı crate’lerin birbirine doğrudan bağımlı olmadan birlikte çalışabilmesini sağlayan minimal temel crate
blitz-net: HTTP, dosya sistemi ve encoded data URI üzerinden kaynak getiren ağ modülü
- reqwest kullanır
blitz-paint: blitz-dom ağacını anyrender draw commands’a dönüştürür
- anyrender kullanır
blitz-html: blitz-dom üzerine HTML parsing ekler
- html5ever ve xml5ever kullanır
blitz-shell: Blitz’in bir pencereye render etmesini sağlayan shell
- Winit event loop, AccessKit, Muda ve benzerlerini entegre eder
- winit, accesskit, muda kullanır
- AnyRender render soyutlaması ayrı bir depo olan anyrender’a taşındı
Dioxus Native geliştirme sürümünü kullanma
- Dioxus Native’in en güncel geliştirme sürümü bu depoda yer alıyor
- Dioxus Native hızlı geliştirildiği için, resmi sürümü beklemeden en yeni özellikleri ve hata düzeltmelerini kullanmak isterseniz git sürümünü tercih edebilirsiniz
- git sürümünü kullanma adımları şöyle
dioxus crate bağımlılığını tamamen kaldırın
dioxus-native = { git = "https://github.com/DioxusLabs/blitz", rev = "e64a3d8", features = ["prelude"] } ekleyin
e64a3d8 değerini istediğiniz sürümün git commit id’siyle değiştirin
- Rust kodunda
use dioxus::prelude::* satırını use dioxus_native::prelude::* olarak değiştirin
- Dioxus Native prelude tarafından dışa aktarılmayan
dioxus özelliklerine ihtiyaç varsa dioxus-html, dioxus-signals, dioxus-router gibi ayrı sub-crate’lerden import edin
- Dioxus Native’in git sürümü hâlâ crates.io üzerindeki kararlı Dioxus v0.7.x sürümüne bağımlı
dioxus-sdk, dioxus-components, dioxus-free-icons gibi ek kütüphaneler çalışmaya devam etmeli
Sürüm ve lisans
- Bu depoda Blitz v0.2+ yeni sürümü bulunuyor ve Stylo kullanıyor
- Önceki sürüm olan v0.1 kaynak kodu legacy dalında duruyor
- v0.1 aktif olarak geliştirilmiyor
- Proje Apache 2.0 ve MIT dual license ile dağıtılıyor
stylo_taffy crate’ine, Servo projesiyle birlikte çalışmayı kolaylaştırmak için ek olarak MPL 2.0 da uygulanıyor
- Bu nedenle
stylo_taffy, Apache 2.0, MIT ve MPL 2.0 olmak üzere triple license’a sahip
- Blitz’e bilinçli olarak gönderilen katkılar, aksi belirtilmedikçe Apache 2.0 ve MIT ile dual licensed kabul ediliyor
stylo_taffy için gönderilen katkılar MPL 2.0’ı da kapsıyor
1 yorum
Hacker News yorumları
Blitz’in baş geliştiricisiyim. Henüz tamamlanmış aşamada değil; metin girişi/odak sistemi temel düzeyde ve kök viewport dışında kaydırmayı desteklemiyor.
nth-child,:hasgibi karmaşık CSS seçicileri henüz düzgün çalışmıyor; Blitz’in üstünde çalışan React benzeri framework Dioxus ile olay işleme entegrasyonu da yalnızca tıklama seviyesinde vepreventDefaultda yok. Ağ katmanı şu anda çok basit: ana iş parçacığında eşzamanlı istek yapıyor; düzgün bir asenkron veya çok iş parçacıklı ağ katmanına ihtiyaç var. Performans çalışması da neredeyse hiç yapılmadı; her karede stil/layout/paint yeniden hesaplanıyor ve temizlenmeyen düğümler yüzünden birkaç yerde bellek sızıntısı var. Gölgeler, web fontları,calc, float layout ve metin girişi dışındaki form kontrolleri de henüz eksik. Sonuçta durum “webview yapmak büyük iş ve henüz o noktaya gelmedik” demeye daha yakın; 2-3 ay içinde daha tamamlanmış bir biçim bekliyoruz. Ekran görüntüleri burada da var: https://github.com/DioxusLabs/blitz/issues/23Bu proje ilk bakışta bile çok yararlı görünüyor. Yaygın kullanılan HTML/CSS layout paradigmasıyla native uygulamalar yapmak, fakat tam JS/DOM/tarayıcı API’lerinin ima ettiği ağır kısımları çıkarmak şeklinde. Electron gibi bir tarayıcı motorunu paketlemeye kıyasla çok daha büyük bir iyileştirme sağlayabilecek gibi görünüyor. Tesadüfen yakın zamanda Richard Feldman’ın podcast’inde Casey Muratori’nin CSS’i çok eleştirel biçimde anlattığını dinledim. Basit layout ilişkileri kurmak için web sayfasını önceden render edip dinamik olarak ölçmek zorunda kaldığı örnekler özellikle bana çok dokundu. Muratori’nin dediği gibi CSS yazmak, basit temel öğelerin üstüne inşa etmekten çok mahkemede bir davayı savunuyormuş hissine yakın. Elbette aşinalık, uyumluluk ve “iyi çalışan yolun CSS’i”nin inanılmaz üretken olması nedeniyle böyle bir projenin karşıladığı talep büyük. Yine de kullanıcıların daha aşağıya inip kullanabileceği daha basit ve genel bir katman sunma fırsatı da var gibi görünüyor. CSS’i JS API ile genişletilebilir yapmayı amaçlayan CSS Houdini’den ilham alınabilir; belki de “Custom Widgets” ile kastedilen şey budur.
floatçıkarılsa bile olur.Birkaç yıl önce, hayır 20 yıl önce, Flying Saucer adlı benzer bir açık kaynak proje yapmıştım. Saf Java tabanlı bir HTML + CSS2 renderer’dı. Oyunlarda zengin metin UI’ları render etmek için kullanılacağını hayal etmiştim, ama asıl temel kullanım alanı sunucu tarafında PDF üretimiydi. O dönemde sunulan çeşitli PDF rapor üretme API’lerini kullanmaktansa HTML üretip PDF’e render etmek çok daha kolaydı. Blitz harika görünüyor ve Rust GUI kütüphanelerinin artmasını sabırsızlıkla bekliyorum. https://en.wikipedia.org/wiki/Flying_Saucer_(library) Şaşırtıcı biçimde hâlâ güncelleniyor: https://github.com/flyingsaucerproject/flyingsaucer/releases...
“JavaScript motorunu yerel Rust API ile değiştiren hafif bir webview” kulağa umut verici geliyor. Temelde JS’in yol üzerinde olmadığı Tauri gibi bir şeyse, bunu duymak bile güzel
İlginç. Tam bugün puppeteer ve headless Chromium yüzünden berbat bir şey yaşayıp wkhtmltopdf alternatifi arıyordum
LD_PRELOAD’a jemalloc koyup çalıştırmak kesinlikle yapılmaması gereken bir şey. Sorunu çözdüm ama daha basit bir renderer fikri daha çok hoşuma gittiDoğrudan Blitz hakkında değil ama Dioxus’u ilk kez öğrenmiş oldum WASM’e derlenen framework’lerin demolarını düzgün göstermemek ya da kendi sitelerini o framework ile barındırmamak gibi örtük bir kuralı mı var merak ediyorum. Bunu 5-6 kez görmüş gibiyim Dioxus ana sayfasında WASM dosyasının yüklendiğini görüyorum ama nerede kullanıldığı ya da gerçekten kullanılıp kullanılmadığı net değil
Backend ile htmx birlikte kullanılırsa harika olabilir. Ancak JS motoru hiç işin içine karışmıyor gibi göründüğü için bunun nasıl yapılabileceğini merak ediyorum
veHTTP isteği yapabilsin, neden yalnızca tıklama ve gönderme olayları istek tetiklesin, neden sadece GET ve POST mümkün olsun, neden yalnızca tüm ekran değiştirilebilsin? Başka bir açıdan bakınca HTMX, HTML öğelerini daha az kısıtlı ve daha genel hale getiriyor. Bir web renderer bunu tasarımda dikkate alırsa hatta daha da basitleşebilirDioxus’u bugün ilk kez öğrendim https://dioxuslabs.com/
Gerçekten harika. Bir C++ projesinde denemek isterim Aklıma gelen bir soru performans. Nispeten karmaşık sayfaları yüksek FPS ile render edip edemeyeceğini merak ediyorum Genelde ImGUI kullanıyorum; gerçek zamanlı veri gösterirken performans sorunlarını neredeyse hiç düşünmem gerekmeyecek kadar iyi. Buna karşılık Chromium’un web render’ı, basit DOM metin güncellemelerini saniyede yalnızca 10 kare hızında yapsanız bile CPU’yu yakıyor; bu çözülürse oyunun kuralları değişebilir