- Ringkasan masalah yang dialami setelah baru-baru ini meng-upgrade aplikasi web ke Svelte 5
- Terjadi perilaku tak terduga akibat fitur deep reactivity dan perubahan lifecycle
- Meski telah lama menikmati Svelte 3/4, ke depannya sepertinya saya tidak akan memilih Svelte untuk proyek baru
Kebutuhan akan kecepatan
- Tim Svelte mencoba melakukan optimasi performa melalui deep reactivity, dan berhasil menghasilkan performa yang lebih baik
- Sebelumnya pun Svelte sudah memberikan performa cepat lewat proses kompilasi, dan itu merupakan keunggulan yang membedakannya dari framework lain
- Ini memang membuat framework menjadi kurang transparan dan sulit di-debug, tetapi terasa sebagai trade-off yang masih bisa diterima dari sisi performa dan produktivitas
Kebutuhan akan kecepatan
- Perubahan utama yang menjadi fokus tim Svelte di Svelte 5 adalah “deep reactivity”, yaitu upaya meningkatkan performa lewat reaktivitas yang lebih granular
- Pada versi-versi Svelte sebelumnya, tujuan ini terutama dicapai dengan memanfaatkan compiler Svelte
- Keunikan Svelte menonjol karena pengembang tidak perlu mempelajari konsep baru secara langsung, sementara logika internal tetap bisa direstrukturisasi dengan baik
- Namun pada saat yang sama, proses kompilasi ini juga membuat framework menjadi tidak transparan, sehingga debugging masalah kompleks menjadi sulit
- Bug pada compiler sendiri dapat memunculkan error yang sulit dilacak penyebabnya, dan kadang hanya bisa diselesaikan dengan me-refactor total komponen yang bermasalah
- Meski begitu, ini tetap terasa sebagai kompromi yang masuk akal dari sisi kecepatan dan produktivitas, sehingga saya pun menerima kerepotan harus me-reset proyek secara berkala
Svelte bukan Javascript
- Svelte 5 melipatgandakan trade-off ini
- Perbedaan intinya adalah titik kompromi antara abstraksi dan performa kini tidak lagi berhenti di tahap kompilasi, tetapi merembes ke bagian runtime
- Penggunaan proxy untuk mendukung deep reactivity
- Status lifecycle komponen yang implisit
- Dua perubahan ini meningkatkan performa dan membuat API pengembang terlihat lebih slick
- Apa yang tidak disukai? Sayangnya, kedua fitur ini dapat dianggap sebagai contoh klasik dari leaky abstraction
- Pada akhirnya ini menciptakan lingkungan yang lebih kompleks untuk dihadapi pengembang
Proxy bukan objek
- Dengan penggunaan Proxy, tim Svelte bisa sedikit lebih meningkatkan performa framework tanpa meminta kerja tambahan dari pengembang
- Di framework seperti React, saat state diteruskan melalui beberapa komponen, hal itu mudah memicu re-render yang tidak perlu; Svelte memperkenalkan Proxy untuk mengurangi hal tersebut
- Compiler Svelte sebelumnya juga sudah menghindari sebagian masalah yang bisa muncul dari proses diff virtual DOM, tetapi tampaknya mereka menilai performa masih bisa ditingkatkan lagi lewat Proxy
- Tim Svelte juga menyebut bahwa Proxy membantu meningkatkan developer experience, dengan klaim bahwa mereka dapat “memaksimalkan efisiensi dan kemudahan penggunaan sekaligus”
- Masalahnya adalah, Svelte 5 terlihat lebih sederhana di permukaan, tetapi sebenarnya menambahkan lebih banyak abstraksi
- Misalnya, memakai Proxy untuk mendeteksi method array memberi keuntungan karena kita tak perlu lagi menulis kode seperti
value = value seperti di Svelte 4
- Di Svelte 4, pengembang perlu sedikit memahami cara kerja compiler untuk memicu reaktivitas. Sebaliknya, Svelte 5 memberi kesan bahwa kita bisa “melupakan compiler”, padahal kenyataannya tidak begitu
- Seiring kemudahan yang didapat dari abstraksi baru, jumlah aturan yang harus diketahui pengembang agar compiler bertindak sesuai harapan juga bertambah
- Selama lama menggunakan Svelte, secara pribadi saya makin sering memakai Svelte store dan makin jarang memakai deklarasi reaktif
- Svelte store pada dasarnya lebih dekat ke konsep Javascript, cara memanggil method
update juga sederhana, dan sintaks $ hanya terasa sebagai bonus tambahan
- Proxy, seperti deklarasi reaktif, memunculkan masalah “terlihat seperti satu hal, tetapi bekerja berbeda di titik batas tertentu”
- Saat pertama kali memakai Svelte 5, semuanya tampak berjalan baik, tetapi ketika mencoba menyimpan state Proxy ke IndexedDB, muncul
DataCloneError
- Lebih parahnya lagi, untuk memastikan apakah suatu nilai adalah Proxy, kita harus mencoba structured clone dengan
try/catch, dan itu punya biaya performa yang besar
- Pada akhirnya, kita harus terus mengingat apa saja yang merupakan Proxy, lalu memakai
$state.snapshot setiap kali berada dalam konteks eksternal yang tidak mengenali Proxy
- Akibatnya, alih-alih “abstraksi meningkatkan kenyamanan pengembang” seperti niat awalnya, situasinya justru menuntut aturan dan prosedur yang lebih rumit bagi pengembang
Komponen bukan fungsi
Kesimpulan
- Hal yang mudah memang jelas menarik, tetapi seperti kata Rich Hickey, mudah tidak berarti sederhana
- Seperti kata Joel Spolsky, saya tidak suka ketika perilaku tak terduga terjadi
- Svelte selama ini telah menunjukkan banyak “sihir”, tetapi di versi kali ini, hal-hal yang harus dihafal untuk memakai sihir itu bertambah banyak sehingga bebannya terasa lebih besar daripada manfaatnya
- Inti tulisan ini bukan untuk menyalahkan tim Svelte; saya justru menyadari bahwa banyak orang memang menyukai Svelte 5 (dan React Hooks)
- Yang penting adalah keseimbangan antara memberi kenyamanan kepada pengguna dan membiarkan pengguna tetap memegang kendali
- Perangkat lunak yang benar-benar baik dibangun bukan di atas “kepintaran”, melainkan “pemahaman”
- Seiring berkembangnya alat AI, penting untuk memilih tool yang membantu memanfaatkan kebijaksanaan yang sudah terakumulasi dan memperdalam pemahaman, alih-alih tool yang membuat kita tidak tahu apa yang sebenarnya sedang kita lakukan
- Terima kasih kepada Rich Harris dan tim atas pengalaman pengembangan yang menyenangkan selama ini. Semoga tulisan ini bisa menjadi masukan yang tidak sepenuhnya meleset
7 komentar
Orang yang membuat
proxyjadi lebih nyaman, tapi orang yang harus men-debug jadi kesal, wkwk.Untuk side project, solidjs adalah DX nomor satu >m< / bahagia
Saya rasa karena ada alternatif seperti Svelte, React/Next.js pun bisa mendapat dorongan besar.
Pada dasarnya, Svelte adalah sebuah bahasa, jadi saya harap ini juga bisa menunjukkan dengan baik arah yang seharusnya dituju oleh bahasa untuk mendeskripsikan UI.
Saya akan memakai React.
Terlalu berlebihan itu tidak baik
Menyimpang karena terlalu mendalami
Lapisan di atas lapisan
Menurut saya, Svelte berubah aneh sambil cukup banyak terpengaruh oleh React dan terutama Next.
+pagesulit dipahami kalau dilihat tanpa mengenal Svelte, dan rune seperti$state,$derivedterasa seperti mengikuti React; malah rasanya zaman ketika cukup menaruh$:di depan variabel masih lebih baik. Sintaks lama seperti{#each a in array} {/each}masih bisa ditoleransi, tetapi tetap merepotkan. Kalau peningkatan performa dari reaktivitas opsional yang dicari, menurut saya SolidJS jauh lebih mengarah ke jalur yang lebih baik. Karena memakai JSX apa adanya, perpindahan dari React juga relatif lebih mudah. Sampai terasa aneh bahwa SolidJS relatif tidak mendapat banyak perhatian.Sepertinya Signals sedang menuju Trough of disillusionment dalam Gartner hype cycle 🤔 Dengan use case yang makin terbentuk, saya rasa penilaiannya bisa membaik secara bertahap
Komentar Hacker News
Awalnya saya tidak terlalu tertarik dengan runes. Namun, saya berubah pikiran ketika saya bisa mengimpor komponen eksternal yang reaktif ke dalam template
.sveltedan mengenkapsulasi reaktivitas secara internal. Artinya, kita bisa menulis pengujianvitestsambil tetap mendapatkan manfaat reaktivitas. Ini benar-benar kuat, dan setahu saya, unik di dunia frontendSaya sedang aktif mengembangkan aplikasi SvelteKit yang sudah didistribusikan secara komersial, dan ingin membagikan pendapat saya tentang pengalaman tersebut
+page. Saya bisa menaruh file Svelte di mana saja yang saya mau, dan semuanya dirender dengan mulus sambil tetap mendapatkan manfaat framework modernSayang sekali EmberJS menghilang. API-nya cukup stabil selama 10 tahun terakhir. Ironisnya, orang yang menulis aplikasi EmberJS selama 10 tahun terakhir mungkin akan lebih sedikit kesulitan saat migrasi dibanding orang yang melakukan hal yang sama dengan React, Svelte, Vue, dan lain-lain
Dua tautan Github yang dicantumkan penulis di bagian atas postingan mengarah ke masalah yang sama, dan masalah itu punya solusi (gunakan $state.raw)
Svelte 5 bukan JavaScript dengan cara yang <i>paling buruk</i>. Ia tidak menyelesaikan masalah js, hanya memberikan abstraksi yang bocor untuk beberapa masalah frontend. Saya pikir Solid adalah arah yang lebih baik daripada Svelte. Solid tidak bergantung pada bahasa baru. Namun, ada dorongan alami untuk membuat sesuatu yang bukan js karena js memang tidak ideal. Elm adalah pendahulu svelte. Tetapi saya rasa kita bisa membuat sesuatu yang lebih baik...[0]
Saya mulai menggunakan Svelte 5 karena saya benar-benar tidak suka store di Svelte 4. Saya memakai Sveltekit dan Svelte 5 untuk proyek baru, dan harus saya katakan... produktivitas React masih belum terkalahkan, meskipun secara teknis teknologi Sveltekit dan Svelte lebih baik
+page.server.tsatau+page.svelteatau variannya, sehingga sulit mencari kode dengan mudah. Tooling Svelte terpisah daritscdan ESLint, jadi lebih sulit diintegrasikan ke CI dan digunakan saat developmentAgak aneh mengatakan Svelte bukan JavaScript hanya karena perilaku tak terduga saat meneruskan closure dalam callback. Judul yang lebih baik mungkin adalah "Saya tidak suka Svelte 5 karena ia mengejutkan saya"
Jika Anda mencari library untuk membangun komponen dan aplikasi yang bisa memakai JavaScript murni, coba lihat Lit: Lit
Ingin pengalaman frontend yang masuk akal? Gunakan Javascript vanila, web components, htmx, Blazor