Dioxus 0.5: Rust ile geliştirilen web, masaüstü ve mobil uygulamalar
(dioxuslabs.com)- Rust GUI çatısı Dioxus 0.5,
dioxus-core'un yeniden yazımı ve unsafe'in kaldırılması etrafında; web, masaüstü, mobil ve Fullstack geliştirme akışını büyük ölçüde sadeleştiriyor - 0.4.3 ile 0.5.0 arasında 100.000 satırdan fazla kod ve 1.400'den fazla commit eklendi; yeni çekirdek, lifetime ve
Scopebağımlılığını ortadan kaldıracak şekilde değişti - Mevcut
use_stateveuse_refmerkezli durum yönetimi, Copy yapılabilenSignalAPI'siyle değiştirildi; böylece event handler'larda ve future'larda tekrarlayanCloneyükü azalıyor - Tek bir
dioxus::launchvedx serve --platformakışıyla web, masaüstü ve Fullstack uygulamalar çalıştırılabiliyor; CLI, hedef platforma uygun build feature'ları otomatik olarak iletiyor - Varlık hot reload'u, event sisteminin yeniden yazımı, masaüstü render iyileştirmeleri ve server function streaming de birlikte değişerek tek bir Rust kod tabanının kullanım alanını genişletiyor
Dioxus 0.5'in sürüm yönü
- Dioxus, Rust ile GUI oluşturmak için kullanılan bir kütüphane ve web uygulamaları, masaüstü uygulamaları, mobil uygulamalar dağıtmak için kullanılıyor
- 0.5 sürümü, topluluğun talep ettiği sadeleşme, sağlamlık ve olgunluk artışını hedefleyerek tasarlandı
- Başlıca değişiklikler şunlar
dioxus-core'un tamamen yeniden yazılması ve unsafe kodun kaldırılmasıuse_state,use_refyerineSignaltabanlı API'nin gelmesi- Tüm lifetime'ların ve
cx: Scopedurumunun kaldırılması - Tüm platformlarda uygulamayı başlatan tek bir
launchfonksiyonu - Tailwind ve Vanilla CSS destekli varlık hot reload'u
- Yerel
WebSysevent tiplerine erişim sağlayan event sisteminin yeniden yazılması - Error Boundary, Server Future, Suspense entegrasyonu
- Masaüstünde reconciliation performansında 5 kat iyileşme
- Server function streaming ve Fullstack hot reload
- Dioxus 0.4'ten güncelleme yapacak kullanıcılar için bir migration guide sunuluyor
Lifetime ve Scope'un kaldırılması
- Dioxus 0.1'den 0.4'e kadar, bileşen içindeki değerler
'bumplifetime'ına sahipti; bu sayede hook'lar, props ve scope event listener'larda kopyalamaya gerek kalmadan kullanılabiliyordu - Bu yaklaşım event handler'larda çoğunlukla iyi çalışsa da, Dioxus future'ları
'staticolmak zorunda olduğundan, değerleri future içine taşımadan önceclonegerekiyordu - Lifetime hataları oluştuğunda, hata mesajları hook'un kendisinden çok
cx'in'static'ten daha uzun yaşaması gerektiğini söylüyor ve kafa karışıklığı yaratabiliyordu - Dioxus 0.5,
Scopeve'bumplifetime'ını kaldırıyor veElement'i lifetime'sız bir yapıya dönüştürüyor - Bileşenler artık scope parametresi olmadan props'u doğrudan alabiliyor
- Örnek:
fn MyComponent(name: String) -> Element
- Örnek:
- Runtime fonksiyonları artık yalnızca bileşen içinde değil, future ve event handler içinde de doğrudan kullanılabiliyor
Element'in'statichale gelmesi, onun hook içinde kullanılmasını veya context API üzerinden sağlanmasını da mümkün kılıyor- Bu değişim, sanal liste ya da offscreen rendering gibi API'lerin uygulanmasını kolaylaştıran bir temel oluşturuyor
dioxus-core içinde unsafe'in kaldırılması
'bumplifetime'ı ve scope'un kaldırılması, Dioxus içindeki unsafe kodu azaltmak için bir fırsat yarattıdioxus-core 0.5içinde unsafe kod bulunmuyor- Bazı bağımlılıklarda az miktarda unsafe kalmaya devam ediyor ve Dioxus ekibi bunu 0.5 sürüm döngüsü boyunca kaldırmayı planlıyor
- Kalan unsafe kullanımları, ya doğrudan kaldırılabilecek olanlar ya da FFI nedeniyle gerekli olanlar olarak sınıflandırılıyor
Signal tabanlı durum yönetimi
- Dioxus 0.5, bileşenlerin temel durum ilkel tipi olarak Signal'ı sunuyor
- Signal'ın önceki
use_stateveuse_ref'e göre iki avantajı var- Her zaman
Copyyapılabiliyor - Elle abonelik gerekmiyor
- Her zaman
-
Copy durum
Signal<T>, içindekiTdeğeriCopyolmasa bile kendisiCopy- Bu davranış, unsafe kullanılmadan uygulanmış generational-box crate'i sayesinde mümkün oluyor
- Gerekirse Signal
Send+Syncyapılabiliyor, böylece thread'ler arasında taşınabiliyor - Copy durum,
Send+SyncSignal'lar ve static bileşenlerin birleşimi; durumu future'lara, event handler'lara, thread'lere ve ihtiyaç duyulan diğer yerlere kolayca taşımayı sağlıyor - Bellek kullanım biçimi 0.4 ile neredeyse aynı kalırken, açık
Cloneihtiyacı ortadan kalkıyor
-
Akıllı abonelik
- Signal, değer değiştiğinde hangi bileşenin yeniden çalıştırılacağını daha hassas biçimde belirliyor
- Yalnızca Signal değerini okuyan bileşen yeniden çalıştırılıyor
- async görevlerde veya event handler'larda yapılan okumalar, bileşeni yeniden çalıştıran abonelik olarak sayılmıyor
- Üst bileşen bir buton tıklamasıyla Signal'ı değiştirip değeri kendisi okumuyorsa, ama alt bileşen değeri okuyorsa yalnızca alt bileşen yeniden render ediliyor
- Bu yapı sayesinde ayrı bir durum yönetimi crate'i olan Fermi'ye ihtiyaç kalmıyor
- Fermi, static'i anahtar olarak kullanan
use_statebenzeri bir API sunuyordu - Dioxus 0.5'te
GlobalSignal, static içine konup normal bir Signal gibi kullanılabiliyor - Signal, context API ile de çalıştığı için ayrı bir
use_shared_statehook'u olmadan bileşenler arasında durum paylaşımı yapılabiliyor use_future,use_memogibi hook'lar içinde Signal okunduğunda, ilgili Signal hook bağımlılıklarına otomatik ekleniyor
CSS ve varlık hot reload'u
- Dioxus 0.5, varlık sistemindeki yenilemenin bir parçası olarak varlık dizinindeki CSS dosyaları için hot reload getiriyor
- Bir CSS dosyası RSX içinde geçtiğinde,
dxCLI bu dosyayı izliyor ve güncellemeleri çalışan uygulamaya anında stream ediyor - Desteklenen hedefler Web, Desktop ve Fullstack; mobil desteğin ise ileride mobil odaklı bir güncellemeyle gelmesi planlanıyor
- Tailwind watcher ile birlikte kullanıldığında Tailwind CSS hot reload da destekleniyor
- VSCode'da custom regex extension ile Tailwind class ipuçları da alınabiliyor
- Değişiklikler aynı anda birden çok cihaza stream edilerek tüm hedef cihazlarda hot reload sağlanabiliyor
Event sisteminin yeniden yazılması
- Dioxus, ilk çıktığından beri çapraz platform event API'si oluşturmak için synthetic event sistemi kullanıyordu
- Synthetic event, platformlar arası davranış ve ağ üzerinden serileştirme için faydalıydı ancak sınırları da vardı
- Dioxus 0.5, her platformun temel event tipini açığa çıkarıyor ve çapraz platform API'si için trait'ler de sağlıyor
- Bu değişikliğin iki avantajı var
- Gerekli bilgiler doğrudan platform event tipinden alınabiliyor veya diğer kütüphanelere aktarılabiliyor
- Uygulamanın kullanmadığı event kodları için bundle splitting yapılabiliyor
- Hello world örneğinde gzip'lenmiş boyut yaklaşık %25 azaldı
- Daha küçük bundle üretmeye yönelik ipuçları Dioxus optimization guide içinde yer alıyor
Çapraz platform çalıştırma API'si
- Dioxus 0.5, uygulama çalıştırmak için yeni bir çapraz platform API'si sunuyor
- Ayrı renderer paketleri import etmek yerine
dioxuscrate'inde feature etkinleştirmek ve prelude içindekilaunchfonksiyonunu çağırmak yeterli - Tek bir uygulama şu platformlar için çalıştırılabiliyor
- Desktop:
dx serve --platform desktop - SPA Web:
dx serve --platform web - Fullstack:
dx serve --platform fullstack
- Desktop:
- CLI, hedef platforma göre uygun build feature'larını otomatik olarak iletiyor
Varlık sistemi betası ve Manganis
- Dioxus ve web uygulamalarında varlık yolları kolayca eskiyebiliyor, masaüstü ile web arasında linkler farklı olabiliyor ve bundle'a eklenecek varlıkların elle eklenmesi gerekebiliyordu
- Varlıklar aynı zamanda performans darboğazı da oluşturabiliyor
- Dioxus Mobile rehberi örneğinde, 0.4 sürümü yüklenirken 7 saniye sürüyor ve 9 MB kaynak aktarıyordu
- 0.5 mobil rehberi ise aynı görselleri kullanmasına rağmen 1 saniyenin altında yükleniyor ve gereken kaynak miktarı 1/3'e düşüyor
- Dioxus 0.5, yeni varlık sistemi manganis'i sunuyor
- CLI ile entegre çalışarak uygulama varlıklarını denetliyor, bundle'a ekliyor ve optimize ediyor
- API henüz kararlı olmadığı için ayrı bir crate olarak dağıtılıyor
- Bir varlığı
mg!makrosuyla sarmaladığınızda CLI bunu otomatik olarak algılıyor - Ayrıntılar manganis docs içinde bulunuyor
- 0.5 sürüm süreci boyunca manganis varlıklarına da hot reload eklenmesi planlanıyor
Masaüstü render performansında 5 kat iyileşme
- Dioxus, render diff'lerini hızlı oluşturmak için çeşitli optimizasyonlar kullanıyor
- Templates,
rsx!makrosunun statik kısımlarındaki diff işlemlerini atlamayı sağlıyor - Dioxus Web'de sledgehammer ile Rust'tan DOM değişiklikleri hızlı şekilde uygulanıyor
- Dioxus 0.5, aynı yaklaşımı ağ üzerinden değişiklik uygulamada da kullanıyor
- Desktop ve LiveView renderer'ları değişiklikleri JSON yerine ikili protokol ile iletiyor
- Render yükü yüksek işlerde yeni renderer, değişiklikleri tarayıcıya uygulama süresini 1/5'e, gecikmeyi ise 1/2'ye indiriyor
- Dioxus 0.4'te renderer'ın sürekli takıldığı benchmark, Dioxus 0.5'te akıcı biçimde çalışıyor
Bileşen yazmayı kolaylaştıran özellikler
- Dioxus 0.5, belirli bir element'i genişletmeyi ve özellikleri element'e yaymayı destekliyor
- Örnek:
imgelement özelliklerini genişletenImgPlusbileşeni,width,height,srcgibi sıradanimgözelliklerini doğrudan alabiliyor
- Örnek:
- Özellikleri ve bileşenlere aktarılacak değerleri yazarken struct initialization shorthand sözdizimi kullanılabiliyor
class: classyerine doğrudanclassyazılabiliyor
- Kısaltılmış özellik yazımı,
IntoAttributeuygulayan tüm öğelerde çalışıyor ve Signal da bundan yararlanıyor - Signal özellikleri henüz diffing atlama optimizasyonundan yararlanmasa da, 0.5 sürüm döngüsü içinde bunun performans iyileştirmesi olarak eklenmesi planlanıyor
- Birden fazla satıra bölünmüş özellikler birleştirilebiliyor
- Aynı
classözelliğine koşullu değerler eklendiğinde bunlar boşluk ayırıcıyla birleştiriliyor - Bu, Tailwind gibi derleme zamanında parse gerektiren ama çalışma zamanında dinamik işleme de ihtiyaç duyan kütüphaneler için önemli
- Bu sözdizimi Tailwind compiler ile entegre olarak
tailwind-mergebenzeri kütüphanelerin runtime yükünü kaldırıyor
- Aynı
Server function streaming ve Fullstack
- Dioxus 0.5, streaming veri desteği sunan güncel server functions crate'ini destekliyor
- Server function'lar, veriyi istemciye stream edebiliyor veya istemciden sunucuya stream edebiliyor
- Streaming server function'lar, çıktı tipini tanımlayıp server function içinden
TextStreamdöndürerek oluşturulabiliyor - Bu yapı, uzun süren işlemler sırasında istemciyi güncel tutmak için uygun
- Kalosm ve yerel LLM'ler kullanılarak sıradan donanım üzerinde OpenAI ChatGPT endpoint'ine benzer işlev sunan bir örnek bulunuyor
- Örnek depo: https://github.com/ealmloff/dioxus-streaming-llm
- CLI artık
fullstackplatformunu destekliyor; istemci ve sunucu için hot reload ile paralel build sağlıyordx servedx serve --platform fullstack
LiveView, varlık işleyici ve dosya işleme
- Dioxus 0.5'te router, LiveView uygulamalarında varsayılan olarak çalışıyor
- Dioxus Desktop, custom asset handler desteği sunuyor
- Custom asset handler, Rust kodundan JavaScript'e uğramadan veriyi tarayıcıya verimli biçimde stream etmeyi mümkün kılıyor
- Bu yaklaşım, video streaming gibi bant genişliği yüksek iletişimler için uygun
- gstreamer veya webrtc verileri doğrudan webview'e iletilebildiği için kareleri ayrıca encode/decode etme ihtiyacı azalıyor
- Masaüstünde dosya sürükleyip bırakma da event sistemine yerel olarak entegre edildi
Hata yönetimi
- Dioxus, Error Boundary ve
throwtrait'i ile üst bileşenlerde hataların kolayca ele alınmasını sağlıyor throwyaklaşımı, hata durumu ile erken dönüşün avantajlarını birleştiriyorDebuguygulayanResulttiplerindethrowçağrılarak hata durumuna geçilebiliyor ve?ile erken dönülebiliyorErrorBoundarybileşeni, alt bileşenlerde fırlatılan hata olduğunda farklı bir bileşen render ediyorErrorBoundaryiç içe kullanılabiliyor, böylece uygulamanın farklı seviyelerinde hatalar yakalanabiliyor- Bu desen, kurtarılamayan hatalarda panic etmek veya her hata için durumu elle yönetmek yerine global hata durumunu ele almak için kullanışlı
Geliştirici deneyimi ve şablonlar
- Dioxus, 0.3'te hot reload getirdi, 0.4'te bunu Desktop'a taşıdı ve 0.5'te varsayılan olarak etkinleştirdi
- Uygulama
dx serveile çalıştırıldığında, geliştirme modunda hot reload varsayılan olarak açık oluyor - Desktop uygulamalarında hot reload mümkün olmayıp tam yeniden derleme gerektiğinde bile açık pencerenin durumu korunup geri yükleniyor
- Uygulama penceresinin boyutu ve konumu korunuyor
- Her düzenlemede uygulamanın tüm ekranı kaplaması gibi durumlar azaltılıyor
- Yeni şablonlar, Web, Desktop, Mobile, TUI ve Fullstack uygulamalarını tek komutla oluşturacak şekilde düzenlendi
dx newvarsayılan uygulaması create-react-app'e daha yakın bir yapıya dönüştü- assets, CSS ve temel dağıtım ayarlarını içeriyor
- dioxus-std, VSCode Extension, dokümantasyon, eğitimler gibi faydalı kaynak bağlantılarını içeriyor
Dioxus Community ve ekosistem
- Dioxus Community, 0.5 sürümü için önemli ekosistem crate'lerini güncelledi
- icons, charts ve Dioxus'a özel standart kütüphane gibi crate'ler, 0.5 çıkışıyla birlikte hemen kullanılabilecek şekilde hazırlandı
Dioxus Communityprojesi, orijinal maintainer'ı ayrılsa bile önemli crate'leri güncel tutmak için kurulan yeni bir GitHub organizasyonu- Dioxus için kütüphane geliştiriyorsanız, Dioxus ekibi bakım konusunda yardımcı olabiliyor ve bunu fiilen bir “Tier 2” destek düzeyi olarak sürdürmeyi hedefliyor
Gelecekte planlanan özellikler
- 0.5 sonrasındaki planlar şu başlıkları içeriyor
- Varlık sisteminin kararlı hale getirilmesi ve daha derin entegrasyon
- lazy component ile birlikte çıktı
.wasmiçin doğrudan bundle splitting - Islands, resumable interactivity ve Signal serileştirme
- Server component ve LiveView'un Fullstack içinde birleştirilmesi
- Gelişmiş Devtools ve test framework'ü
- Mobil tarafın tamamen yenilenmesi
- WebSocket, SSE, progressive form gibi özellikleri içeren Fullstack yenilemesi
Servo tabanlı Dioxus-Blitz önizlemesi
- Dioxus-Blitz'in “Blitz 2.0” sürümünde Servo entegrasyonu ile, Firefox'u çalıştırmaya benzer bir CSS motoru üzerinde WGPU tabanlı yerel render hedefleniyor
- Taffy layout library'nin yaratıcısı Nico Burns, bu çalışmayı ilerletmek için tam zamanlı olarak ekibe katıldı
- Demoda
google.com, GPU üzerinde 900 FPS ile render ediliyor - Mevcut uygulama henüz tamamlanmış değil ve
google.comrender'ı hâlâ biraz kusurlu görünse de kullanılabilir seviyeye hızla yaklaşıyor - Depoya https://github.com/jkelleyrtp/stylo-dioxus adresinden bakılabiliyor
Nasıl katkı verilir
- Dioxus projesi şu katkıları bekliyor
- Dokümantasyon çevirisi
- “Good First Issues” denemeleri
- Dokümantasyon iyileştirmeleri
- CLI katkıları
- Discord topluluğunda soruları yanıtlama
- Dioxus ekibi, 2024'ün geri kalanında topluluk desteği için teşekkür ediyor ve uygulama geliştirmeyi dönüştürmeye yardımcı olunmasını istiyor
1 yorum
Hacker News yorumları
Çalışmaya başladığımda sürüm 0.2’ydi; bu 0.5 değişiklikleriyle o dönemde yaşadığım karmaşıklığın neredeyse tamamı ortadan kalkmış gibi görünüyor. Henüz kendim denemedim ama lifetime’ların kaldırılması ve sürekli klonlama yükünün azalmasıyla çok daha rahat olacağını düşünüyorum.
Masaüstü, web/wasm, mobil vb. hedeflere dağıtılabilen yerel reaktif UI yapmaya çalışan epey Rust framework’ü var: https://github.com/flosse/rust-web-framework-comparison. Yanlış seçersem terk edilmiş bir framework’ü sürdürmek ya da sancılı bir migration yapmak zorunda kalırım diye endişeleniyorum.
Rust HTTP sunucu framework’lerinde de benzer şekilde çok seçenek vardı; şimdi Axum, Actix ve Rocket önde görünüyor, topluluk akışı da Axum’a kayıyor gibi olduğu için Actix’i seçmek hata mıydı diye düşünüyorum. Dioxus’un kazanacağına dair bir işaret var mı; büyük topluluk, YC desteği ve momentum dışında bugün seçilebileceğini gösteren bir ölçüt var mı, merak ediyorum.
Leptos ve Yew de başlıca rakipler mi; Dioxus’tan daha iyi ya da daha kötü olmalarının sebepleri neler, bilmek isterim. Şirket Rust, Actix ve Bevy’ye ciddi yatırım yaptı; ileride Bevy ile Dioxus gibi framework’leri birleştirerek yerel masaüstü ve mobil istemciler yapmak istiyoruz.
Ayrıca Dioxus adının Pokémon’daki Deoxys’ten gelip gelmediğini de merak ediyorum. Logo öyle bir his veriyor ama codebase’de Pokémon referansı yok.
Yaklaşık 9 ay önce Dioxus ile sshfs için bir GUI frontend’i yaptım; geliştiricinin henüz tamamlamadığı bir özellikle duvara çarpana kadar gerçekten harika bir GUI framework’ü izlenimi vermişti.
Farklı context’ler arasında state paylaşımı da zaman zaman sancılı ama dil ya da temel teknoloji ne olursa olsun kullandığım tüm GUI framework’lerinde böyleydi. Dioxus 0.5 bu konuda büyük bir ilerleme gibi görünüyor. Blog’um HTML’in epey büyük bir kısmını Dioxus ile render ediyor; sınırları zorlayan bir kullanım olmadığı için gayet iyi çalışıyor.
Ancak lifetime’ları kaldırma çözümü bana biraz tuhaf geliyor. generational-box bir tür yoksul işi garbage collector değil mi diye düşünüyorum; performans etkisinin nasıl olduğunu merak ediyorum.
Ayrıca
[generational-box]([https://crates.io/crates/generational-box](<https://crates.io/crates/generational-box>))bağlantısı bozuk.use_hook, component’in lifetime’ı boyunca değerin sahipliğini tuttuğu için component kaybolduğunda o değer de drop edilir. Tüm signal’lar hâlâuse_hookkullandığından lifetime’ları da aynı.use_hookdışındaGenerationalBox::new()çağırmak genelde önerilmediği için performans etkisi yok.Bir döngü içinde
GenerationalBox::new()’u gelişi güzel kullanırsanız o çöp component drop edilene kadar kalır; ama çoğu durumda bir Map’e ya da Vec’e push/pop yaparsınız ve o zaman normal bellek semantiği geçerli olur.Bunun bir tür arena allocation olduğunu anlıyorum; ama “kopyalamadan kopyalama”yı nasıl desteklediğini ve içeride nesilli bir
RefCellarenası oluşturupGenerationalBox’ınCopyolduğu açıklamasının neden güvenli olduğunu anlayamıyorum.Statik veriye işaretçi oluşturulabileceğini anlıyorum; peki statik lifetime’ı olmayan bir değer olursa ne oluyor, merak ediyorum.
Veri referansı programın lifetime’ı boyunca korunuyor. Generational box, programa göre daha kısa yaşayan verileri koymanıza olanak tanır; ama o veri referans içermemelidir. Koyduğunuz veriyi drop ettiğinizde o box başka bir allocation için yeniden kullanılır.
Merkezi bir arena yerine box kullanması dışında, nesilli arenaya çok benzeyen bir yaklaşım; bu da kilitlenme sorunlarından kaçınmak için seçilmiş. Drop edildikten sonra
Copyreferansla veriye erişmeye çalışırsanız iyi bir hata mesajıyla başarısız olur.Copynin belirli bir anlamı var.Bir tür
Copytrait’ini implemente ediyorsa bu,memcpyile kopyalanabileceği anlamına gelir; derin kopyadan çok sığ kopyaya yakındır.Bu yüzden bunu “kopyalamadan kopyalama” değil,
Copyolmayan bir türüCopytür gibi ele almayı mümkün kılmak olarak anlıyorum. README’de statik içeriğin gerektiği yazıyor; dolayısıyla statik lifetime’ı olmayan değerler için cevap “bunu yapamazsınız” olur.Dioxus’un React’i başarılı kılan unsurların çoğunu alırken bunun üzerinde hızlıca yenilik yapıp dağıtmasını seviyorum. Bu sürümdeki signals’ı denemeyi sabırsızlıkla bekliyorum.
React’in JS ve web için yaptığı iyi şeyleri ve isim değerini kabul ediyorum; ama 2024’te bir dili ya da DSL’i sıfırdan tasarlayabiliyorsak “reaktif UI” kodunun mutlaka React gibi görünmesi gerektiğini düşünmüyorum.
SwiftUI’nin kusursuz olduğunu söylemiyorum; ama SwiftUI ile yazılan kod, React’te benzer kod yazmaya kıyasla çok daha temiz düzenlenmiş ve bölümlenmiş hissi veriyor.
Çapraz platform GUI’de JSX kullanmanın gerçek avantajı, web için mevcut kütüphaneleri yeniden kullanmak gibi görünüyor; RSX’in ise geliştiricinin JSX kavram bilgisini RSX’e taşıyabilmesi dışında “taşınabilir değeri” daha az görünüyor. Bence React/JSX paradigmasından nesnel olarak daha iyi olduğu düşünülen yeni bir paradigmayı öğrenmek daha iyi bir uzlaşma olurdu.
Özetle, “SwiftUI ama çapraz platform” olan bir proje olsa güzel olurdu, ama henüz yok. @Tokamak/TokamakUI’yi biliyorum, fakat hâlâ epey tamamlanmamış ve etkinliği de azalmış gibi görünüyor.
Şimdilik yalnızca Linux/mac/windows üzerinde yerel masaüstü uygulamalarını destekliyor, ancak WASM, web ve mobil desteği planları var.
Freenet’i kuran kişilerin ilk göreceği merkeziyetsiz web sitesi olacak. Birkaç yıldır aralıklı olarak üzerinde çalıştığım Kotlin web framework’ü Kweb’e de biraz benziyor; özellikle durum yönetimi ve koddan HTML’ye eşlenen DSL yaklaşımı benzer. Şu ana kadar hoşuma gitti.
https://freenet.org/
https://kweb.io/
Aslında Kotlin hayranıyım; Kotlin DSL’lerini ve eşzamanlılık modelini seviyorum.
Tauri, frontend’i bir webview içine koyar ve yerel Rust fonksiyonlarıyla Electron’daki gibi bir IPC sınırı üzerinden iletişim kurmak zorundadır.
Dioxus’ta Rust kodu yerel tarafta olduğu için dosya sistemi okuma, websocket gibi işler için IPC gerekmez. Tauri, frontend’i WASM’e derlemeyi zorunlu kılar; ilginç Rust crate’lerinin birçoğu da wasm’e derlenmez.
IPC sınırı olmadığında geliştirmenin ne kadar basitleştiğini sözle anlatmak zor. Dioxus araçları yalnızca Rust’ı hedeflediği için sıfırdan paketlenmiş bir
.app’e 1 dakikadan kısa sürede gidebilirsiniz. Yeni build yaklaşık 12 saniye, yeni bundle yaklaşık 20 saniye.Yine de Tauri’nin sağladığı esnekliği, yani web uyumlu herhangi bir UI’yi frontend olarak kullanabilmeyi çok seviyorum; Tauri uygulaması içinde Dioxus da kullanılabilir.
Dioxus’un README’de bunu doğrudan ele alması güzel, ama ikisini de kullanmış kişilerin gerçek deneyimlerini de merak ediyorum.
Tauri ile oyuncak bir masaüstü uygulaması yaptım; web frontend’in her tuş vuruşunda güncellenip çalışmasına rağmen gecikme olmayacak kadar IPC’nin hızlı olup olmadığını kontrol ettim ve yanıt “evet”ti. Büyük bir dosyayı her tuş vuruşunda frontend’den Rust katmanına gönderip tekrar frontend’e geri alabilir miyim sorusunun yanıtı ise, en azından benim saf uygulamamda, “hayır”dı.
Hem Tauri hem Dioxus için iyi görünen pek çok kullanım örneği var ve bazı durumlarda Dioxus daha iyi olabilir gibi. “Projemizde X ve Y nedeniyle Dioxus ya da Tauri’yi seçtik” türünden karşılaştırmalı deneyimleri duymak isterim. Dioxus gerçekten harika görünüyor; denemeyi dört gözle bekliyorum.
stylo, Servo’dan gelip Firefox ile paylaşılan kısım. Uzun vadede insanları WGPU renderer’a geçirmek istiyoruz, ama hâlâ oldukça erken aşamada; Dioxus kullanan birçok şirket de webview’ün uygulamanın yaklaşık %90’ı için pratikte yeterince iyi bir çözüm olduğunu biliyor.
İnsanların bazen
unsafe’i fazla kolay kullandığını anlıyorum, ama standart kütüphane deunsafeile dolu ve çizgiyi orada çekmek bazen kuma çizgi çekmek gibi görünüyor.Üç yerde kullanılıyor. iOS’te bazı FFI düzeltmeleri, signal üzerinde fonksiyon çağırma sözdizimini mümkün kılan implementasyon ve pointer’ı hash olarak kullanan ID için Send/Sync implementasyonu.
Sonuncusuna şimdi bakınca
usizeile değiştirirsek kaldırılabilir gibi görünüyor.unsafe’ten biraz fazla korkabileceğine katılıyorum.Yine de bir crate yazarının kendi crate’inden
unsafe’i kaldırmayı hedeflemesi mutlaka kötü bir karar değil.Tüm
unsafe’leri kaldırmaya çalışan crate yazarları çoğu zaman kullanıcının taşımak zorunda olduğu güven yükünü azaltmak ister. Benceunsafeanahtar sözcüğünün gücü de burada. Aslında belkitrust_meblokları vecheck_yourselffonksiyonları olarak ikiye ayrılmalıydı.unsafe, bellek güvenliği tartışmasını kodun çok dar ve denetlenebilir noktalarıyla sınırlar; aynı zamanda güven hakkında yeni ve yönetilebilir bir tartışma yaratır.use*adlandırma kuralını neden getirdiğini anlıyorum, ama Dioxus’ta yeni signal oluşturan fonksiyonun nedenuse_signalolduğunu merak ediyorum.let mut count = use_signal(|| 0);yeni bir signal oluşturan çağrı değil mi? Signal her render’da yeniden oluşturulmaz; zaten signal’in özü bu.SolidJS’te signal,
const [count, setCount] = createSignal(0)gibi createSignal ile oluşturulur ve bu çok daha anlaşılır.API adları önemlidir. Çünkü state hook’ları farklı çalışır ve
useMemogibi tamamlayıcı ihtiyaçlar da doğabilir. Dioxus’un React’e yakın görünmek istemesi dışındause_signaladını seçmesinin bir nedeni var mı, merak ediyorum.Solid’den çok Preact’e daha yakındır.
Optimizasyonlar arasında UI’nin dinamik parçalarını ayrı “diff bin”lere ayırmak, varsayılan memoization ve signal’in property’leri örtük olarak dirty/managed diye işaretlemesi yer alır.