- Perbandingan antara Backbone pada awal 2010-an dan React pada 2025, sambil meninjau kembali seberapa jauh perkembangan frontend benar-benar maju selama 15 tahun
- React tampak ringkas dan modern di permukaan, tetapi secara internal menyamarkan kesederhanaan lewat lapisan abstraksi yang kompleks
- Backbone memang lebih bertele-tele, tetapi alur event dan manipulasi DOM bersifat eksplisit, sehingga bahkan developer pemula pun dapat dengan mudah menelusuri cara kerjanya
- React memiliki struktur yang sulit di-debug jika tidak memahami cara kerjanya di dalam, karena melibatkan manajemen state, dependency array, dan masalah closure
- Pada akhirnya, tulisan ini mengingatkan kembali pada esensi “event + state = UI” dan mengajukan perlunya model baru yang sederhana serta memiliki struktur yang mudah diutak-atik (hackable)
Kemajuan selama 15 tahun
- Contoh field input kata sandi yang ditulis dengan framework era 2010-an (Backbone) dan React yang telah berkembang lebih dari 10 tahun
- Kedua implementasi kode memiliki panjang yang mirip dan fungsi yang sama
- React didukung oleh waktu kerja begitu banyak developer dan ekosistem yang sangat besar
- Namun penulis menilai bahwa yang lebih menarik bukan “seberapa jauh React membaik”, melainkan “betapa sedikit kemajuannya”
- React menawarkan ilusi kesederhanaan di permukaan, tetapi kenyataannya lebih sulit dipahami karena abstraksi yang kompleks
- Backbone secara eksplisit menampilkan alur sederhana: event terjadi → handler dijalankan → HTML dibuat → dimasukkan ke DOM
- Sebaliknya, React menyembunyikan cara kerja internalnya, dan begitu melewati contoh sederhana, akan muncul masalah yang hanya bisa diselesaikan jika memahami mekanisme internalnya
Ilusi Kesederhanaan (The Illusion of Simplicity)
- Kode React terlihat rapi, tetapi itu adalah hasil dari memilih kompleksitas abstrak alih-alih kesederhanaan eksplisit
- Backbone memang bertele-tele, tetapi dengan jelas menunjukkan “apa yang terjadi dan kapan itu terjadi”
- Bahkan developer pemula pun dapat dengan mudah mengikuti alur kodenya
- Di React, state internal dan logika rendering disembunyikan, sehingga bug yang tidak terduga sering muncul
- Contoh: jika
key pada item daftar diubah menjadi indeks, React dapat mengenalinya sebagai komponen lain dan menginisialisasi ulang state
- Jika
value berubah menjadi undefined, dapat terjadi peralihan dari komponen tak terkontrol ke terkontrol yang menyebabkan nilai input di-reset
- Saat menggunakan
useEffect, masalah loop tak berujung juga umum terjadi
- Jika dependency array mencakup objek yang baru dibuat pada setiap render, React akan menganggapnya sebagai perubahan
- Untuk mencegahnya, diperlukan
useMemo dan useCallback untuk menstabilkan identitas (stabilize identities)
- Akibatnya muncul beban untuk memikirkan konsep yang dulu tidak perlu diperhatikan
- Ada juga masalah ketika click handler mereferensikan state lama (stale state)
- Karena fungsi menangkap state pada saat fungsi itu dibuat
- Solusinya adalah memasukkan state ke dependency array, atau menggunakan functional update seperti
setState(x => x + 1)
- Namun kedua cara itu tetap terasa seperti solusi sementara (workaround)
Harga dari Keajaiban (Magic Has a High Price)
- Masalah-masalah ini bukan situasi pengecualian, melainkan masalah umum yang sering muncul pada aplikasi berskala menengah ke atas
- Untuk melakukan debugging, perlu memahami algoritma reconciliation, render phase, dan scheduler (batch update)
- React adalah struktur yang “tetap berjalan meski kita tidak tahu kenapa”, tetapi saat masalah muncul, solusinya menuntut pemahaman internal
- Kompleksitasnya sedemikian rupa hingga ada ungkapan “untuk benar-benar memahami React, kamu harus membuatnya sendiri”
- Ada tutorial seperti “Build your own React”
- Namun fakta bahwa untuk membuat validator kata sandi yang sederhana kita perlu memahami virtual DOM, prioritas scheduling, dan concurrent rendering memberi implikasi kritis
- Backbone dan jQuery memiliki struktur yang jujur dan hackable
- Kita bisa langsung melihat dan memodifikasi source code-nya
- Karena berbasis metode DOM, lebih mudah dipahami dan diperluas
- Sebaliknya, lapisan abstraksi React membuat akses dan modifikasi internal menjadi sulit
Lalu, Apa Langkah Berikutnya? (So, What's Next?)
- Pada akhirnya, baik React maupun Backbone sama-sama merupakan upaya untuk menyelesaikan masalah yang sama: “event + state = UI”
- Pada aplikasi berskala besar, kompleksitas React mungkin bisa dibenarkan, tetapi untuk sebagian besar aplikasi kecil dan menengah, itu adalah beban yang berlebihan
- Dibutuhkan model UI baru yang memiliki kesederhanaan dan transparansi
- Sistem yang kokoh namun intuitif seperti DOM
- Struktur yang bisa langsung dipahami dan dimodifikasi seperti Backbone atau jQuery
2 komentar
Untuk aplikasi skala kecil hingga menengah, rasanya lebih tepat menyiapkan langkah ke depan dengan merancang
JavaScript Classdaripada memakai Backbone atau JQuery.Menghafal lagi template-template yang ada di JQuery atau Backbone lalu melanjutkan pekerjaan rasanya seperti kemunduran.
Komentar Hacker News
Sudah pernah memakai semuanya, dari Backbone, Angular 1, Ember, sampai React
Jangan mengabaikan alasan React menjadi populer. Dalam hal komposisi komponen, penanganan event, manajemen state, dan pembaruan DOM yang efisien, React menyelesaikan masalah-masalah kronis pada framework sebelumnya
Backbone rumit dalam mengelola siklus hidup DOM, dan karena event handler harus ditentukan sebagai string, pemeliharaannya sulit. React menyederhanakan masalah ini dengan alur state satu arah dan virtual DOM
Kalau sekarang ingin memakai JS murni, saya rasa solusi templating seperti lit-html jauh lebih baik daripada Backbone
Frontend dulu juga rumit dan sekarang juga tetap rumit, tetapi sekarang jauh tidak terlalu menyakitkan
Kompleksitas aplikasi bukan berasal dari jumlah komponen, melainkan dari manajemen state
Karena alur data dua arah di Backbone Store, saya sering mengalami UI macet. Inovasi React adalah arsitektur Flux yang berpusat pada alur data satu arah
Saya menganggap framework yang baik adalah alat yang secara alami mengarahkan kita ke “Pit of Success”. React sudah menjalankan peran itu dengan baik
Misalnya, masalah seperti stale closure, loop useEffect tak berujung, dan input ter-reset karena perubahan key tidak ada di Backbone
Masalah di Backbone terlihat jelas dan mudah di-debug, tetapi masalah React tersembunyi di balik abstraksi
Kebanyakan aplikasi tidak berskala Facebook, jadi pendekatan yang eksplisit dan sederhana justru bisa lebih baik
Menyimpulkan bahwa teknologi populer itu “buruk” terasa seperti bentuk kesombongan naif
Tentu saja popularitas tidak menjamin kualitas, tetapi menganggap semua insinyur hebat di seluruh dunia tertipu juga berlebihan
Kalau didorong perusahaan besar dan pemasaran, para CTO akan mengadopsinya, dan kalau karier dipertaruhkan, tak ada yang mau bilang “ini kurang bagus”. Popularitas ≠ kecocokan
React tidak menang hanya karena keunggulan teknis, tetapi juga karena pemasaran Facebook dan penguatan ekosistemnya sendiri
Setelah 15 tahun, panjang dan kompleksitas kode juga tidak banyak berkurang. Hanya saja menjadi rumit dengan cara yang berbeda
Menoleh ke masa lalu bukan karena nostalgia, melainkan untuk memeriksa apakah kita telah menambahkan kompleksitas yang tidak sepadan
Web tetap seperti wilayah liar untuk pola desain. Setelah menerima itu, saya jadi lebih tenang
Pada akhirnya, untuk setiap proyek kita harus mengevaluasi ulang trade-off
Klaim “untuk hal sederhana tidak perlu React” adalah React fallacy yang umum
Menilai React dari contoh sederhana sama seperti “menilai bahasa dari panjang Hello World”-nya
Alasan React dipakai untuk hal sederhana adalah karena React juga dipakai untuk hal kompleks. Set alat yang konsisten lebih menguntungkan untuk pemeliharaan
Backbone itu “terlihat seperti framework, tetapi sebenarnya gumpalan glue code”
Kemenangan sejati React adalah tidak perlu manipulasi DOM langsung dan adanya manajemen state reaktif. Dua hal ini sangat meningkatkan produktivitas pengembang
Tautan tutorial lama, versi arsip
Sekarang saya lebih tertarik pada bagaimana LLM memahami kode. Sintaks deklaratif seperti JSX ramah terhadap LLM
Tetapi React setelah useEffect justru terasa makin kabur dari sisi daya ekspresi dan keeksplisitan
Alasan React menjadi sangat populer terlihat jelas
Kode React kebanyakan hanyalah JS dan HTML murni, dan intinya hanya
useState. Sangat intuitif sehingga bisa dipahami tanpa dokumentasiBackbone bergantung pada selector string seperti
.space-y-2, sehingga pemeliharaannya seperti neraka. Ganti satu nama class, setengah aplikasi bisa rusakReact menyelesaikan masalah ini secara struktural
Kode Backbone jelas menunjukkan “apa yang terjadi dan kapan”, sedangkan React mengharuskan kita memahami cara kerja internalnya
Saya juga berkali-kali membaca panduan useEffect dari Dan Abramov dan blog Mark Erikson untuk memahami kapan React bekerja
Kode Backbone tetap langsung bisa dipahami bahkan setelah dilihat lagi 10 tahun kemudian
Enam tahun lalu tim kami pindah dari Backbone ke Angular
Backbone bagus untuk junior karena intuitif dan tanpa sihir, tetapi pada akhirnya TypeScript dan Angular lebih sistematis
Sekarang kami memakai NG20 dan puas. Jika suatu hari browser menyediakan lebih banyak kemampuan secara bawaan, mungkin kami bisa kembali ke cara yang lebih sederhana
Kita selalu memrogram di atas abstraksi
Yang penting adalah apakah abstraksi itu memberi keuntungan produktivitas dibanding kompleksitasnya, dan apakah bisa dipercaya
Setidaknya, dalam skenario terburuk pun tetap harus bisa di-debug
Field input React menangani undo dengan lebih alami daripada Backbone
Backbone mengembalikan satu huruf per satu huruf, sedangkan React mengembalikan per kata