𝟳 𝗕𝗼𝘁𝘁𝗹𝗲𝗻𝗲𝗰𝗸 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮 𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁 𝘆𝗮𝗻𝗴 𝗧𝗲𝗿𝘀𝗲𝗯𝘂𝗻𝘆𝗶

Aplikasi web yang lambat jarang gagal karena algoritma yang buruk. Mereka gagal karena cara kode Anda berinteraksi dengan browser.

Saya melakukan profiling terhadap lebih dari 300 aplikasi produksi. Saya menemukan bahwa 73% masalah performa berasal dari 7 sumber ini.

  1. Layout thrashing Ini terjadi ketika Anda membaca properti layout lalu segera menulis ke DOM setelahnya. Hal ini memaksa browser untuk menghitung ulang layout berkali-kali. • Dampak: Rendering 40-60% lebih lambat. • Solusi: Lakukan batching pada semua pembacaan (reads) terlebih dahulu. Kemudian lakukan batching pada semua penulisan (writes) menggunakan requestAnimationFrame.

  2. Unbounded event listeners Menambahkan listener tanpa menghapusnya akan menyebabkan kebocoran memori (memory leaks). Ini adalah masalah utama pada single-page apps. • Dampak: Pertumbuhan memori 15-30% per jam. • Solusi: Gunakan AbortController untuk membersihkan listener saat sebuah komponen unmount.

  3. Synchronous DOM reads in loops Membaca properti seperti offsetWidth di dalam loop yang juga menulis ke DOM menyebabkan reflow terus-menerus. • Dampak: Penurunan frame (frame drops) sebesar 20-40%. • Solusi: Simpan (cache) nilai layout Anda dalam sebuah variabel sebelum loop dimulai.

  4. Missing requestAnimationFrame batching Perubahan DOM secara langsung pada event scroll atau resize terjadi terlalu sering. • Dampak: Jank sebesar 10-25% saat scrolling. • Solusi: Bungkus scroll handler Anda dalam requestAnimationFrame agar sinkron dengan siklus paint.

  5. Large JSON.parse calls Memproses (parsing) file JSON yang sangat besar akan memblokir main thread. Hal ini menyebabkan input lag. • Dampak: Pembekuan (freeze) selama 50-200ms per pemanggilan. • Solusi: Gunakan Web Workers untuk memproses data di luar main thread.

  6. Complex CSS selector matching Selector yang bersarang dalam (deeply nested) atau kompleks memperlambat kalkulasi ulang gaya (style recalculations). • Dampak: Waktu kalkulasi gaya tambahan sebesar 5-15%. • Solusi: Sederhanakan struktur CSS Anda dan gunakan selector yang lebih datar (flatter).

  7. Duplicate bundle chunks Bundle yang tidak dioptimalkan membuang-buang bandwidth. • Dampak: Pemborosan transfer sebesar 100-500KB. • Solusi: Gunakan alat seperti webpack-bundle-analyzer untuk menemukan dan menghapus kode duplikat.

Cara mengukur kemajuan Anda: • Buka Chrome DevTools dan buka tab Performance. • Rekam sesi selama 5 detik. • Cari tugas yang lama (long tasks) di Main flame chart. • Terapkan satu solusi dan bandingkan waktu Rendering serta Painting.

Fokuslah pada area ini untuk meningkatkan skor Core Web Vitals Anda.

Sumber: https://dev.to/kui_luo/how-to-find-and-fix-7-hidden-performance-bottlenecks-in-your-javascript-code-ek5