Aplikasi desktop berbasis web view cenderung berkelahi dengan navigasinya sendiri. Editor catatan ingin punya jendela utama, panel quick-capture yang melayang, dock yang selalu di atas, dan papan kanban yang bisa dipaku di bawah ikon desktop. Di browser itu empat halaman. Di aplikasi desktop itu empat jendela, dan jawaban naifnya adalah empat route.
Empat route berarti empat bundle, empat set store, dan empat tempat file SQLite yang sama dibuka. Artinya juga setiap komponen bersama harus bisa dijangkau dari masing-masing route.
Route yang bercabang berdasarkan perannya
Pendekatan yang bertahan adalah menyimpan satu route dan membiarkan jendelanya memberi tahu ia harus menjadi apa. Setiap jendela dibuat dengan sebuah peran, frontend membaca peran itu saat dimuat, dan satu root layout merender shell yang tepat untuknya.
const role = await getCurrentWindowRole();
// "workspace" | "dock" | "board" | "note" | "task"
Sisi Rust memegang bagian yang tidak bisa dipegang frontend: siklus hidup jendela, tray, shortcut global, dan flag desktop-underlay untuk papan. Frontend memegang bagian yang seharusnya tidak dipegang Rust: panel mana yang terbuka, apa isi catatan saat ini, apakah dock sedang terlipat.
Yang didapat dari ini adalah semua jendela berbagi satu build. Perubahan komponen sampai ke dock dan papan dalam satu rebuild yang sama, dan hanya ada satu tempat koneksi database dikonfigurasi.
Satu database, lima pembaca
Masalah yang lebih sulit adalah konkurensi. Lima jendela menulis ke satu file SQLite adalah resep database is locked kalau masing-masing membuka koneksinya sendiri dan memutuskan sendiri kapan menulis.
Migrasi berjalan sekali, saat startup, dari sisi Rust, sebelum ada jendela. Setelah itu jendela membaca dan menulis lewat satu koneksi plugin dengan busy timeout, dan store memperlakukan penulisan sebagai pengecualian, bukan hal default. Papan tidak melakukan polling; ia mendengarkan event perubahan lalu memuat ulang satu kolom yang berubah.
Ada satu fallback yang disengaja. Di luar Tauri, saat vite dev di browser atau di pratinjau komponen, lapisan data menyajikan konten seed alih-alih gagal. Ini menjaga UI tetap bisa dikerjakan tanpa shell desktop, dan itu lebih penting daripada kedengarannya: itulah bedanya bisa mengiterasi tata letak papan di browser dengan harus membangun ulang seluruh aplikasi untuk setiap perubahan CSS.
Yang akan saya pertahankan
Keputusan satu-route adalah yang layak dibawa ke proyek berikutnya. Menggoda untuk memilih entry point terpisah karena jendelanya terlihat tidak berhubungan, padahal tidak: mereka lima tampilan dari satu dataset lokal. Memperlakukannya begitu menghapus satu kelas bug sebelum sempat ada.



