- Framework GUI Rust Dioxus 0.5 sangat menyederhanakan alur pengembangan Web, Desktop, Mobile, dan Fullstack, dengan fokus pada penulisan ulang
dioxus-coredan penghapusan unsafe - Antara 0.4.3 dan 0.5.0, masuk lebih dari 100.000 baris kode dan lebih dari 1.400 commit; core baru berubah ke arah menghilangkan lifetime dan ketergantungan pada
Scope - Manajemen state yang sebelumnya berpusat pada
use_statedanuse_refdigantikan oleh APISignalyang dapat di-Copy, sehingga bebanCloneberulang di event handler dan future berkurang - Dengan satu alur
dioxus::launchdandx serve --platform, aplikasi Web, Desktop, dan Fullstack dapat dijalankan, sementara CLI otomatis meneruskan build feature yang sesuai dengan platform target - Hot reload aset, penulisan ulang event, peningkatan rendering Desktop, hingga streaming server function ikut berubah, sehingga cakupan penerapan satu codebase Rust menjadi lebih luas
Arah rilis Dioxus 0.5
- Dioxus adalah library untuk membuat GUI dengan Rust, dan digunakan untuk distribusi aplikasi web, desktop, dan mobile
- Rilis 0.5 dirancang dengan tujuan penyederhanaan, ketangguhan, dan peningkatan kelengkapan yang diminta komunitas
- Perubahan utamanya adalah sebagai berikut
- Penulisan ulang penuh
dioxus-coredan penghapusan kode unsafe - Pengenalan API berbasis
Signalsebagai penggantiuse_statedanuse_ref - Penghapusan semua lifetime dan state
cx: Scope - Satu fungsi
launchuntuk memulai aplikasi di semua platform - Hot reload aset yang mendukung Tailwind dan Vanilla CSS
- Penulisan ulang event yang memungkinkan akses ke tipe event native
WebSys - Integrasi Error Boundary, Server Future, dan Suspense
- Peningkatan reconciliation Desktop hingga 5 kali
- Streaming server function dan hot reload Fullstack
- Penulisan ulang penuh
- Panduan migrasi tersedia bagi pengguna yang memperbarui dari Dioxus 0.4
Penghapusan lifetime dan Scope
- Dari Dioxus 0.1 hingga 0.4, nilai di dalam komponen memiliki lifetime
'bump, yang memungkinkan hook, props, dan scope digunakan di event listener tanpa perlu disalin - Di event handler, pendekatan ini umumnya berjalan baik, tetapi future di Dioxus harus bersifat
'static, sehingga nilai perlu di-clonesebelum dipindahkan ke dalam future - Saat terjadi error lifetime, pesan yang muncul bisa membingungkan karena menyatakan bahwa
cx, bukan hook itu sendiri, harus hidup lebih lama daripada'static - Dioxus 0.5 menghapus
Scopedan lifetime'bump, serta mengubahElementmenjadi bentuk tanpa lifetime - Komponen kini dapat menerima props secara langsung tanpa parameter scope
- Contoh:
fn MyComponent(name: String) -> Element
- Contoh:
- Fungsi runtime dapat digunakan langsung tidak hanya di dalam komponen, tetapi juga di dalam future dan event handler
- Karena
Elementmenjadi'static, ia juga bisa digunakan di dalam hook atau disediakan melalui context API - Perubahan ini menjadi fondasi yang memudahkan implementasi API seperti virtual list atau offscreen rendering
Penghapusan unsafe dari dioxus-core
- Penghapusan lifetime
'bumpdan scope membuka peluang untuk mengurangi kode unsafe di internal Dioxus dioxus-core 0.5tidak memiliki kode unsafe- Sejumlah kecil unsafe masih tersisa di beberapa dependensi, dan tim Dioxus berencana menghapusnya selama siklus rilis 0.5
- Unsafe yang tersisa diklasifikasikan sebagai hal yang dapat dihapus secara sederhana atau diperlukan karena FFI
Manajemen state berbasis Signal
- Dioxus 0.5 memperkenalkan Signal sebagai tipe primitif state inti untuk komponen
- Signal memiliki dua keunggulan dibanding
use_statedanuse_refsebelumnya- Selalu dapat di-
Copy - Tidak memerlukan subscription manual
- Selalu dapat di-
-
State Copy
Signal<T>bersifatCopymeskipun nilaiTdi dalamnya bukanCopy- Perilaku ini dimungkinkan oleh crate generational-box yang diimplementasikan tanpa unsafe
- Jika diperlukan, Signal dapat dibuat
Send+Syncsehingga bisa dipindahkan antar-thread - Kombinasi state Copy, Signal
Send+Sync, dan komponen static membuat state mudah dipindahkan ke lokasi yang diperlukan seperti future, event handler, atau thread - Pola penggunaan memorinya hampir sama dengan 0.4, tetapi tidak memerlukan
Cloneeksplisit
-
Subscription cerdas
- Signal menentukan dengan lebih rinci komponen mana yang perlu dijalankan ulang saat nilainya berubah
- Komponen hanya dijalankan ulang jika komponen tersebut membaca nilai Signal
- Pembacaan di async task atau event handler tidak dianggap sebagai subscription untuk menjalankan ulang komponen
- Jika parent mengubah Signal melalui klik tombol tetapi tidak membaca nilainya secara langsung, sementara hanya child yang membaca nilainya, maka hanya child yang di-render ulang
- Berkat struktur ini, Fermi, yang sebelumnya merupakan crate manajemen state terpisah, tidak lagi diperlukan
- Fermi menyediakan API mirip
use_stateyang menggunakan static sebagai key - Di Dioxus 0.5,
GlobalSignaldapat ditempatkan di static dan digunakan seperti Signal biasa - Signal juga bekerja dengan context API, sehingga state dapat dibagikan antar-komponen tanpa hook
use_shared_stateterpisah - Saat Signal dibaca di dalam hook seperti
use_futureatauuse_memo, Signal tersebut otomatis ditambahkan ke dependensi hook
Hot reload CSS dan aset
- Sebagai bagian dari perombakan sistem aset, Dioxus 0.5 mengimplementasikan hot reload untuk file CSS di direktori aset
- Jika file CSS muncul di dalam RSX, CLI
dxakan memantau file tersebut dan langsung melakukan streaming update ke aplikasi yang sedang berjalan - Target yang didukung adalah Web, Desktop, dan Fullstack; dukungan mobile akan disediakan dalam pembaruan yang berfokus pada mobile di masa mendatang
- Jika digunakan bersama Tailwind watcher, hot reload Tailwind CSS juga didukung
- Di VSCode, hint class Tailwind juga dapat diperoleh melalui custom regex extension
- Perubahan dapat di-streaming secara bersamaan ke beberapa perangkat untuk melakukan hot reload di seluruh perangkat target
Penulisan ulang sistem event
- Sejak awal rilis, Dioxus menggunakan sistem synthetic event untuk membuat API event lintas platform
- Synthetic event berguna untuk perilaku event lintas platform dan serialisasi jaringan, tetapi juga memiliki keterbatasan
- Dioxus 0.5 mengekspos tipe event dasar dari masing-masing platform, sekaligus menyediakan trait untuk API lintas platform
- Perubahan ini memiliki dua keuntungan
- Informasi yang diperlukan dapat diperoleh langsung dari tipe event platform atau diteruskan ke library lain
- Kode event yang tidak digunakan aplikasi dapat di-bundle splitting
- Pada contoh hello world, ukuran gzipped berkurang sekitar 25%
- Tips membuat bundle kecil disertakan dalam panduan optimasi Dioxus
API eksekusi lintas platform
- Dioxus 0.5 memperkenalkan API lintas platform baru untuk menjalankan aplikasi
- Alih-alih mengimpor paket renderer terpisah, cukup aktifkan feature pada crate
dioxusdan panggil fungsilaunchdari prelude - Satu aplikasi dapat dijalankan dengan target platform berikut
- Desktop:
dx serve --platform desktop - SPA Web:
dx serve --platform web - Fullstack:
dx serve --platform fullstack
- Desktop:
- CLI secara otomatis meneruskan build feature yang sesuai berdasarkan platform target
Beta sistem aset dan Manganis
- Di Dioxus dan aplikasi web, path aset mudah menjadi usang, link bisa berbeda antara desktop dan web, dan aset yang perlu disertakan dalam bundle harus ditambahkan secara manual
- Aset juga bisa menjadi bottleneck performa
- Pada contoh panduan Dioxus Mobile, versi 0.4 membutuhkan 7 detik untuk memuat dan mentransfer resource sebesar 9 MB
- Panduan mobile 0.5 menggunakan gambar yang sama, tetapi dimuat dalam waktu kurang dari 1 detik dan resource yang diperlukan berkurang menjadi 1/3
- Dioxus 0.5 memperkenalkan sistem aset baru manganis
- Terintegrasi dengan CLI untuk memeriksa, membundel, dan mengoptimalkan aset aplikasi
- Karena API-nya masih belum stabil, didistribusikan sebagai crate terpisah
- Jika aset dibungkus dengan makro
mg!, CLI akan mendeteksinya secara otomatis - Detail lebih lanjut tersedia di dokumentasi manganis
- Selama rilis 0.5 berlangsung, hot reload juga direncanakan untuk ditambahkan ke aset manganis
Peningkatan rendering Desktop 5 kali
- Dioxus menggunakan berbagai optimasi untuk membuat diff rendering menjadi cepat
- Templates membuat diff bagian statis dari makro
rsx!dilewati - Di Dioxus Web, perubahan DOM diterapkan dengan cepat dari Rust melalui sledgehammer
- Dioxus 0.5 juga menggunakan pendekatan yang sama untuk menerapkan perubahan melalui jaringan
- Renderer Desktop dan LiveView mengomunikasikan perubahan dengan protokol biner, bukan JSON
- Pada workload dengan beban rendering berat, renderer baru mengurangi waktu penerapan perubahan ke browser menjadi 1/5 dan latensi menjadi 1/2
- Benchmark yang membuat renderer terus berhenti di Dioxus 0.4 berjalan mulus di Dioxus 0.5
Fitur kemudahan penulisan komponen
- Dioxus 0.5 mendukung kemampuan memperluas element tertentu dan menyebarkan atribut ke element
- Contoh: komponen
ImgPlusyang memperluas atribut elementimgdapat menerima atributimgumum sepertiwidth,height, dansrcapa adanya
- Contoh: komponen
- Saat meneruskan nilai ke atribut dan komponen, sintaks singkat inisialisasi struct dapat digunakan
- Dapat ditulis seperti
classalih-alihclass: class
- Dapat ditulis seperti
- Atribut singkat bekerja untuk semua item yang mengimplementasikan
IntoAttribute, dan Signal juga mendapatkan manfaat ini - Atribut Signal belum melewati diffing, tetapi direncanakan ditambahkan sebagai optimasi performa selama siklus rilis 0.5
- Atribut yang terbagi dalam beberapa baris dapat digabungkan
- Jika nilai kondisional ditambahkan ke atribut
classyang sama, nilainya digabungkan dengan spasi sebagai pemisah - Ini penting untuk library seperti Tailwind yang membutuhkan parsing saat compile time sekaligus pemrosesan dinamis saat runtime
- Sintaks ini terintegrasi dengan Tailwind compiler dan menghilangkan overhead runtime dari library seperti
tailwind-merge
- Jika nilai kondisional ditambahkan ke atribut
Streaming server function dan Fullstack
- Dioxus 0.5 mendukung crate server functions terbaru yang mendukung data streaming
- Server function dapat melakukan streaming data ke client atau streaming data dari client ke server
- Streaming server function dapat dibuat dengan mendefinisikan tipe output dan mengembalikan
TextStreamdari server function - Cocok untuk memperbarui client selama pekerjaan yang berjalan lama
- Ada contoh yang menggunakan Kalosm dan LLM lokal untuk menyediakan fungsi serupa endpoint OpenAI ChatGPT pada hardware biasa
- Repositori contoh: https://github.com/ealmloff/dioxus-streaming-llm
- CLI kini mendukung platform
fullstack, serta menyediakan hot reload dan build paralel untuk client dan serverdx servedx serve --platform fullstack
LiveView, asset handler, dan pemrosesan file
- Di Dioxus 0.5, router berjalan secara default pada aplikasi LiveView
- PR terkait: https://github.com/DioxusLabs/dioxus/pull/1505
- Dioxus Desktop mendukung custom asset handler
- PR terkait: https://github.com/DioxusLabs/dioxus/pull/1719
- Custom asset handler memungkinkan data di-streaming secara efisien dari kode Rust ke browser tanpa melalui JavaScript
- Cocok untuk komunikasi berbandwidth besar seperti streaming video
- PR terkait: https://github.com/DioxusLabs/dioxus/pull/1727
- Data gstreamer atau webrtc dapat diteruskan langsung ke webview, sehingga kebutuhan untuk mengenkode dan mendekode frame secara langsung berkurang
- File drop di desktop juga terintegrasi secara native ke sistem event
Penanganan error
- Dioxus memudahkan penanganan error di komponen atas melalui Error Boundary dan trait
throw - Pendekatan
throwmenggabungkan keunggulan state error dan early return - Pada tipe
Resultyang mengimplementasikanDebug,throwdapat dipanggil untuk mengubahnya menjadi state error, lalu?digunakan untuk early return - Komponen
ErrorBoundaryme-render komponen lain jika ada error yang dilempar dari child ErrorBoundarydapat disarangkan, sehingga error dapat ditangkap di berbagai level aplikasi- Pola ini berguna untuk menangani state error global saat terjadi error yang tidak dapat dipulihkan, tanpa melakukan panic atau mengelola state secara manual untuk setiap error
Pengalaman pengembangan dan template
- Dioxus memperkenalkan hot reload di 0.3, menambahkannya ke Desktop di 0.4, dan mengaktifkannya secara default di 0.5
- Saat aplikasi dijalankan dengan
dx serve, hot reload aktif secara default dalam mode development - Bahkan saat hot reload tidak memungkinkan di aplikasi Desktop dan diperlukan recompilation penuh, state jendela yang terbuka dipertahankan dan dipulihkan
- Ukuran dan posisi jendela aplikasi dipertahankan
- Mengurangi situasi ketika aplikasi menutupi seluruh layar setiap kali diedit
- Template baru dirapikan agar aplikasi Web, Desktop, Mobile, TUI, dan Fullstack dapat dibuat dengan satu perintah
- Aplikasi default
dx newberubah menjadi bentuk yang lebih dekat dengan create-react-app- Mencakup assets, CSS, dan konfigurasi deployment dasar
- Mencakup link resource berguna seperti dioxus-std, VSCode Extension, dokumentasi, dan tutorial
Dioxus Community dan ekosistem
- Dioxus Community memperbarui crate ekosistem penting untuk rilis 0.5
- Crate seperti icons, charts, dan standard library khusus Dioxus disiapkan agar dapat langsung digunakan saat 0.5 dirilis
- Proyek
Dioxus Communityadalah organisasi GitHub baru untuk menjaga crate penting tetap mutakhir meski maintainer asli mundur - Jika membuat library untuk Dioxus, pihak Dioxus dapat membantu pemeliharaannya dan menargetkan dukungan yang secara praktis setara “Tier 2”
Fitur yang direncanakan ke depan
- Rencana setelah 0.5 mencakup hal-hal berikut
- Stabilisasi sistem aset dan integrasi yang lebih mendalam
- Bundle splitting langsung output
.wasmbersama lazy component - Islands dan resumable interactivity, serialisasi Signal
- Penggabungan Server component dan LiveView ke Fullstack
- Devtools dan framework testing yang ditingkatkan
- Perombakan penuh Mobile
- Perombakan Fullstack yang mencakup WebSocket, SSE, progressive form, dan lainnya
Pratinjau Dioxus-Blitz berbasis Servo
- Pada “Blitz 2.0” dari Dioxus-Blitz, tujuannya adalah mengintegrasikan Servo untuk rendering native WGPU dengan engine CSS yang sama seperti yang menjalankan Firefox
- Nico Burns, pembuat Taffy layout library, bergabung penuh waktu untuk mendorong pekerjaan ini
- Dalam demo,
google.comdi-render di GPU pada 900 FPS - Implementasi saat ini belum lengkap dan rendering
google.commasih agak janggal, tetapi dengan cepat mendekati tingkat yang dapat digunakan - Repositorinya dapat dilihat di https://github.com/jkelleyrtp/stylo-dioxus
Cara berkontribusi
- Proyek Dioxus menginginkan kontribusi berikut
- Menerjemahkan dokumentasi
- Mencoba “Good First Issues”
- Memperbaiki dokumentasi
- Berkontribusi ke CLI
- Menjawab pertanyaan komunitas Discord
- Tim Dioxus berterima kasih atas dukungan komunitas selama sisa tahun 2024 dan meminta bantuan untuk mengubah pengembangan aplikasi
1 komentar
Opini Hacker News
Saat mulai mengerjakannya, versinya 0.2, dan dengan perubahan di 0.5 ini, hampir semua kerumitan yang saya alami saat itu tampaknya sudah hilang. Saya belum mencobanya langsung, tetapi penghapusan lifetime dan berkurangnya beban untuk terus-menerus melakukan clone sepertinya akan membuatnya jauh lebih nyaman.
Ada cukup banyak framework Rust untuk membuat UI reaktif native yang bisa di-deploy ke desktop, web/wasm, mobile, dan lain-lain https://github.com/flosse/rust-web-framework-comparison, jadi saya khawatir kalau salah pilih, kita harus memelihara framework yang terbengkalai atau melakukan migrasi yang menyakitkan.
Framework server HTTP Rust juga dulu sama banyaknya, tetapi sekarang Axum, Actix, dan Rocket tampak berada di depan, dan arus komunitas sepertinya bergeser ke Axum, sampai-sampai saya bertanya-tanya apakah memilih Actix adalah kesalahan. Saya penasaran apakah ada sinyal bahwa Dioxus akan menang, atau indikator selain komunitas besar, dukungan YC, dan momentum yang membuatnya layak dipilih sekarang.
Saya juga ingin tahu apakah Leptos dan Yew juga pesaing utama, serta apa alasan keduanya lebih baik atau lebih buruk daripada Dioxus. Perusahaan kami sudah banyak berinvestasi pada Rust, Actix, dan Bevy, dan ke depannya kami ingin menggabungkan framework seperti Bevy dan Dioxus untuk membuat klien desktop dan mobile native.
Dan saya juga penasaran apakah nama Dioxus berasal dari Deoxys di Pokémon. Logonya terasa seperti itu, tetapi di codebase tidak ada referensi Pokémon.
Sekitar 9 bulan lalu saya membuat frontend GUI untuk sshfs dengan Dioxus, dan sampai sebelum menabrak dinding berupa fitur yang belum diselesaikan pengembangnya, kesannya benar-benar seperti framework GUI yang hebat.
Berbagi state antar-konteks yang berbeda juga kadang menyakitkan, tetapi semua framework GUI yang pernah saya pakai seperti itu, apa pun bahasa atau teknologi dasarnya. Dioxus 0.5 terlihat seperti kemajuan besar dalam hal ini. Blog saya merender sebagian besar HTML dengan Dioxus, dan karena bukan penggunaan yang mendorongnya sampai batas, semuanya berjalan sangat baik.
Namun solusi penghapusan lifetime ini agak membuat saya bingung. generational-box terasa seperti semacam garbage collector versi sederhana, dan saya penasaran bagaimana dampaknya terhadap performa.
Selain itu, tautan
[generational-box]([https://crates.io/crates/generational-box](<https://crates.io/crates/generational-box>))rusak.Karena
use_hookmemiliki nilai selama lifetime komponen, saat komponen menghilang nilai itu juga di-drop. Semua signal masih memakaiuse_hook, jadi lifetime-nya juga sama. MemanggilGenerationalBox::new()di luaruse_hookbiasanya tidak disarankan, sehingga tidak ada dampak performa.Jika Anda membanjiri loop dengan
GenerationalBox::new(), sampah itu akan tetap ada sampai komponennya di-drop, tetapi kebanyakan orang akan melakukan push/pop pada Map atau Vec, dan dalam kasus itu semantik memori biasa berlaku.Saya paham ini semacam alokasi arena, tetapi saya tidak mengerti bagaimana ia mendukung “menyalin tanpa menyalin”, dan mengapa penjelasan bahwa secara internal ia membuat arena
RefCellbergenerasi danGenerationalBoxadalahCopyitu aman.Saya paham bahwa kita bisa membuat pointer ke data statis, tetapi bagaimana jika nilainya tidak memiliki lifetime statis?
Referensi data dipertahankan selama lifetime program. generational box memungkinkan Anda memasukkan data yang hidup lebih pendek daripada lifetime program, tetapi data itu tidak boleh memuat referensi. Saat data yang dimasukkan di-drop, box tersebut digunakan kembali untuk alokasi lain.
Pendekatannya sangat mirip dengan arena bergenerasi, kecuali ia memakai box alih-alih arena terpusat; itu dipilih untuk menghindari masalah locking. Jika Anda mencoba mengakses data melalui referensi
Copysetelah di-drop, operasi itu gagal dengan pesan error yang bagus.Copypunya makna tertentu.Jika suatu tipe mengimplementasikan trait
Copy, artinya tipe itu bisa disalin denganmemcpy, dan itu lebih dekat ke shallow copy daripada deep copy.Jadi saya memahaminya bukan sebagai “menyalin tanpa menyalin”, melainkan membuat tipe yang bukan
Copybisa diperlakukan seperti tipeCopy. README mengatakan konten statis diperlukan, jadi untuk nilai yang tidak memiliki lifetime statis, jawabannya adalah “tidak bisa dilakukan seperti itu.”Saya suka Dioxus mengambil banyak unsur yang membuat React sukses, tetapi tetap berinovasi dan merilis dengan cepat di atasnya. Saya menantikan untuk mencoba signals di rilis ini.
Saya mengakui hal baik yang dilakukan React untuk JS dan web, serta kekuatan namanya, tetapi jika pada 2024 kita bisa merancang bahasa atau DSL dari nol, saya tidak berpikir kode “UI reaktif” harus terlihat seperti React.
Bukan berarti SwiftUI sempurna, tetapi kode yang ditulis dengan SwiftUI terasa jauh lebih rapi dan tersegmentasi dibandingkan ketika menulis kode serupa dengan React.
Keuntungan nyata memakai JSX untuk GUI lintas-platform kira-kira hanya bisa memakai ulang library yang sudah ada untuk web, sedangkan RSX tampaknya tidak punya banyak “nilai yang bisa dipindahkan” selain bahwa developer bisa memindahkan pengetahuan konsep JSX mereka ke RSX. Rasanya kompromi yang lebih baik justru mempelajari paradigma baru yang secara objektif dianggap lebih baik daripada paradigma React/JSX
Singkatnya, akan bagus kalau ada proyek yang “seperti SwiftUI tetapi lintas-platform”, tapi sejauh ini belum ada. Saya tahu @Tokamak/TokamakUI, tetapi tampaknya masih sangat belum matang dan aktivitasnya juga menurun
Saat ini hanya mendukung aplikasi desktop native untuk Linux/mac/windows, tetapi ada rencana mendukung WASM, web, dan mobile
Ini nantinya akan menjadi situs web terdesentralisasi pertama yang dilihat orang setelah menyiapkan Freenet. Sedikit mirip juga dengan Kweb, framework web Kotlin yang saya kerjakan sesekali selama beberapa tahun, terutama dalam hal penanganan state dan pendekatan DSL yang memetakan kode ke HTML. Sejauh ini saya menyukainya
https://freenet.org/
https://kweb.io/
Sebenarnya saya penggemar Kotlin, dan saya suka DSL Kotlin serta model konkurensinya
Tauri memasukkan frontend ke dalam webview, dan harus berkomunikasi dengan fungsi Rust native melalui batas IPC, seperti Electron
Di Dioxus, kode Rust berada di sisi native, jadi operasi seperti membaca file system atau websocket tidak memerlukan IPC. Tauri memaksa frontend dikompilasi ke WASM, dan banyak crate Rust menarik yang tidak bisa dikompilasi ke wasm
Sulit diungkapkan dengan kata-kata betapa sederhananya pengembangan ketika tidak ada batas IPC. Karena tooling Dioxus hanya menargetkan Rust, Anda bisa pergi dari nol ke
.appyang sudah dibundel dalam waktu kurang dari 1 menit. Build baru sekitar 12 detik, bundle baru sekitar 20 detikMeski begitu, saya sangat menyukai fleksibilitas yang diberikan Tauri, yaitu bisa memakai apa pun sebagai frontend selama UI-nya kompatibel dengan web, dan Dioxus juga bisa dipakai di dalam aplikasi Tauri
Bagus bahwa Dioxus membahasnya langsung di README, tetapi saya juga penasaran dengan pengalaman nyata dari orang-orang yang sudah memakai keduanya
Saya pernah membuat aplikasi desktop mainan dengan Tauri, dan saya memastikan apakah IPC cukup cepat sehingga frontend web bisa memperbarui dan bekerja di setiap input tombol tanpa lag; jawabannya “ya”. Apakah file besar bisa dikirim dari frontend ke layer Rust lalu dikembalikan ke frontend di setiap input tombol, setidaknya dengan implementasi naif saya, jawabannya “tidak”
Baik Tauri maupun Dioxus punya banyak use case yang bagus, dan untuk beberapa kasus Dioxus sepertinya lebih baik. Saya ingin mendengar kisah perbandingan seperti “di proyek kami, kami memilih Dioxus atau Tauri karena X dan Y”. Dioxus terlihat sangat keren, jadi saya menantikan untuk mencobanya
stylo adalah bagian dari Servo yang dibagikan dengan Firefox. Dalam jangka panjang kami ingin memindahkan orang ke renderer WGPU, tetapi itu masih cukup tahap awal, dan banyak perusahaan yang memakai Dioxus secara realistis tahu bahwa webview adalah solusi yang cukup bagus untuk sekitar 90% aplikasi
Saya mengerti orang kadang memakai
unsafeterlalu mudah, tetapi standard library juga penuh denganunsafe, dan menarik garis di sana kadang terasa seperti menarik garis di atas pasirDipakai di tiga tempat. Perbaikan beberapa FFI di iOS, implementasi untuk memungkinkan sintaks pemanggilan fungsi pada signal, dan bagian yang mengimplementasikan Send/Sync untuk ID yang memakai pointer sebagai hash
Untuk yang terakhir, setelah dilihat lagi sepertinya mungkin bisa dihapus dengan menggantinya memakai
usizeunsafeMeski begitu, bukan berarti buruk jika pembuat crate menargetkan penghapusan
unsafedari crate-nya sendiriPembuat crate yang berusaha menghapus semua
unsafesering kali mencoba mengurangi beban kepercayaan yang harus ditanggung pengguna. Saya melihat ini sebagai kekuatan keywordunsafe. Sebenarnya mungkin seharusnya dipisah menjadi bloktrust_medan fungsicheck_yourselfunsafemembatasi percakapan tentang keamanan memori ke lokasi yang sangat sempit dan bisa diaudit dalam kode, sekaligus menciptakan percakapan baru tentang kepercayaan yang dapat dikelolause*untuk API hook, tetapi saya penasaran mengapa fungsi untuk membuat signal baru di Dioxus bernamause_signallet mut count = use_signal(|| 0);itu panggilan untuk membuat signal baru, bukan? Signal tidak dibuat ulang di setiap render, dan itulah inti dari signalDi SolidJS, signal dibuat dengan createSignal seperti
const [count, setCount] = createSignal(0), dan ini jauh lebih mudah dipahamiNama API itu penting. Karena hook state berperilaku berbeda dan bisa memunculkan kebutuhan pelengkap seperti
useMemo. Saya penasaran apakah ada alasan Dioxus memilih namause_signalselain ingin terlihat dekat dengan ReactLebih dekat ke Preact daripada Solid
Optimisasinya mencakup memisahkan potongan dinamis UI ke “diff bin” terpisah, memoization bawaan, dan signal yang secara implisit menandai properti sebagai dirty/managed