- Seperti JPEG progresif, data JSON juga dapat dikirim lebih dulu dalam keadaan belum lengkap sehingga klien bisa memanfaatkan keseluruhan isi secara bertahap
- Metode parsing JSON yang ada saat ini memiliki masalah inefisiensi karena tidak bisa melakukan apa pun sebelum seluruh data diterima sepenuhnya
- Data dibagi menjadi beberapa chunk dengan pendekatan breadth-first, lalu bagian yang belum siap ditandai sebagai Promise dan diisi secara progresif saat sudah tersedia, sehingga klien tetap bisa memanfaatkan data yang belum lengkap
- Konsep ini adalah inovasi inti dari React Server Components(RSC), dan
<Suspense> digunakan untuk mengontrol status loading bertahap yang memang diinginkan
- Dengan memisahkan streaming data dan alur loading UI yang disengaja, pengalaman pengguna yang lebih fleksibel dapat diberikan
Ide JPEG Progresif dan JSON Progresif
- JPEG progresif tidak memuat gambar sekaligus dari atas ke bawah, melainkan menampilkan keseluruhan gambar lebih dulu dalam keadaan buram lalu secara bertahap menjadi tajam
- Dengan cara serupa, pendekatan progresif dapat diterapkan pada pengiriman JSON sehingga sebagian data bisa langsung digunakan tanpa menunggu semuanya selesai
- Pada struktur data JSON contoh, pendekatan biasa hanya bisa melakukan parsing setelah seluruh byte terakhir diterima
- Akibatnya, klien harus menunggu sampai semuanya terkirim, termasuk bagian server yang lambat (misalnya mengambil comments dari DB yang lambat), dan inilah standar saat ini yang sangat tidak efisien
Keterbatasan parser JSON streaming
- Dengan memperkenalkan parser JSON streaming, kita bisa membuat tree objek data yang belum lengkap (di tengah proses)
- Namun, jika field dalam tiap objek (misalnya footer, daftar comment yang banyak, dan sebagainya) hanya terkirim sebagian, muncul masalah ketidakcocokan tipe dan sulitnya mengetahui apakah data sudah lengkap, sehingga kegunaannya menurun
- Seperti rendering HTML streaming, pemrosesan stream secara berurutan tetap menimbulkan masalah bahwa satu bagian yang lambat menunda seluruh hasil
- Inilah alasan mengapa JSON streaming umumnya jarang digunakan
Usulan struktur Progressive JSON
- Alih-alih streaming depth-first seperti cara lama (yakni mengirim sambil menelusuri hingga ke bagian bawah struktur tree), digunakan pendekatan breadth-first
- Hanya objek tingkat atas yang dikirim lebih dulu, sedangkan nilai-nilai di bawahnya dibiarkan sebagai placeholder mirip Promise, lalu diisi satu per satu dalam chunk terpisah saat sudah siap
- Misalnya, setiap kali server selesai memuat data secara asinkron, chunk yang sesuai dikirim, dan klien dapat memanfaatkannya sejauh yang sudah siap
- Ini memungkinkan penerimaan data asinkron (load lebih awal), sehingga tidak perlu menunggu seluruh bagian lambat selesai diproses
- Jika klien dibangun tangguh terhadap penerimaan chunk yang tidak berurutan maupun sebagian berurutan, server bisa lebih fleksibel menerapkan berbagai strategi pembagian chunk
Inlining dan Outlining: pengiriman data yang efisien
- Format streaming JSON progresif dapat mengekstrak objek yang digunakan ulang (misalnya userInfo yang sama direferensikan di banyak tempat) ke satu chunk terpisah tanpa duplikasi penyimpanan, lalu setiap posisi dapat merujuk ke referensi yang sama
- Hanya bagian yang lambat yang dipisahkan dan dikirim sebagai placeholder, sementara sisanya langsung diisi untuk membentuk stream data yang efisien
- Jika objek yang sama muncul berkali-kali, objek itu cukup dikirim sekali lalu digunakan kembali (Outlining)
- Dengan cara ini, referensi siklik (struktur objek yang merujuk ke dirinya sendiri) juga tidak lagi sulit seperti pada JSON biasa, dan dapat diserialisasi secara alami melalui struktur referensi tidak langsung antar-chunk
Implementasi streaming progresif di React Server Components(RSC)
- React Server Components yang sebenarnya adalah contoh representatif yang menerapkan model streaming JSON progresif
- Server menggunakan struktur yang memuat data eksternal (misalnya Post, Comments) secara asinkron
- Di sisi klien, bagian yang belum tiba diperlakukan sebagai Promise, lalu UI dirender secara progresif sesuai urutan kesiapan data
- React
<Suspense> digunakan untuk menetapkan status loading yang disengaja
- Untuk mencegah lompatan tampilan yang tidak perlu dari sudut pandang pengalaman pengguna, status Promise (lubang) tidak langsung ditampilkan, melainkan loading bertahap dapat diarahkan dengan fallback
<Suspense>
- Sekalipun data tiba dengan cepat, pengembang tetap dapat mengontrol agar UI yang sebenarnya ditampilkan secara progresif sesuai tahapan yang dirancang
Ringkasan dan implikasi
- Inovasi inti React Server Components adalah men-streaming props pada tree komponen secara progresif dari bagian luar ke dalam
- Karena itu, tidak perlu menunggu server menyiapkan seluruh data sepenuhnya; bagian utama bisa ditampilkan lebih dulu secara bertahap, dan status tunggu loading juga dapat dikontrol dengan rinci
- Bukan hanya streaming itu sendiri, tetapi juga dukungan struktural seperti model pemrograman yang memanfaatkannya (misalnya React
<Suspense>) diperlukan
- Melalui ini, hambatan pada metode pengiriman lama—seperti satu bagian data lambat yang menunda keseluruhan—dapat dikurangi
1 komentar
Komentar Hacker News
JSON.parse