- Dapat membundel proyek Deno yang dibuat dengan aplikasi web dan kode TypeScript menjadi biner aplikasi desktop yang dapat didistribusikan ulang untuk tiap platform
- Hasil output mencakup kode aplikasi, runtime Deno, dan mesin rendering web, serta sudah masuk ke Deno v2.9.0 tetapi belum merupakan rilis stabil
- Backend WebView default menggunakan webview bawaan sistem operasi untuk menargetkan biner kecil, dan jika membutuhkan konsistensi rendering dapat memilih backend Chromium (CEF)
- Mendeteksi proyek Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start, dan Vite SSR lalu menjalankan server sesuai mode rilis maupun mode pengembangan
--hmr
- Komunikasi antara kode Deno dan webview menggunakan kanal in-process, bukan IPC berbasis socket, dan cakupannya juga mencakup cross-compilation serta pembaruan otomatis berbasis bsdiff
Peran dan status saat ini dari deno desktop
deno desktop mengubah proyek Deno menjadi aplikasi desktop mandiri yang self-contained
- Input dapat berupa satu file TypeScript hingga aplikasi Next.js
- Output berupa biner yang dapat didistribusikan ulang untuk tiap platform
- Biner mencakup kode aplikasi, runtime Deno, dan mesin rendering web
- Fitur ini sudah disertakan di Deno v2.9.0, tetapi belum merupakan rilis stabil
- Untuk mencobanya sekarang, perlu memasang build
canary dengan deno upgrade canary
- Perintah, kunci konfigurasi, dan API TypeScript dapat berubah sebelum stabil
Pemilihan backend dan menjalankan proyek web
- Mengambil arah menggunakan teknologi web sebagai toolkit UI desktop sambil mengurangi trade-off yang ada pada alat aplikasi desktop berbasis stack web yang sudah ada
- Alat seperti Electron, Tauri, dan Electrobun bisa memiliki trade-off seperti biner besar, dukungan platform yang tidak lengkap, ketiadaan ekosistem JavaScript, ketiadaan pembaruan bawaan, atau ketiadaan integrasi framework
- Backend WebView default menggunakan webview sistem operasi untuk menargetkan biner kecil
- Ekosistem npm dapat digunakan melalui lapisan kompatibilitas Node milik Deno
- Jika memerlukan rendering yang sama di macOS, Windows, dan Linux, dapat memilih backend CEF yang membundel Chromium
- Deteksi framework otomatis menjalankan proyek web yang sudah ada sebagai desktop tanpa perubahan kode
- Targetnya mencakup Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start, Vite SSR, dan lainnya
- Pada mode rilis, menjalankan server produksi
- Pada
--hmr, menjalankan server pengembangan dengan hot reload
Komunikasi runtime, build, dan pembaruan
- Menggunakan kanal in-process untuk komunikasi antara backend dan UI
- Nilai akan di-encode saat melewati batas pemanggilan
- Tidak ada round-trip lintas proses antara kode Deno dan webview
- Dapat melakukan cross-compilation untuk macOS, Windows, dan Linux dari satu mesin
- Backend tidak dibangun secara lokal, melainkan diunduh saat dibutuhkan
- Pembaruan otomatis adalah mekanisme pembaruan diferensial biner bawaan yang menggunakan manifes
latest.json dan patch bsdiff
- Runtime menangani polling, penerapan, dan rollback untuk eksekusi yang gagal
Contoh sederhana dan susunan dokumentasi
- Aplikasi desktop satu file dapat dibuat dengan menulis
main.ts yang mengembalikan respons HTML melalui Deno.serve() lalu menjalankan deno desktop main.ts
Deno.serve(() =>
new Response("Hello, desktop
", {
headers: { "content-type": "text/html" },
})
);
deno desktop main.ts
- Biner yang telah dikompilasi membuka jendela yang mengarah ke server HTTP lokal yang terikat pada handler
Deno.serve()
- Di macOS/Linux dijalankan dengan
./main
- Di Windows dijalankan dengan
.\\main.exe
Deno.serve() otomatis terikat ke alamat yang dinavigasi oleh webview sehingga tidak perlu memberikan port atau nama host
- Dokumentasi terkait dibagi ke dalam konfigurasi, backend, HTTP serving, framework, manajemen jendela, binding, menu, tray dan dock, dialog, notifikasi, HMR, DevTools, pembaruan otomatis, pelaporan error, deployment, perbandingan, dan referensi CLI
Deno.BrowserWindow berkaitan dengan siklus hidup jendela, banyak jendela, dan event
Deno.autoUpdate() berkaitan dengan manifes, bsdiff, dan rollback
bindings.() adalah mekanisme binding untuk memanggil kode Deno dari webview
1 komentar
Komentar Hacker News
Deno Desktop tampaknya mengambil kompromi itu dengan cukup tegas: “default dibuat kecil, kompatibilitas Node tetap lengkap”
Saya mencoba
deno desktop index.tsdengan Hello World 5 baris dari artikelnya, dan hasilnya di Windows 10 adalah 442MBSaya kira akan lebih kecil daripada build Electron, tetapi ternyata jauh lebih besar, dan
libcef.dllberukuran 247MB, sementaradeno-test.dllyang berisi Hello World berukuran 78MBJadi saya penasaran apakah saya melakukan sesuatu yang salah
Jadi saya berharap bisa ada solusi di bawah 20MB dengan memanfaatkan kembali webview OS atau semacamnya, tetapi lebih dari 400MB terasa agak menyesatkan
Mungkin saya salah konfigurasi, jadi saya penasaran apakah ada hal lain yang perlu dilakukan selain
deno desktop test.tsBagian yang mengatakan “alih-alih setiap aplikasi membundel CEF sendiri, kami bisa mengelola runtime CEF bersama sehingga ukuran biner per aplikasi turun menjadi beberapa MB, dan ini ada di roadmap” cukup menarik
Saya tidak begitu paham CEF, jadi saya penasaran bagaimana pengelolaan versinya
Kalau setiap aplikasi membutuhkan versi CEF yang berbeda, apakah pada akhirnya akan kembali ke model seperti Electron, di mana setiap aplikasi membawa browser-nya sendiri, atau apakah bahkan dalam kasus seperti itu tetap ada keuntungan dari runtime bersama
https://docs.deno.com/runtime/desktop/comparison/
https://github.com/chromiumembedded/cef
Hasilnya tidak terlalu bagus, tetapi saya tidak tahu apakah itu memang masalah pada teknologi CEF itu sendiri atau pada komponen/proses lain
https://www.riotgames.com/en/news/architecture-league-client...
Hampir semua aplikasi Electron di desktop pada praktiknya memakai versi Chromium yang berbeda-beda, dan ada juga yang mempertahankan versi lama karena risiko rusak saat upgrade
Di Windows, contohnya seperti WebView2
Deno terus terasa mengesankan
Sudah cukup lama saya tidak memulai proyek baru tanpa Deno, dan saya sudah sepenuhnya berpihak pada ekosistem Deno dibanding Node.js
Saya tidak tahu seberapa sering akan memakai fitur ini, tetapi sangat bagus bahwa sekarang ada opsi tersebut
Pekerjaan yang mengesankan
Ini tampaknya akan sangat menarik untuk membuat aplikasi desktop dengan vibe coding
Alat seperti Lovable, Bolt, dan v0 pada dasarnya memakai TypeScript saat membuat aplikasi web, jadi ini terlihat sangat cocok untuk itu
Untuk aplikasi desktop kecil, saya selama ini memakai Go/Wails alih-alih membundel Chromium dan Node, dan meskipun Electron juga menjalankan perannya dengan baik, bundel besarnya jelas selalu membuat saya enggan
Saya penasaran bagaimana ini terintegrasi dengan sistem perizinan Deno, yang merupakan salah satu kekuatan terbesar Deno
Ini terutama penting ketika agen dibiarkan berkeliaran sesuka hati di perangkat saya
Dokumentasi referensi CLI mengatakan bahwa “izin yang diberikan saat kompilasi akan dipanggang ke dalam biner hasil kompilasi”
Akan bagus jika ini diekspos agar pengguna bisa mengetahui dan memutuskan izin apa yang akan diberikan
https://docs.deno.com/runtime/reference/cli/desktop/#runtime...
Jika prompt izin Deno ditampilkan di situ, menurut saya itu justru bisa menyesatkan karena tidak ada jaminan integritas atas izin tersebut
Yaitu pendekatan yang menerapkan sistem izin Deno ke sandboxing desktop, dengan menampilkan prompt izin untuk setiap akses ke filesystem atau jaringan
Ini fitur yang cerdas untuk dirilis
Saat memutuskan platform apa yang akan dipakai, ini sepertinya cukup layak dipertimbangkan
Dengan ukuran instalasi yang kecil dan lintas platform, ini tampak seperti alternatif yang cukup baik untuk Electron atau Tauri
Menurut saya, ungkapan “teknologi web adalah toolkit UI yang paling dikenal luas di dunia” kurang tepat.
Alasan aplikasi Electron sering dikritik justru hampir berlawanan dengan konsep toolkit UI.
Aplikasi seperti itu sering gagal mengikuti pola UI OS host dengan baik.
Teknologi web ya tetap teknologi web; memang bisa merender tombol, tetapi bahkan tombol tanpa styling pun tidak ada jaminan akan terlihat seperti native OS, dan tampilannya juga berbeda di tiap browser.
Tujuannya tidak pernah sekadar menjadi “toolkit UI” atau “mengikuti pola UI OS host”.
Chromium punya sangat banyak fitur, dan Electron membawa utilitas itu apa adanya, dan itu adalah kelebihannya.
Misalnya, kalau pernah mengerjakan video, Anda tahu bahwa bisa memanfaatkan seluruh kemampuan browser modern di dalam aplikasi desktop itu sangat mengubah keadaan.
Bukan cuma pemutaran video, bahkan transcoding yang dimungkinkan oleh web modern dan WebCodecs akan menjadi pekerjaan sangat besar jika harus diimplementasikan sendiri, terlebih lagi untuk aplikasi desktop yang harus berjalan di Windows/macOS/Linux.
Saya pernah membuat aplikasi dengan Electron dalam hitungan puluhan jam; dengan pendekatan lain mungkin akan butuh puluhan hari, dan bahkan dengan AI pun akan sulit kalau bukan ahli video.
Tidak pernah ada klaim bahwa UI-nya “native”.
UI native Linux menurut saya selalu terlihat sangat jelek, dan saya justru merasa layout HTML+CSS yang dirancang baik jauh lebih bagus.
Dari pengalaman saya, Electron biasanya dicela karena bloat dan lambat; soal tidak native itu hanya tambahan yang orang-orang sebutkan.
Sejak lama saya ingin membuat integrasi browser langsung yang tetap memakai HTML+CSS untuk layout tetapi tidak memerlukan runtime JavaScript.
Saya tidak tahu seringan apa Servo, tetapi akan bagus kalau suatu hari ide seperti itu bisa jadi kenyataan.
Sebagai pengguna saya sangat puas, dan meski fitur dasar seperti aksesibilitas masih kurang, saya rasa itu akan segera diimplementasikan.
Dari sisi pengembang, selain Rust saya kurang tahu apa hambatan masuknya, dan pada saat yang sama Rust juga menjadi pembeda utamanya.
Itu pembicaraan sekitar 25 tahun lalu; sejak Microsoft sendiri berhenti terlalu peduli, praktis tidak ada lagi yang benar-benar mempermasalahkannya.
Saya tidak ingin aplikasi saya terlihat berbeda di OS yang berbeda.
Saya tidak punya sumber daya untuk menguji di semua perangkat, dan fakta bahwa tampilan yang diuji di satu sistem akan terlihat sama persis di sistem lain adalah keuntungan yang sangat besar.
Senang melihat ada pesaing baru di area ini.
Khususnya, saya suka bahwa Deno saat ini bisa menjalankan TypeScript sungguhan secara langsung, bukan seperti implementasi Node saat ini yang hanya menghapus tipe.
Tapi ini tampaknya akan mengambil cukup banyak pasar Tauri.
Sekarang kenapa saya harus memakai Tauri?
Pada kebanyakan koneksi internet, kenaikan ukuran bundel 150MB biasanya cuma berarti selisih waktu unduh 1–10 detik, dan sebagai gantinya Anda mendapat mesin rendering yang bisa diandalkan.
Untuk pemeriksaan tipe, Anda harus menjalankannya dengan
deno run --checkatau memakai subperintahdeno checksecara terpisah.Saat pengembangan, biasanya IDE sudah menangani pemeriksaan tipe dan linting secara otomatis, jadi ini bukan masalah besar.
Sebenarnya Anda bahkan tidak harus memakai JavaScript.
Dan kita sudah melihat sejumlah startup framework pengembang seperti Astro, Nuxt, UV, Bun, dan Vite diakuisisi.
Untuk software yang harus dipelihara dan didukung selama bertahun-tahun, tren seperti itu tidak terlalu menumbuhkan kepercayaan.
Bukankah Deno Desktop dan Tauri sama-sama memakai system webview?
Kenapa harus memakai ini tetapi tidak Electron?
Dari materi yang dirilis Deno, bagian perbandingan adalah yang paling saya sukai.
Di baris terakhir tertulis dukungan iOS/Android untuk Electron adalah “no”, sedangkan untuk Deno “not yet”; kalau mereka benar-benar berhasil mewujudkannya, dampaknya akan jauh lebih besar.
Ini tampaknya akan sangat bagus untuk mendistribusikan game web sebagai aplikasi Steam atau aplikasi untuk pembelian online.
Saya berniat mencobanya.