Kenapa React app kita lambat banget ya? Yuk, cari tahu dan bikin ngebut!

Kenapa React app kita lambat banget ya? Yuk, cari tahu dan bikin ngebut!
Photo by Zulfugar Karimov/Unsplash

Duh, pernah nggak sih kita ngalamin React app yang berasa lemot banget kayak keong racun pas lagi diakses? Bikin pusing tujuh keliling ya apalagi kalau pas deadline mepet. Nah, kalau kamu sekarang lagi ngalamin hal ini atau cuma penasaran kenapa sih React app kadang kok bisa lambat banget kita ada di tempat yang pas banget. Kita bakal bongkar habis apa aja sih biang keroknya dan gimana cara kita bisa bikin React app kesayangan kita ini ngebut lagi. Dijamin setelah ini ngoding jadi makin asik dan user experience makin juara. Yuk langsung aja kita bedah satu per satu masalahnya dan solusinya.

Menggali Akar Permasalahan Kenapa React App Kita Lemot

Sebelum kita bicara solusi rasanya kurang afdol kalau kita nggak tahu dulu apa sih penyebab utama di balik kelambatan React app kita. Ibaratnya mau sembuh ya harus tahu dulu penyakitnya apa. Ada beberapa faktor umum yang sering jadi biang kerok performa React yang kurang maksimal. Memahami ini penting banget biar kita nggak salah langkah saat melakukan optimasi.

Re render yang Nggak Perlu Bikin Boros Energi

Ini nih salah satu tersangka utama. React bekerja dengan sistem komponen dan setiap kali ada perubahan pada state atau props sebuah komponen React akan mencoba untuk me render ulang komponen tersebut dan juga anak anaknya. Masalahnya seringkali kita punya re render yang terjadi padahal sebenarnya nggak ada data yang berubah signifikan. Bayangin aja kalau ada ratusan komponen yang re render padahal cuma satu dua yang perlu update. Ini jelas buang buang resource dan bikin app jadi lambat. Kita perlu banget nih mengidentifikasi dan mengurangi re render yang tidak perlu.

Ukuran Bundle JavaScript yang Membengkak Bikin Loading Lama

Pernah lihat ukuran bundle JavaScript app kita gede banget sampai ber megabytes megabytes? Nah ini juga sering jadi masalah. Semakin besar ukuran bundle JavaScript semakin lama waktu yang dibutuhkan browser untuk mengunduh mengurai dan mengeksekusi kode tersebut. Apalagi kalau pengguna mengakses app kita dengan koneksi internet yang kurang stabil wah bisa berasa banget lemotnya. Ini bisa terjadi karena kita mungkin mengimpor banyak library yang tidak terpakai atau mengimpor seluruh bagian library padahal cuma butuh sebagian kecil.

Komputasi Berat di Main Thread Bikin UI Ngadat

React app kita berjalan di main thread browser yang juga bertanggung jawab untuk rendering UI dan menangani interaksi pengguna. Kalau ada komputasi yang terlalu berat atau terlalu lama berjalan di main thread ini otomatis akan memblokir rendering UI dan membuat app terasa nggak responsif. Contohnya seperti looping data yang sangat besar atau operasi matematika kompleks yang berjalan secara sinkron. Ini bisa menyebabkan "jank" atau lag pada antarmuka pengguna kita.

Proses Data Fetching yang Nggak Efisien

Data fetching yang lambat atau tidak dioptimalkan juga bisa jadi penyebab. Misalnya kita melakukan request API yang terlalu banyak berurutan atau mengambil data yang terlalu besar dari server padahal cuma butuh sebagian kecil. Ini akan menambah latency dan memperlambat waktu respons aplikasi kita secara keseluruhan. Kita harus pintar pintar nih mengatur strategi pengambilan data agar lebih efisien.

Dependencies yang Sudah Usang atau Nggak Terpakai

Terkadang kita menginstal banyak library pihak ketiga tapi beberapa di antaranya mungkin sudah tidak digunakan lagi atau sudah usang. Ini bisa menambah ukuran bundle kita secara tidak perlu dan bahkan kadang menyebabkan konflik atau masalah performa lainnya. Membersihkan dependencies yang tidak terpakai adalah praktik yang bagus.

Jurus Jitu Bikin React App Ngebut Sekencang Kilat

Setelah tahu apa aja penyebabnya sekarang waktunya kita beraksi dengan berbagai jurus ampuh untuk bikin React app kita ngebut lagi. Ini bukan cuma teori lho tapi tips praktis yang bisa langsung kita terapkan dalam project kita.

Memanfaatkan Memoization Jurus Anti Re render Berlebihan

Memoization adalah teknik fundamental untuk mengoptimalkan performa React. Konsepnya sederhana kita menyimpan hasil dari komputasi yang mahal dan menggunakannya kembali jika inputnya tidak berubah. Di React kita punya beberapa hook asik yang bisa membantu kita melakukan ini.

  • React.memo untuk Komponen Fungsional Kalau kita punya komponen fungsional yang sering di re render tapi propsnya seringkali tidak berubah kita bisa membungkusnya dengan React.memo. Ini akan mencegah komponen re render jika propsnya sama seperti pada rendering sebelumnya. Pastikan props yang kita bandingkan tidak memiliki referensi yang berubah secara tidak sengaja misalnya objek atau array baru setiap render.
  • useCallback untuk Fungsi yang Dimemoized Fungsi callback yang kita kirimkan ke komponen anak juga bisa memicu re render. Dengan useCallback kita bisa memastikan bahwa fungsi tersebut hanya akan dibuat ulang jika salah satu dependenciesnya berubah. Ini sangat berguna ketika mengirimkan fungsi ke komponen yang dibungkus dengan React.memo karena akan menjaga props fungsi agar tidak berubah referensinya.
  • useMemo untuk Nilai yang Dimemoized Mirip dengan useCallback tapi useMemo digunakan untuk memoizing nilai yang merupakan hasil dari komputasi yang mahal. Misalnya kita punya operasi filter atau sort pada array yang besar. Dengan useMemo operasi ini hanya akan dijalankan ulang jika dependenciesnya berubah.

Lazy Loading dan Code Splitting Mengurangi Ukuran Bundle Awal

Untuk mengatasi ukuran bundle yang membengkak kita bisa pakai lazy loading dan code splitting. Ini adalah teknik untuk memecah bundle JavaScript kita menjadi potongan potongan kecil yang hanya diunduh saat dibutuhkan.

  • React.lazy dan Suspense untuk Komponen React.lazy memungkinkan kita untuk merender komponen secara dinamis hanya saat komponen itu dibutuhkan. Misalnya kita punya halaman admin yang jarang diakses. Kita bisa membuat komponen halaman admin itu di load secara lazy. Kemudian kita pasangkan dengan Suspense untuk menampilkan fallback UI sementara komponen tersebut sedang diunduh. Ini sangat membantu mengurangi waktu loading awal app kita karena browser tidak perlu mengunduh semua kode sekaligus.
  • Code Splitting Berdasarkan Rute atau Komponen Kita bisa mengimplementasikan code splitting berdasarkan rute menggunakan library seperti React Router dengan kombinasi React.lazy. Artinya kode untuk setiap halaman hanya akan diunduh ketika pengguna mengunjungi halaman tersebut. Kita juga bisa melakukan code splitting di level komponen di mana komponen yang kurang penting atau jarang dipakai akan di load belakangan.

Virtualisasi Daftar Panjang Data yang Berlimpah

Bayangin kita punya daftar ribuan item yang perlu ditampilkan. Kalau semua item di render bersamaan browser kita bakal kerja keras banget dan bisa bikin ngelag parah. Di sinilah virtualization datang sebagai pahlawan. Dengan virtualization atau windowing hanya item item yang terlihat di viewport saja yang di render. Seiring pengguna scroll ke atas atau ke bawah item item baru akan di render dan item yang sudah tidak terlihat akan di unmount. Library seperti react window atau react virtualized sangat populer untuk mengatasi masalah ini. Ini adalah teknik wajib kalau kita berurusan dengan daftar data yang sangat panjang.

Optimalisasi Gambar dan Aset Lainnya

Gambar dan aset media lainnya seringkali jadi penyumbang terbesar ukuran halaman. Kita harus memastikan gambar kita dioptimalkan dengan baik.

  • Kompresi Gambar Gunakan alat kompresi gambar untuk mengurangi ukuran file tanpa mengorbankan kualitas terlalu banyak.
  • Format yang Tepat Pilih format gambar yang sesuai misalnya WebP untuk gambar di web yang bisa memberikan kompresi lebih baik daripada JPEG atau PNG.
  • Responsive Images Gunakan srcset atau tag untuk menyajikan gambar dengan ukuran yang tepat sesuai perangkat pengguna.
  • Lazy Loading Gambar Terapkan lazy loading pada gambar sehingga gambar hanya akan diunduh ketika mereka masuk ke viewport.

Profiling dengan React DevTools dan Lighthouse

Gimana cara kita tahu mana bagian app yang paling lambat? Kita perlu alat bantu yaitu profiler. React DevTools adalah ekstensi browser yang wajib banget kita pakai. Dengan fitur profiler di React DevTools kita bisa melihat berapa lama waktu yang dihabiskan untuk setiap render komponen dan mengidentifikasi bottleneck. Kita bisa melihat berapa kali komponen di re render dan kenapa.

Selain itu gunakan Google Lighthouse yang ada di Chrome DevTools untuk mendapatkan laporan performa yang komprehensif. Lighthouse akan memberikan skor performa dan saran saran spesifik untuk meningkatkan kecepatan loading dan responsivitas app kita. Manfaatkan data dari kedua alat ini untuk membuat keputusan optimasi yang tepat sasaran.

Debouncing dan Throttling untuk Event Handler

Beberapa event handler seperti onScroll onMouseMove atau onResize bisa terpicu berkali kali dalam waktu singkat yang bisa menyebabkan komputasi berlebihan.

  • Debouncing Ini menunda eksekusi fungsi sampai setelah periode waktu tertentu berlalu tanpa ada pemicu baru. Contohnya pada search input kita bisa debounce fungsi pencarian sehingga API call hanya terpicu setelah pengguna berhenti mengetik selama beberapa milidetik.
  • Throttling Ini membatasi seberapa sering sebuah fungsi bisa dieksekusi dalam jangka waktu tertentu. Misalnya kita ingin menangani event scroll tapi hanya ingin memprosesnya setiap 100 milidetik sekali.

Menggunakan lodash.debounce atau lodash.throttle adalah cara yang mudah untuk mengimplementasikan ini.

Optimasi API Calls dan Manajemen State

Bagian backend dan bagaimana kita mengelola data juga punya peran besar.

  • Batching API Requests Kalau kita perlu mengambil banyak data kecil yang saling terkait coba pertimbangkan untuk menggabungkannya menjadi satu request ke backend.
  • Caching Data Gunakan teknik caching baik di sisi klien (dengan localStorage atau state management library) maupun di sisi server untuk menghindari pengambilan data yang sama berulang kali.
  • State Management yang Efisien Pilih state management solution yang tepat dan gunakan dengan bijak. Hindari menyimpan terlalu banyak state yang tidak perlu atau sering berubah di global state jika tidak semua komponen membutuhkannya. Context API atau Redux Toolkit bisa sangat membantu jika digunakan dengan benar.

Memanfaatkan Server Side Rendering SSR atau Static Site Generation SSG

Untuk aplikasi dengan kebutuhan SEO yang tinggi dan waktu loading awal yang sangat cepat kita bisa mempertimbangkan SSR atau SSG.

  • Server Side Rendering SSR Dengan SSR halaman web di render di server dan dikirimkan sebagai HTML yang sudah jadi ke browser. Ini sangat bagus untuk SEO dan First Contentful Paint FCP karena browser tidak perlu menunggu JavaScript diunduh dan dieksekusi untuk menampilkan konten awal. Framework seperti Next.js adalah pilihan terbaik untuk SSR di React.
  • Static Site Generation SSG Mirip dengan SSR tetapi halaman di render saat build time dan disajikan sebagai file HTML statis. Ini memberikan performa yang sangat cepat karena tidak ada proses rendering di server saat request datang. Cocok untuk situs yang kontennya jarang berubah. Next.js juga mendukung SSG.

Membersihkan dan Memperbarui Dependencies Secara Rutin

Jangan malas untuk memeriksa package.json kita. Hapus library yang tidak terpakai atau gantikan dengan alternatif yang lebih ringan jika memungkinkan. Selalu perbarui dependencies kita ke versi terbaru karena seringkali update membawa perbaikan performa dan keamanan. Hati hati dengan breaking changes saat update pastikan untuk membaca changelognya ya.

Minimalisir Manipulasi DOM Langsung

React dirancang untuk mengelola DOM secara efisien melalui Virtual DOMnya. Mengintervensi langsung DOM dengan document.getElementById atau querySelector dan memodifikasinya secara manual seringkali bertentangan dengan cara kerja React dan bisa menyebabkan masalah performa atau inkonsistensi UI. Selalu usahakan untuk membiarkan React yang mengelola DOM.

Penutup Mari Bikin React App Kita Juara!

Oke gengs kita sudah bahas banyak banget nih dari mulai akar masalah kenapa React app kita bisa lambat sampai berbagai jurus asik untuk bikin app kita ngebut lagi. Ingat optimasi performa itu adalah sebuah perjalanan bukan tujuan akhir. Kita perlu terus menerus memonitor menganalisis dan mengoptimalkan aplikasi kita seiring dengan perkembangan fitur dan basis kode.

Jangan takut untuk bereksperimen dan mencoba tips tips di atas. Mulai dari yang paling mudah seperti memoization dan lazy loading lalu lanjutkan ke teknik yang lebih kompleks seperti virtualization atau SSR jika memang dibutuhkan. Dengan pendekatan yang tepat dan sedikit ketekunan kita pasti bisa kok bikin React app kita jadi super ngebut dan memberikan pengalaman pengguna yang luar biasa. Selamat ngoding dan semoga React app kita semua jadi juara performanya!