- Saat memindahkan mux.com dan docs.mux.com ke React Server Components, Mux mendapati bahwa membagi batas eksekusi antara server dan klien berdampak langsung pada ukuran bundle dan biaya hydration
- RSC memungkinkan komponen mengambil data langsung di server dan streaming hasilnya, sehingga sebagian tampilan bisa ditampilkan lebih dulu meski ada pemanggilan data yang lambat
- Hambatan terbesar dalam migrasi nyata adalah tidak adanya dukungan CSS-in-JS, keterbatasan React Context di Server Components, dan kompleksitas karena harus terus melacak batas server/klien
- Di app directory Next.js 13, default-nya adalah Server Component, sehingga adopsi bertahap dimungkinkan dengan cara secara perlahan menurunkan
use clientke bagian yang lebih bawah dari root - Pola seperti Suspense,
loading.js, menjaga library tetap khusus server, danserver-onlyharus diterapkan secara hati-hati hanya di area yang benar-benar membutuhkan keuntungan performa, sambil ikut menghitung biaya kognitif tim
Cakupan perpindahan Mux ke RSC
- Sambil melakukan restrukturisasi situs dokumentasi dan rebranding, Mux memindahkan mux.com dan docs.mux.com ke Server Components
- React Server Components bisa diterapkan pada codebase nyata dan mungkin layak digunakan, tetapi juga membawa keterbatasan dan kompleksitas
- Pengalaman ini dirangkum dengan fokus pada mengapa RSC diperlukan, cocok untuk kasus seperti apa, situasi apa yang membuatnya rumit, dan bagaimana membawanya secara bertahap ke codebase nyata
Masalah yang dituju RSC setelah CSR, SSR/SSG
- Pendekatan server rendering awal dengan teknologi seperti PHP mengambil data di server dan menangani pekerjaan CPU yang berat, lalu mengirim HTML ringan ke klien
- CSR/SPA mengirim kode rendering ke klien dalam bentuk JavaScript sehingga interaksi bisa diproses dengan cepat, tetapi kelemahannya terlihat saat mesin pencari tidak menjalankan JavaScript, saat rahasia harus tetap disimpan di server, atau saat menghadapi perangkat lemah dan koneksi lambat
- SSR/SSG adalah pendekatan yang, lewat alat seperti Next.js dan Gatsby, menghasilkan HTML dan JavaScript bersama-sama di server lalu mengirimkannya ke klien
- Pengguna bisa langsung melihat HTML
- Saat JavaScript dimuat, situs menjadi interaktif
- Mesin pencari juga bisa membaca HTML
- Pada SSR/SSG lama pun masih ada biayanya
- Sebagian besar JavaScript yang dipakai untuk membuat halaman tetap dikirim ke klien, dan diperlukan hydration agar klien menjalankannya kembali lalu menggabungkannya dengan HTML
- Jika server rendering memakan waktu lama karena pemanggilan database yang lambat atau banyak eksekusi kode, pengguna harus menunggu
Apa yang diubah React Server Components
- React Server Components adalah komponen React yang berjalan di server, bukan di klien
- Framework yang mendukung RSC memungkinkan lokasi eksekusi kode dibagi secara eksplisit
- Server Components: kode yang seharusnya hanya berjalan di server
- Client Components: kode yang harus berjalan di klien
- Ketika lokasi eksekusi dipisahkan, JavaScript yang dikirim ke klien berkurang, dan pekerjaan yang harus dilakukan saat hydration juga berkurang
- Server Component dapat mengambil data langsung di dalam komponen
- Bisa menggunakan library Node atau
fetch - Kebutuhan mengambil data sekaligus di level halaman lewat
getServerSidePropslalu terus meneruskannya lewat props bisa dikurangi - Kasus pengelolaan status loading yang rumit dengan
useEffectjuga bisa berkurang
- Bisa menggunakan library Node atau
- Setelah pengambilan data selesai, Server Component dapat streaming hasilnya ke klien
- Sisa situs bisa ditampilkan lebih dulu sambil menunggu komponen yang lambat
- Dimungkinkan juga mengambil data di server sebagai respons terhadap aksi pengguna di klien lalu melakukan streaming respons, tetapi secara ketat itu bukan RSC melainkan React Actions
Bagian yang rumit dari RSC
- CSS-in-JS saat ini tidak berjalan di Server Components
- Dalam perpindahan Mux ke RSC, bagian terbesar dari pekerjaan adalah berpindah dari styled-components ke Tailwind CSS
- Jika codebase sangat bergantung pada CSS-in-JS, dibutuhkan migrasi terpisah
- React Context hanya bisa diakses dari Client Components
- Untuk berbagi data antarsesama Server Components tanpa props, kemungkinan besar harus memakai modul biasa
- Tidak ada mekanisme yang baik di Server Components untuk membatasi data hanya pada subtree tertentu dari aplikasi React
- Di situs dokumentasi Mux, ini bukan masalah besar karena area yang memakai Context sudah sangat interaktif dan memang harus dikirim ke klien
- Di situs marketing, berbagi tema menjadi masalah
- Setiap komponen di pre-footer perlu tahu bahwa mereka berada di atas latar belakang hijau agar bisa memakai border hijau tua
- Sebagai gantinya, mereka banyak memanfaatkan CSS custom properties
- RSC memberi fleksibilitas pada lokasi eksekusi dan cara mengambil data, tetapi sebagai gantinya kompleksitas juga meningkat
- Developer baru harus terus mengecek “apa yang berjalan di server dan apa yang berjalan di klien”
- Di setiap PR muncul umpan balik tentang kode yang tanpa perlu dikirim ke klien
- Selama pengembangan, sering perlu menaruh
console.loguntuk memastikan apakah log muncul dari server atau browser - Caching juga menambah kompleksitas tersendiri
Cara dasar memakai RSC di Next.js 13
- Pada saat penulisan, implementasi RSC yang siap produksi adalah app directory di Next.js 13
- Di app directory Next.js 13, komponen yang ditulis secara default adalah Server Component
- Dalam keadaan default, kode halaman tidak dikirim ke klien
- Hanya HTML yang dikirim ke klien
- Jika Server Component diberi
async, komponen itu bisa mengambil data di dalam dirinya sendiri - Server Component yang memiliki pengambilan data lambat bisa dibungkus dengan
React.Suspense- Di klien, fallback UI ditampilkan lebih dulu
- Setelah server selesai mengambil data dan merender, komponen hasilnya di-stream ke klien
- Suspense boundary dapat dimanfaatkan bukan hanya untuk data streaming, tetapi juga untuk selective hydration yang menyesuaikan prioritas hydration area tertentu sesuai interaksi pengguna
- Kode yang harus berjalan di klien ditandai dengan menambahkan
"use client"di bagian atas file- Digunakan untuk komponen yang membutuhkan status klien dan interaksi seperti listener
onClickatauuseState - Semua komponen yang di-import oleh komponen bertanda
"use client"juga akan dikirim ke klien
- Digunakan untuk komponen yang membutuhkan status klien dan interaksi seperti listener
- Library yang tidak mendukung RSC bisa di-import di Client Component dan dimasukkan ke bundle klien
- Contohnya adalah komponen
ClientMuxPlayeryang membungkus@mux/mux-player-react
- Contohnya adalah komponen
Kriteria memilih Server Component dan Client Component
- Server Components cocok untuk kode yang tidak perlu dikirim ke klien
- Merender isi utama artikel blog
- Pekerjaan berat seperti syntax highlighting pada code block
- Pengambilan data
- Client Components cocok untuk UI yang merespons input pengguna atau statusnya berubah seiring waktu
useState- Event listener
- Interaksi sisi klien
- Jika seluruh aplikasi dibuat dengan Client Components, perilakunya akan mirip framework SSR lama
- Tidak perlu mengubah seluruh aplikasi menjadi Server Components sekaligus; bisa diadopsi bertahap mulai dari area yang memberi manfaat paling besar
Tiga tahap membawanya secara bertahap ke codebase nyata
- Playbook yang dipakai Mux terdiri dari tiga tahap
- Menambahkan directive
"use client"di root aplikasi - Memindahkan directive itu serendah mungkin di dalam render tree
- Menerapkan pola lanjutan saat masalah performa mulai terlihat
- Menambahkan directive
- Pada tahap pertama, mereka menambahkan
"use client"kepage.tsxpaling atas di Next.js 13 agar aplikasi tetap berperilaku seperti sebelumnya - Jika perlu pengambilan data sisi server, Server Component ditambahkan sebagai parent dari Client Component
- Server Component mengambil data
- Data yang diambil diteruskan ke Client Component lewat props
- Ini bisa menggantikan peran
getServerSidePropsyang lama
- Pada tahap kedua,
"use client"dipindahkan dari komponen paling atas ke komponen anak- Pada
<Title />yang tidak membutuhkan kode klien, directive bisa dihapus sehingga bisa dikirim sebagai HTML murni - Pada
<Player />yang membutuhkan kode klien,"use client"harus dipertahankan karena jika tidak akan terjadi error
- Pada
- Pendekatan ini mendorong tim untuk mempertimbangkan Server Components saat membuat komponen baru atau melakukan refactor, dan membantu mengurangi ukuran bundle sampai batas tertentu
Pola yang diterapkan saat ada masalah performa
- Situs dokumentasi Mux sebagian besar dibuat secara statis, tetapi changelog sidebar diambil dari CMS
- Jika sidebar dibungkus dengan Suspense, sisa aplikasi tidak perlu menunggu hingga fetch CMS selesai
- Konvensi loading.js di Next.js 13 juga secara internal memakai Suspense dan streaming
- Untuk mempertahankan library besar tetap berada di server, penempatan Client Components dan Server Components perlu diatur
- Contohnya, library syntax highlighting Prism tetap dipertahankan di server
Cara mencampur Server Component di dalam Client Component
- Komponen yang di-import oleh Client Component akan ikut menjadi Client Component
- Jika ingin menempatkan Server Component sebagai anak dari Client Component, jangan meng-import-nya secara langsung; kirimkan lewat
childrenatau props- Server Component dirender di server
- Hasil yang sudah diserialisasi diteruskan ke Client Component
- Cara yang salah adalah meng-import Server Component langsung di file Client Component
- Cara yang benar adalah naik ke Server Component induk terdekat lalu meneruskan Server Component itu ke Client Component sebagai child atau prop
Tidak bisa membagi satu file setengah server/setengah klien
- Tidak mungkin membuat separuh isi satu file menjadi Server Component dan separuh lainnya menjadi Client Component
- Mux sering memakai pola memisahkan fitur ke dua file
CodeBlock.server.js: meng-import library syntax highlighting yang besar dan merendernya di serverCodeBlock.client.js: memakaiuseStatedanonClickagar pengguna bisa mengganti contoh kode
- Contoh-contoh yang dirender di server diteruskan ke Client Component lewat props, sehingga pekerjaan khusus server tidak bocor ke bundle klien
- Jika
CodeBlock.server.jsdiekspor ulang dariindex.js, pengguna cukup meng-importCodeBlocktanpa perlu menyadari pemisahan server/klien di dalamnya
Cara memastikan kode hanya berjalan di server
- Pada awalnya, saat pengembangan mereka menambahkan
console.loguntuk memeriksa apakah log keluar dari server atau browser - Untuk memastikan kode khusus server tidak ikut masuk ke bundle, bisa meng-import server-only package
server-onlyberguna agar library besar atau secret key tidak salah berpindah ke tempat yang tidak semestinya- Next.js menyediakan perlindungan agar environment variable tidak secara tidak sengaja masuk ke bundle browser
server-onlydi bagian atas file juga membantu pemeliharaan- Maintainer bisa langsung tahu bahwa file tersebut berjalan di server
Biaya dan manfaat saat menilai apakah perlu mengadopsinya
- React Server Components bukan fitur yang didapat secara gratis
- Biayanya tidak hanya keterbatasan CSS-in-JS dan React Context, tetapi juga mencakup hal-hal berikut
- Memahami lokasi eksekusi server dan klien
- Memahami hydration
- Biaya infrastruktur
- Kompleksitas kode akibat mencampur Client Components dan Server Components
- Kompleksitas memperluas permukaan tempat bug bisa masuk dan menurunkan kemudahan perawatan kode
- Framework membantu mengurangi kompleksitas, tetapi tidak menghilangkannya
- Manfaat yang bisa diharapkan antara lain
- Ukuran bundle yang lebih kecil
- Eksekusi yang lebih cepat
- Peningkatan performa yang penting untuk SEO
- Pola data loading lanjutan untuk situs yang kompleks dan kaya data
- Jika tim siap menanggung biaya kognitif tambahan dan manfaat performanya cukup besar, RSC bisa menjadi pilihan yang tepat
1 komentar
Komentar Hacker News
Dalam rendering sisi server, klien menerima HTML yang bisa langsung dilihat
Saya juga merasakan ini: kalau mengunggah file teks polos ke server, file itu terkirim ke browser dengan cukup cepat
Kalau mengunggah file teks polos lain yang berakhiran
.css, browser tahu cara memprosesnya, sehingga elemen-elemen di tampilan awal bisa bergerak dan mungkin jadi cukup enak dilihatMemang trik yang keren, tetapi tetap saja sekunder dibanding konten berguna yang bisa dibaca di tampilan awal
Entah bagaimana “mari tambahkan fitur untuk membuat hiperteks lebih kuat” berubah menjadi “sekarang silakan implementasikan sendiri aplikasi yang layak pakai dengan tumpukan fitur besar dan tidak konsisten ini”
Sebaiknya berhenti sejenak sebelum masuk ke RSC
Apa pun yang ingin dibuat, semuanya bisa ditangani jauh lebih mudah, cepat, dan skalabel dengan framework full-stack sungguhan atau framework web klasik
Bisa memakai Rails/Django/Laravel/… ditambah Turbolinks/Htmx/…, atau cukup menaburkan sedikit JavaScript di sisi klien
Kalau mengenal Elixir/Phoenix, Anda juga bisa mendapatkan beberapa keunggulan sekaligus
Sebanyak apa pun orang men-tweet, jangan turun lebih jauh ke RSC
Orang-orang dengan pengalaman industri kurang dari 10 tahun akan mengulang masalah-masalah dasar yang dulu dialami situs vanilla PHP, dan saya bahkan sudah melihat hook SQL inline dimasukkan ke dalam komponen React
Kali ini kompleksitas insidental yang menumpuk jauh lebih banyak
Tetap waras saja, cepat rilis produk nyata, lalu hasilkan uang untuk membeli Lamborghini
CORBA adalah cara mencampur komponen lokal dan komponen jarak jauh, sudah matang, dan berjalan di banyak bahasa
Lalu kenapa tidak semua orang memakainya? Sebagian besar developer saat ini mungkin bahkan belum pernah mendengarnya
Kalau ingin membuat arsitektur komponen terdistribusi lain, perlu mempelajari mengapa CORBA dan turunannya tidak berhasil menjadi arus utama
Petunjuknya adalah batas komponen yang tersembunyi menciptakan kompleksitas tersembunyi
Di sisi lain, kubu “HTML yang dirender server” dan “HTML yang dirender klien” sama-sama berjalan dengan baik
Menurut saya cukup beruntung bahwa setiap proyek web bisa memakai kedua pilihan itu
Saya berharap pekerjaan RSC tidak mengaburkan dukungan React untuk aplikasi yang murni dirender di klien
Jika yang dibutuhkan bukan aplikasi frontend kaya yang progresif secara penuh, sebagian besar hal bisa ditangani LiveView lewat komponen sisi server dengan JavaScript seminimal mungkin
Selain itu, setiap pengguna mendapatkan thread di sisi server, sehingga perubahan bisa didorong secara aktif ke frontend pengguna tanpa harus menulis handler JavaScript eksplisit
Industri ini seperti terkena amnesia siklus 10 tahun
Ada alasan yang sangat kuat mengapa kita menjauh dari UI yang dirender server
Tentu selalu ada argumen optimasi mesin pencari, tetapi kalau itu yang dikhawatirkan, buat saja situs template server tradisional
Mayoritas aplikasi satu halaman sama sekali tidak membutuhkan SSR dan kompleksitasnya
Antarmuka dasbor awal semuanya dirender dengan Phoenix, dan hanya halaman yang benar-benar membutuhkan interaksi klien tingkat lanjut yang menyertakan React secara terpisah
Karena produk pertama kami adalah dasbor analitik, situasi itu segera membuat hampir seluruh dasbor menjadi seperti itu, dan memindahkannya ke aplikasi satu halaman penuh dengan memanfaatkan API yang kami ekspos ke pelanggan terasa alami
Saat itu tahun 2016, jadi LiveView belum ada, tetapi saya tidak yakin apakah kami akan mengambil keputusan berbeda jika membangun ulang produk itu sekarang
Artikel blog tersebut membahas aplikasi yang menjalankan situs pemasaran publik dan kebutuhannya cukup berbeda, tetapi saya ingin mengatakan bahwa kami juga memakai dan menyukai Elixir/Phoenix
Rasanya saya makin tua
Framework zaman sekarang terlalu besar dan rumit
Bahkan web “Hello world” yang sederhana pun butuh pipeline build dan kompilasi yang besar, dan sekarang ditambah lagi dengan komponen sisi server
Saya benar-benar penasaran seberapa besar overhead-nya
Entah berapa lapis kode framework frontend dan backend yang harus dilewati hanya untuk menjalankan contoh Hello world
Saya akan kembali ke framework komponen sederhana berukuran 10KB yang cukup tekan F5 untuk build ulang
Ini seperti mengoptimalkan terlalu dini demi fitur-fitur mewah yang mungkin saja baru muncul nanti
Mirip seperti mengatakan bahwa sebelum membangun kandang ayam, kita harus mempekerjakan insinyur untuk mengambil sampel inti tanah dan melakukan pemodelan gelombang seismik
Developer muda sekarang mulai menyadarinya
Sama seperti kita dulu meninggalkan hal-hal mengerikan seperti SOAP dan XML lalu beralih ke teknologi yang lebih sederhana dan mudah digunakan, generasi ini juga sedang belajar lagi bahwa kompleksitas itu berbahaya
Mungkin pengembangan software akan kembali menyenangkan, setidaknya selama beberapa tahun sebelum generasi baru mengacaukannya lagi
Pipeline bisa dibuat serumit atau sesederhana yang diperlukan untuk kasus penggunaan tertentu
Bisa saja dibuat hanya dengan file statis, bisa juga dengan Makefile kecil yang memakai satu perintah
esbuild, atau konfigurasi Webpack raksasa dengan 30 pluginAnda bebas memilih sesuai kebutuhan dan kompleksitas dari apa yang ingin dibuat
Selain itu, menilai tool berdasarkan mudah tidaknya membuat Hello world sederhana hanya berguna kalau pekerjaan yang sebenarnya memang membuat aplikasi semacam itu
Setiap kali SSR atau turunannya masuk ke percakapan, saya selalu bertanya-tanya apakah ini tidak membuat segalanya jadi lebih rumit tanpa perlu
Komponen rendering server React terdengar seperti sudah terlalu jauh, dan bertentangan dengan alur pengalaman developer yang alami
Kalau kompleksitas aplikasi menjadi dua kali lipat, jebakan saat coding bertambah sehingga developer melambat dan bingung, sementara yang didapat hanya peningkatan performa kecil, saya ragu itu sepadan
Situs PHP lama dan aplikasi Rails tanpa single-page app juga sudah lama berjalan dengan baik
Saya punya pengalaman saat membuat aplikasi baru dengan Next.js dan struktur direktori
appyang baruPertama, sulit menalar apa yang terjadi di server dan apa yang terjadi di klien
Untuk mengetahuinya harus diselidiki, tetapi saat menulis kode dengan cepat, biasanya hal itu tidak terlalu diperhatikan
Perubahan kecil saja bisa dengan mudah membuat bagian besar dari halaman tiba-tiba ingin berpindah dari server ke klien
Saya tahu sebelum rilis final nanti perlu verifikasi yang hati-hati dan memakan waktu untuk tiap halaman, dan itu tidak menyenangkan
Kedua, cukup banyak library React yang sudah ada menggunakan hook sehingga diasumsikan berjalan di klien
Akibatnya, kode bisa ikut tertarik ke klien
Tujuan melawan paradigma baru ini adalah server-side rendering demi loading cepat dan optimasi mesin pencari, tetapi kalau library yang diimpor tidak bekerja sama dengan baik, semuanya jadi sia-sia
Ketiga, paradigma direktori
appNext.js yang baru masih punya bugKarena masih baru dan sangat kompleks, route dinamis, route paralel, serta interaksi di antara keduanya bisa benar-benar rusak
Saya sendiri membuka issue di GitHub Next.js, dan banyak komentar “saya juga” bermunculan
Salah satu pendekatan yang saya pakai baru-baru ini diperbaiki oleh developer Vercel, tetapi saat itu saya sudah memilih pendekatan lain untuk mengakalinya
Hal yang paling menyebalkan adalah lingkungan development memakai lazy loading dan sihir caching
Sepertinya ia mencoba menghitung perbedaan halaman lalu mengirim update parsial lewat semacam WebSocket, tetapi bisa rusak total sampai tidak bisa dipulihkan
Kadang recompilation memicu semacam komunikasi dari server ke klien, dan saat kembali ke tab Chrome, tab itu benar-benar membeku sehingga prosesnya harus dimatikan lewat Chrome Task Manager
Secara keseluruhan, ini masih sangat baru dan masih memiliki banyak sudut kasar
Banyak hook juga berjalan di sisi server, dan pada praktiknya tidak melakukan apa-apa selain menginisialisasi nilai
Menarik bahwa PHP dan JavaScript sebenarnya punya sintaks yang nyaris sama
Perbedaannya hanya sekitar simbol
$atau kata kuncivar, tetapi NodeJS mengatakan “kami ingin menjalankan JS di server”Lalu 15 tahun kemudian JavaScript akhirnya mengejar dan pada dasarnya menjadi mirip PHP, hanya saja dengan lebih banyak singkatan dan kurva belajar yang lebih curam
Tentu saja, streaming data dari server ke komponen klien dengan Suspense itu keren
Saya memakai NextJS 13, dan saya suka karena ia membuat SSR semudah yang selama ini selalu mungkin di PHP; sangat saya rekomendasikan
Ketika orang menyebutnya “fraktal dari desain buruk”, itu 100% pantas, dan masuk akal juga kalau mereka mencari tempat lain untuk memecahkan masalah
PHP hari ini adalah bahasa yang jauh lebih baik dan layak dilihat lagi, tetapi kita tidak boleh berpura-pura bahwa sejak dulu PHP sudah sebagus sekarang
Dan jangan menilai NodeJS berdasarkan ekosistem React
Jumlah API dan wrapper yang luar biasa besar yang diperlukan untuk menjalankan sistem berbasis React adalah tanggung jawab komunitas React
Ini sindrom Stockholm yang klasik
Banyak kemajuan modern menjadi mungkin karena browser membaik terlebih dahulu
Ini bukan benar-benar kembali ke titik awal sepenuhnya, melainkan lebih seperti gumpalan yang dari jarak sangat jauh terlihat seperti lingkaran
Di satu sisi, ia inovatif karena model konkurensinya memungkinkan pembuatan backend yang lebih cepat, tetapi banyak fitur dari bahasa backend yang sudah ada seperti Java atau PHP tidak ada, sehingga banyak pola ditemukan ulang
Bahasanya sendiri juga butuh bertahun-tahun untuk mencapai tingkat “keamanan” yang sudah dimiliki Java dan sedang dituju PHP
Teknologi yang sudah teruji dan distandardisasi seperti XML, beserta jaminan kontraktual yang bisa diberikannya, juga ditinggalkan dengan alasan seperti terlalu berat dan JSON lebih enak dibaca dan ditulis manusia
Saya merasa banyak waktu dan upaya hilang karena meninggalkan XML
Dokumentasi REST/JSON API masih menyakitkan
20–25 tahun lalu, dari payload XML kita sudah bisa menghasilkan model data dan parser
Sampai sekarang saya masih tidak tahu apa yang begitu bermasalah dari XML
Di jalur transmisi memang sedikit lebih berat daripada JSON, tetapi itu masalah yang bisa diselesaikan dengan kompresi atau mengubahnya menjadi protokol biner lewat EXI(https://www.w3.org/TR/exi/)
Saya tidak tahu apakah EXI benar-benar mendapat tempat, tetapi saat itu saya cukup berharap karena tahu seberapa banyak XML yang lalu-lalang
Saat itu, I/O non-blocking memberikan peningkatan performa besar
Namun di benak pengembang modern, tampaknya ia tersisih menjadi sekadar alat bodoh untuk memuntahkan JSON atau meng-host toolchain
Mungkin karena memakai yang sudah familier, tetapi menggunakan React untuk situs dokumentasi alih-alih static site generator siap pakai atau CMS dengan caching terlihat seperti pemborosan
Dari sudut pandang pengembang, React mungkin memang lebih menyenangkan
Stripe memulai alur yang menampilkan potongan kode berisi API key akun sehingga bisa langsung diuji
Situs dokumentasi frontend hampir selalu berisi contoh yang bisa dijalankan dan dicoba langsung di dalam dokumentasi
Bootstrap proyek baru itu sangat mudah dan cepat, secara harfiah lebih mudah daripada memulai proyek HTML murni
Apa yang saya lewatkan?
Selain itu, saya sungguh penasaran dengan sudut pandang orang-orang yang menekan downvote
Ini konten statis, jadi saya tidak paham kenapa tidak dihasilkan saja sebagai HTML dengan sedikit JavaScript untuk kotak pencarian
Alasan memakai React adalah agar menggunakan satu bahasa di seluruh frontend
Ini menghindari perpecahan seperti sebagian orang memakai React di satu situs, sementara yang lain memakai Gatsby/Hugo
Next.JS bisa melakukan hal yang sama seperti Gatsby/Hugo, dengan fitur lebih banyak dan berbasis React
Saya cukup tua untuk mengingat masa ketika server merender segalanya, sementara CSS dan Javascript dipakai untuk memperkaya halaman yang sudah dirender
Web sudah menjadi tempat yang terlalu gelap dan terlalu direkayasa
Hampir sulit dipercaya
Jadi cara saya membuat aplikasi adalah server rendering dulu, lalu memperkayanya belakangan
Dropdown yang bisa dilipat atau drag-and-drop jQuery memang fitur yang menyenangkan, tetapi saya juga masih jelas mengingat neraka manajemen state pada era js/jQuery, dan saya tidak ingin kembali ke sana
Bercanda, halaman Geocities pertama saya hanyalah HTML dengan hal-hal seperti penghitung pengunjung atau marquee
Aplikasi/proyek PHP pertama yang saya buat di sekolah juga belum memakai JS; untuk menu dan header statis saya memakai frame, dan data dikirim ke backend hanya lewat submit form
Memang ada masa seperti itu
Pada magang satu tahun pertama yang menjadi bagian dari kurikulum kuliah, kami memakai backend Java, template JSX di lapisan presentasi, dan PrototypeJS untuk hal-hal seperti dialog atau accordion beranimasi
Saat itu animasi berarti “mengubah tinggi elemen ini beberapa kali per detik”
Di pekerjaan pertama, saya banyak memakai JS untuk memperkaya halaman, seperti memasukkan barang ke keranjang atau carousel gambar, dan itu adalah era jQuery
Di pekerjaan berikutnya, kami membuat dengan buruk UI berbasis BackboneJS untuk staf dukungan pelanggan yang melihat-lihat sesuatu seperti SAP
Pekerjaan setelah itu juga membangun ulang frontend investment banking untuk pelanggan dengan BackboneJS
Itu adalah use case yang sangat cocok untuk apa yang saat itu disebut aplikasi satu halaman
Tidak perlu optimasi mesin pencari, rendering frontend murni sudah cukup cepat, berpusat pada API, dan itu adalah masa ketika orang mulai menyadari bahwa API yang sama bisa dipakai untuk web dan mobile
Menurut saya, tool pengembangan web belum pernah sebaik sekarang, dan pengalaman pengguna juga meningkat luar biasa selama bertahun-tahun
Apa yang dulu kita sebut AJAX tumbuh dari mainan tambahan yang rapi menjadi elemen dasar sehari-hari dalam bentuk client component dan single-page app
Server tetap kuat jika kita menginginkannya, tetapi untuk aplikasi interaktif seperti dashboard, peta, game, forum, aplikasi office, dan IDE online, kemampuan sisi klien yang kuat itu bagus
Berkat ini, aplikasi sehari-hari bisa berpindah besar-besaran dari aplikasi desktop khusus tiap sistem operasi ke platform universal yang mencakup semua laptop dan desktop
Tentu saja, kekuatan itu membutuhkan lebih banyak kompleksitas
Menulis blog atau landing page dengan HTML/CSS sangat berbeda dari menulis aplikasi web utuh
Angular dan React dibuat untuk membantu pengembangan aplikasi yang beberapa kali lebih kompleks dari sebelumnya, pada masa ketika runtime JS dan bahasanya sendiri jauh lebih primitif dibanding bahasa server-side saat itu
Pada akhir 2010-an, ada periode yang benar-benar menyakitkan ketika berbagai framework JS hanya menyelesaikan bagian yang sangat kecil dari masalah
Sekarang tidak separah itu
Next menang dan menjadi default, dan itu pantas
Ia menyediakan tingkat abstraksi yang tepat untuk aplikasi dengan kompleksitas menengah, serta memungkinkan kita mencampur server-side rendering dan halaman client-side dengan baik
React server component membuat pemisahan itu menjadi konsep kelas satu yang lebih rapi
Namun itu hanya masuk akal di atas tingkat kompleksitas tertentu
Jika tidak perlu, tidak usah dipakai
Jika itu blog atau situs dokumentasi yang sebagian besar statis, ada arsitektur yang lebih sederhana
Kita masih bisa menulis HTML dan menyisipkan beberapa baris JS seperlunya, dan untuk sebagian besar bisnis kecil juga bisa memakai WordPress atau Wix
Namun jika membuat aplikasi yang lebih kompleks, dibanding pendekatan lama yang bolak-balik ke server untuk setiap interaksi kecil guna menghitung ulang UI dan mengirim seluruh halaman HTML setiap kali, React benar-benar terasa seperti mimpi
Pendekatan seperti itu membuat kita kehilangan konteks, posisi halaman, form yang sudah terisi sebagian, dan sebagainya; mendorong penggunaan data form sebagai state; serta sering membuat pekerjaan hilang karena tidak sengaja menekan tombol kembali atau karena gangguan server yang sering terjadi sebelum scaling cloud yang mudah tersedia
Menurut saya, itu baru overengineering ketika diterapkan secara salah
Pada use case yang tepat, tool seperti ini benar-benar berguna dan kadang penting
Bagian yang disayangkan mungkin adalah terlalu banyak diajarkan dan dianjurkan untuk dipakai bahkan dalam situasi ketika tidak perlu atau justru merugikan
Pada akhirnya, gunakan tool yang sesuai dengan pekerjaan
Saya bukan bermaksud mendorong React di atas Vue, Svelte, atau HTMX, melainkan bahwa kompleksitas sisi klien juga ada gunanya
Saya mendapat kesan React sedang berusaha mengejar alternatif-alternatif yang lebih modern, mudah, cepat, dan murah
Namun alih-alih memperbaiki masalah mendasar seperti rerendering, memoization yang sering diperlukan, dan abstraksi yang bocor, React justru menjadi semakin kompleks
Kalau hasil akhirnya hebat, saya bisa memahami upaya itu, tetapi kenyataannya tidak begitu
React di lingkungan nyata lebih lambat daripada yang ditunjukkan benchmark, dan Next bahkan lebih parah
Belakangan ini saya melihat banyak website sangat lambat yang dibuat dengan Next
Saya benar-benar tidak mengerti
Jika tim React ingin memperbaiki React, mereka harus memperbaiki inti-nya
Sekarang sudah terlalu banyak dependensi ekosistem sehingga akan rusak
Target.com, Walmart.com, Microsoft Teams, dan tak terhitung banyaknya situs memakai React
Ada juga ekosistem komponen yang sangat besar dan perusahaan-perusahaan yang dibangun di atasnya
Konsep intinya rusak, tetapi memperbaikinya berarti bisa merusak semua yang lain
Kalau pada akhirnya semuanya akan dirusak juga, lebih baik memakai yang lain
Sekarang, karena massa dependensi, mereka terikat pada React dan mau tidak mau harus terus menggelinding
React menjadikan rerendering sebagai default lalu kita harus opt out, sedangkan Vue, Solid, Preact, dan Svelte semuanya bekerja dengan cara opt in di tempat yang diperlukan
Ini adalah salah satu alasan utama mengapa sulit dipakai dengan benar dan rentan terhadap jenis bug tertentu
Dari luar tampak seperti JavaScript biasa, tetapi kita harus terus memperhatikan apakah perlu opt out, sementara di framework lain bug seperti itu jarang atau hampir tidak ada
https://react.dev/blog/2023/03/22/react-labs-what-we-have-be...
Saya tidak mengerti kenapa sekarang baru memakai React di backend untuk merender HTML
Apa kita mau kembali ke 10 tahun lalu?
Belakangan ini saya sering bolak-balik antara Svelte dan template Django, dan Svelte jauh lebih enak dipakai hanya karena ia memahami DOM
Saya belum pernah melihat hal seperti ini di sistem template non-JS
Saya juga pernah mengalami PHP, jQuery, dan sebagainya
Selain itu, jika frontend-nya React, jauh lebih mudah menaruh semua pembuatan HTML di satu tempat
Ditambah lagi ada dukungan tipe statis
Saya tidak bermaksud membela bahwa RSC atau React adalah solusi terbaik sepanjang masa, tetapi sebagian bantahan di sini belum matang
Manfaat React/RSC secara teknis tidak sama dengan server yang mengembalikan HTML/CSS dan sedikit JavaScript
Ini tetap satu aplikasi, dan dibandingkan SSR/hydration, ini adalah cara yang menangani batas klien/server dengan lebih cerdas
Saya tetap ingin membaca sebanyak mungkin bantahan yang lebih paham tentang apakah React merancang dirinya sendiri ke jalan buntu dan apa jalur keluarnya, tetapi kembali ke PHP bukan jawabannya
React juga tidak sesulit itu untuk dipelajari, dan ada alasan mengapa non-developer pun bisa mempelajari dasarnya dalam beberapa minggu bootcamp
JSX secara objektif lebih unggul daripada sistem template Django, PHP, dan Rails
Setengah dari bantahan yang asal lempar itu sepertinya bahkan belum pernah mem-benchmark proyek mereka sendiri dengan alat seperti Lighthouse