React 19
(github.com/facebook)19.0.0 (5 Desember 2024)
Fitur baru
React
- Actions:
startTransitionkini dapat menerima fungsi asinkron. Fungsi-fungsi ini disebut "Actions" dan memperbarui state di latar belakang serta melakukan commit UI sekaligus. Actions dapat menjalankan efek samping seperti permintaan asinkron, dan menunggu pekerjaan selesai sebelum Transition berakhir. useActionState: Hook baru untuk mengurutkan Actions dan mengakses state di dalam Transition. Menerima state awal dan reducer.useOptimistic: Hook baru untuk memperbarui state saat Transition sedang berlangsung. Ketika Transition selesai, state diperbarui ke nilai baru.use: API baru untuk membaca resource saat rendering. Menerima Promise atau Context, dan jika Promise diberikan, akan melakukan suspend hingga nilainya terselesaikan.- Menggunakan
refsebagai prop:refkini dapat digunakan sebagai prop tanpa memerlukanforwardRef. - Prewarming sibling Suspense: Saat komponen melakukan suspend, React segera melakukan commit fallback dari boundary Suspense terdekat.
React DOM client
- Prop
actionpada<form>: Form Actions secara otomatis mengelola form dan terintegrasi denganuseFormStatus. Form juga otomatis di-reset saat berhasil. - Dukungan metadata dokumen: Tag metadata dokumen kini bisa dirender secara native dari komponen.
- Dukungan stylesheet: Menyisipkan stylesheet ke
<head>klien sebelum menampilkan konten dari boundary Suspense. - Dukungan script asinkron: Dapat merender script asinkron dari mana saja di dalam tree komponen.
React DOM server
- Penambahan API
prerenderdanprerenderToNodeStream: API untuk pembuatan situs statis, dirancang agar bekerja di lingkungan streaming seperti stream Node.js dan web stream.
React server components
- Fitur RSC: directives, server components, dan server functions kini telah stabil. Library yang menyertakan server components sekarang dapat menargetkan React 19 sebagai peer dependency.
Akan dihentikan
- Akses
element.ref: Akseselement.refdihentikan dan disarankan menggunakanelement.props.ref. react-test-renderer: Di React 19,react-test-rendererakan mencatat peringatan penghentian dan beralih ke concurrent rendering untuk penggunaan web.
Perubahan utama
React
- Transformasi JSX baru wajib: Transformasi JSX baru diperlukan untuk meningkatkan ukuran bundle dan memungkinkan penggunaan JSX tanpa mengimpor React.
- Error rendering tidak dilempar ulang: Jika error tidak ditangkap oleh Error Boundary, error akan dilaporkan ke
window.reportError. - Penghapusan
propTypes: PenggunaanpropTypesakan diabaikan secara diam-diam. Migrasi ke TypeScript direkomendasikan. - Penghapusan
defaultPropspada fungsi: Dapat menggunakan parameter default ES6 sebagai gantinya. - Penghapusan string refs: Penggunaan string refs harus dimigrasikan ke callback ref.
React DOM
- Penghapusan
react-dom/test-utils:actdipindahkan darireact-dom/test-utilske react. Utility lainnya dihapus. - Penghapusan
ReactDOM.render,ReactDOM.hydrate: Digantikan olehReactDOM.createRootdanReactDOM.hydrateRootuntuk concurrent rendering.
Perubahan yang patut diperhatikan
React
- Menggunakan
<Context>sebagai provider: Kini dapat merender<Context>sebagai provider alih-alih<Context.Provider>. - Dukungan custom element: React 19 lulus semua pengujian custom element.
- Perubahan StrictMode:
useMemodanuseCallbackmenggunakan kembali hasil memoization dari rendering pertama.
React DOM
- Perbedaan untuk error hydration: Jika terjadi ketidakcocokan, React 19 mencatat satu error yang mencakup perbedaan pada konten yang tidak cocok.
Perubahan TypeScript
- Larangan implicit return: refs kini hanya menerima fungsi cleanup. Implicit return akan memicu error.
- Argumen awal
useRefwajib: Argumen awal sekarang wajib. - Pengetikan
ReactElementlebih ketat: props pada elemen React kini menggunakan defaultunknownalih-alihany.
1 komentar
Pendapat di Hacker News
Saya tidak begitu paham kenapa begitu banyak orang di sini membenci React
Saya memulai karier dengan Laravel dan JS murni, tetapi setelah mencoba React, membuat aplikasi yang skalabel terasa realistis dan frontend juga jadi menyenangkan
Meski pindah perusahaan, React mudah dipelajari lagi, dan berkat dukungan TypeScript serta ekosistem yang besar, rasanya cukup mudah untuk membuat dan mengembangkan apa pun
Saya juga tidak mengerti kenapa fitur baru membuat orang takut. Kita masih bisa membuat SPA atau memakai cara lama, mirip seperti saat NoSQL DB, Spring Boot, atau Kotlin muncul: kalau tidak mau pakai, ya tidak usah dipakai
Seingat saya Jetpack Compose dan SwiftUI juga terinspirasi dari React; rasanya dulu pernah melihatnya di dokumentasi Android, tetapi sekarang tidak bisa menemukannya
Namun saya belum punya pengalaman puluhan tahun, jadi saya tidak tahu seberapa menyenangkannya dulu tim besar membangun web app besar seperti Airbnb dengan jQuery atau JS murni. Sekarang bahkan sulit membayangkan bagaimana menyelesaikan state management, manipulasi DOM, dan side effect dengan JS murni
Suatu hari mungkin saya juga akan mengeluhkan framework baru dan berkata React dulu lebih baik
Biasanya logikanya seperti “frontend selalu mengejar hal baru yang mengilap, dan React salah satunya”, tetapi React sudah ada sejak 2013 dan kira-kira sejak 2015 sudah cukup mainstream
Ada juga yang bilang framework dan library menambah kompleksitas, tetapi ketika ditanya kompleksitas seperti apa secara spesifik, hampir tidak ada jawaban. Kalau membuat aplikasi yang bermakna tanpa framework, pada akhirnya kita akan menciptakan framework sendiri yang kurang terkelola, kurang teruji, dan kurang terdokumentasi
Tahap kompilasi dan bundling juga sering dikeluhkan, tetapi sekarang sudah ada framework yang teruji seperti Expo, Next.js, dan Meteor, sehingga hampir tidak ada alasan untuk menyusun konfigurasi webpack atau build pipeline sendiri
Tren memasukkan web framework ke semua tempat selama 10 tahun terakhir telah menghasilkan situs yang lambat dan mudah rusak, dan dalam banyak kasus, meski over-engineered, pengalaman penggunanya tidak jauh lebih baik daripada tahun 2008
Bagi sebagian frontend developer, apa pun pertanyaannya, jawabannya adalah kombinasi React / Node / Vite / Angular / Vue / Nuxt / Next / Bun / Deno / Svelte / SvelteKit, dan kalau bisa harus berjalan di atas puluhan swarm Docker yang dikuasai Kubernetes. Gayanya seperti, “Mau menaruh CV secara online? Kalau begitu selama 3 minggu ke depan mari kita gambar diagram alur state aplikasinya”
React tampaknya mendapat lebih banyak celaan karena orang-orang yang mengejar tren framework sudah pindah ke hal mengilap berikutnya, sementara orang-orang yang dari awal membenci framework semacam ini tetap membencinya, sehingga kini tidak ada lagi yang tersisa untuk membela kekacauan ini. Framework lainnya sepertinya akan mengalami nasib yang sama seiring waktu
Cara kerja sebenarnya banyak disembunyikan dan tidak intuitif, mudah salah, dan UI berkinerja buruk pun mudah ditulis
Kita harus terus memikirkan apa yang dijalankan berapa kali, apa yang harus dimasukkan ke dependency array, serta apa yang harus dimasukkan ke
useCallbackdanuseEffect, sehingga beban kognitifnya besarSebagian komunitas juga menganjurkan dependency React yang tidak diperlukan proyek, sehingga hanya menambah overhead dan kompleksitas
Logika bisnis dan logika UI juga mudah tercampur
Untuk sementara SPA memang punya kekurangan dibanding MPA, tetapi dengan standar web modern dan adopsi server-side rendering oleh framework SPA, masalah-masalah itu kini hampir terselesaikan
https://www.youtube.com/watch?v=b2F-DItXtZs
Rilis yang keren, tetapi saya juga merasa agak kasihan pada orang yang baru mulai masuk ke pengembangan frontend sekarang
Penjelasan seperti “hook baru untuk mengurutkan Action di dalam Transition dan mengakses status action serta status pending; menerima reducer yang bisa memanggil Action dan state awal yang digunakan pada render pertama; serta juga menerima string opsional untuk mendukung progressive enhancement pada form jika diteruskan ke prop form action” terdengar fiturnya bagus, tetapi terlalu bertele-tele
Kalau mulai mengembangkan situs web hari ini, rasanya akan bingung harus mulai dari mana
Meski begitu, React tetap framework yang luar biasa dan rilis ini juga merupakan peningkatan. Kritiknya bukan hanya untuk React, melainkan lebih ke pengembangan frontend secara umum
Menggunakan sesuatu seperti HTMX dengan server-side rendering gaya lama jauh lebih baik
Saya mencari nafkah dari pengembangan frontend React selama 4 tahun dan membuat situs web pertama saya pada 2005; sekarang saya sedang memindahkan satu proyek klien dari React ke HTMX dan merasa hasilnya jauh lebih baik
Bug lebih sedikit, dan jebakan akibat salah memakai hook juga lebih sedikit
Jika butuh client-side rendering, saya akan memakai Solid atau Vue, tetapi akan menghindari React. Kalau tidak punya pilihan, semoga beruntung
Premis dasarnya—one-way binding, virtual DOM, re-rendering, dan diffing—secara fundamental tidak meyakinkan bagi saya. Itu berarti memakai memori browser dua kali lipat, lalu melakukan re-render penuh dan diffing pada setiap interaksi
Jawaban waktu itu adalah “buat stabil dulu, lalu buat cepat”, tetapi sekarang isinya penuh struktur hacky untuk membuatnya cepat, dan hasilnya tidak cepat maupun stabil
Menurut saya framework two-way binding yang jujur setidaknya menjamin kecepatan, sementara stabilitas datang dari pengalaman. React hanya terasa kacau. Saya kasihan pada engineer yang pengalaman frontend pertamanya adalah React, karena tampaknya jauh lebih sulit menghapus dan mempelajari ulang daripada sekadar belajar
Dari sudut pandang seseorang yang telah melewati VBScript, JS, jQuery, Mootools, Applets, ActionScript, YUI/Ext/Sencha, Backbone, Knockout, Angular 1, Angular 2, React, hingga Vue 1, saya ingin menyarankan untuk mencoba Flutter. Benar-benar terasa segar
Namun masalahnya ada pada Dart. Kalau Flutter memakai TypeScript, ia akan sedikit lebih dekat ke ideal, tetapi Dart terus menghidupkan semangat churn tanpa akhir di frontend
Standar web secara umum juga lebih stabil daripada sebelumnya. Developer muda tidak perlu mempelajari ratusan trik layout agar halaman tampil benar di berbagai browser, dan terkadang juga lebih sedikit hack yang hanya ditujukan untuk satu browser
Saya paham rasa lelah terhadap JavaScript, tetapi menurut saya sekarang adalah salah satu waktu terbaik untuk belajar
Semuanya terasa seperti pengembangan yang benar-benar layak, dan dibandingkan kondisi sebelumnya rasanya seperti menghirup udara segar
Bagi 99% developer, fitur seperti itu tidak dibutuhkan sampai aplikasi tumbuh sampai tingkat tertentu, dan mungkin tidak akan pernah dibutuhkan. React juga tidak memaksakannya
Saya dulu menyukai framework sisi klien seperti React, tetapi akhirnya menyadari bahwa itu menambahkan kompleksitas di semua tempat yang memungkinkan
Kompleksitas masuk ke backend, frontend, stack DevOps, di mana-mana, dan akan terus ada lebih banyak lapisan yang ditambahkan untuk menyinkronkan kompleksitas yang tersebar itu
UI yang otomatis di-render ulang saat data atau model berubah adalah arah yang benar
Detail caranya bisa diperdebatkan, tetapi pendekatan imperatif yang mengubah UI secara langsung setiap kali data berubah sulit bertahan lama dari sisi codebase maupun ukuran tim
Ia menambahkan kompleksitas besar untuk membuat browser web merender kotak dengan cara yang awalnya tidak dimaksudkan, dan atas nama mengubah paradigma coding, produktivitas serta ekosistem tooling juga banyak hilang
Ada ide dan implementasi yang keren, tetapi saya tidak tahu apakah itu sepadan. Kadang saya bertanya-tanya apakah itu semacam alat pengaman pekerjaan
Ini bukan hanya masalah ReactJS; seluruh ekosistem JavaScript memang menggila dengan library dan tooling, tetapi React khususnya menyebalkan untuk mulai digunakan, sampai akhirnya create react app muncul agar orang bisa membuat aplikasi hello world dalam waktu yang masuk akal
Saya sudah berhenti berharap bisa memahami alasan mengganti API class component dengan hook
Bisa saja memilih framework yang lebih sederhana, atau menghindari orkestrasi server
Jika tidak punya pilihan, bisa juga memulai sendiri proyek yang Anda yakini bisa punya keunggulan efisiensi dengan stack yang sederhana
Salah satu bagian terbaik dari rilis ini adalah ref kini bisa dipakai sebagai prop. Sekarang
forwardReftidak lagi diperlukanTulisan blognya lebih mudah dibaca: https://react.dev/blog/2024/12/05/react-19
updateNamemengembalikan error padaconst error = await updateName(newName);Bukankah seharusnya, seperti gaya JS/TS, cukup melempar
Errorsaja?Jika dari 45 komentar sejauh ini ada 7 penyebutan “redux”, di sini saya ingin menyebut Jotai sebagai wakil dari keluarga Recoil. Kemungkinan besar di React 19 pun sudah bisa berjalan tanpa perubahan khusus
Ketika kompleksitas frontend sudah cukup besar, alat manajemen state lain sering kali justru mengganggu lebih dari yang diperlukan
Kalau Anda jadi tidak suka React, tetapi sebenarnya yang membuat lelah adalah dinding konstanta action yang tak ada habisnya, perpipaan prop, pertarungan dengan provider/context bertingkat, dan pelarian ke pub-sub, sesuatu seperti Jotai layak dicoba
https://github.com/pmndrs/zustand
https://github.com/pmndrs/valtio
Jotai terasa punya terlalu banyak boilerplate manual, sedangkan Valtio punya terlalu banyak “sihir” proxy; secara pribadi saya menyukainya, tetapi tidak yakin apakah itu pilihan yang baik untuk tim
Zustand berada di tengah antara boilerplate dan sihir, jadi saya memilihnya untuk proyek besar yang sedang berjalan
Saat mulai mengerjakan aplikasi React beberapa tahun lalu, semua paket manajemen state yang saya lihat penuh dengan istilah seperti itu, dan sampai sekarang masih begitu
Pada akhirnya, untuk lepas dari hal-hal semacam itu dan fokus pada pekerjaan, saya membuat solusi sendiri [1], dan berjalan baik di lingkungan produksi. Sayang tidak ada pilihan populer yang bekerja dengan cara serupa
[1] https://github.com/facepunch/react-class-model
Hal bagus dari context hook adalah bisa dikomposisikan, dan jika digabungkan dengan kueri yang di-cache, bisa membentuk pola yang cukup mudah dipelihara
Saya penasaran perbaikan praktis apa yang diberikan Jotai di sini
Saya benar-benar berharap tidak perlu berurusan lagi dengan redux atau sagas
Sebagian besar fitur baru yang diperkenalkan tidak saya sukai
Actions dan hook
useActionState/useOptimisticterlihat seperti jebakan kompleksitas besar. Nama hookuseterlalu tidak informatif, dan tidak menangani promise yang dibuat di dalam komponenPasti ada alasan yang baik, tetapi cara meneruskan promise sebagai prop lalu menanganinya dengan hook
usetampaknya akan menciptakan lebih banyak kompleksitas daripada workaround saat iniServer Components juga tampak cukup rumit, dan untungnya saya belum perlu menanganinya
Perbaikan pesan error hydration patut disambut, dan perubahan penggunaan provider serta penggunaan ref sebagai prop adalah peningkatan kualitas yang bagus
Secara keseluruhan, untuk membuat SPA saya menyukai React/Preact. Dengan library komponen kaya fitur seperti MUI dan solusi manajemen state sederhana seperti Preact Signals, pembuatan SPA terasa cukup intuitif
Namun saya khawatir kompleksitasnya perlahan-lahan merayap masuk. Membaca penjelasan hook baru di catatan rilis saja sudah terasa memberi beban kognitif yang besar
Sebaliknya, React Compiler adalah alat yang memang sangat dibutuhkan. Programmer tidak perlu menulis optimisasi tipikal langsung di dalam komponen, sehingga komponen akan menjadi lebih tidak kompleks
Saya menantikan rilis dan integrasinya dengan Vite dan lainnya, dan dari yang saya dengar Preact juga akan didukung
Akan lebih baik jika API
usediganti namanya menjadi sesuatu yang berbeda dari prefiks umum hookOrang yang baru mempelajari hook React kemungkinan akan bingung ketika melihat
useboleh dipanggil secara kondisional, sedangkan hooks biasa tidak bolehSenang sekali rilisnya ditunda untuk menyelesaikan masalah Suspense paralel
Saya belum mencobanya, tetapi ekspektasi saya besar, dan secara keseluruhan ini rilis yang luar biasa
Kabar terbaru: custom elements didukung sepenuhnya. Artinya Web Components