Di dunia pengembangan web modern, terutama dengan aplikasi Single Page Application (SPA) yang besar, ukuran bundle JavaScript bisa membengkak drastis. Bundle yang besar akan memperlambat waktu muat awal (initial load time) website, karena browser harus mengunduh, mengurai, dan mengeksekusi semua kode sebelum pengguna dapat berinteraksi penuh. Di sinilah Code Splitting berperan sebagai teknik optimasi krusial.
Code Splitting adalah teknik untuk memecah bundle kode JavaScript menjadi beberapa bagian kecil (chunks) yang dapat dimuat secara dinamis atau sesuai permintaan. Daripada mengirimkan seluruh aplikasi ke browser pengguna sekaligus, code splitting memungkinkan Anda mengirimkan hanya kode yang benar-benar dibutuhkan untuk bagian website yang sedang dilihat pengguna, dan memuat sisanya di latar belakang atau saat diperlukan.
Mengapa Code Splitting Penting?
-
Peningkatan Kecepatan Load Time Awal: Ini adalah manfaat terbesar. Dengan hanya memuat kode yang penting di awal, waktu First Contentful Paint (FCP) dan Time to Interactive (TTI) dapat berkurang secara signifikan.
-
Penggunaan Memori Lebih Rendah: Browser tidak perlu menyimpan seluruh bundle dalam memori sekaligus.
-
Penggunaan Bandwidth Lebih Efisien: Mengurangi jumlah data yang diunduh pada initial load.
-
Peningkatan Pengalaman Pengguna (UX): Pengguna dapat mulai berinteraksi dengan aplikasi lebih cepat, menghasilkan pengalaman yang lebih mulus.
Cara Kerja Code Splitting
Code splitting dilakukan pada waktu build (build time) menggunakan bundler seperti Webpack (yang paling umum), Rollup, atau Parcel. Bundler menganalisis dependensi kode Anda dan mengidentifikasi titik-titik di mana kode dapat "dipisah" menjadi chunk terpisah.
Konsep dasarnya adalah Dynamic Imports, yang menggunakan sintaks import() (fungsi import() mengembalikan sebuah Promise). Ketika browser menemukan import(), ia akan memuat modul yang diminta secara asinkron.
Teknik Code Splitting Utama
Ada beberapa cara untuk mengimplementasikan code splitting, bergantung pada jenis aplikasi dan bundler yang Anda gunakan.
1. Route-Based Splitting (Paling Umum untuk SPA)
Ini adalah teknik code splitting yang paling populer untuk aplikasi Single Page Application (SPA). Setiap route (halaman) di aplikasi Anda dipisahkan menjadi chunk JavaScript-nya sendiri. Ketika pengguna menavigasi ke route baru, chunk yang diperlukan untuk route tersebut akan dimuat.
-
Contoh dengan React (menggunakan
JavaScriptReact.lazy()danSuspense):// src/App.js import React, { Suspense, lazy } from 'react'; import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; // Import komponen secara dinamis const Home = lazy(() => import('./pages/Home')); const About = lazy(() => import('./pages/About')); const Contact = lazy(() => import('./pages/Contact')); function App() { return ( <Router> <Suspense fallback={<div>Loading...</div>}> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> <Route path="/contact" element={<Contact />} /> </Routes> </Suspense> </Router> ); } export default App;-
React.lazy(): Memungkinkan Anda merender dynamic import sebagai komponen React biasa. -
Suspense: Komponen yang memungkinkan Anda "menunggu" komponen lazy dimuat dan menampilkan fallback UI (misalnya, spinner "Loading...") selama proses tersebut.
-
-
Contoh dengan Vue (menggunakan dynamic import di Vue Router):
JavaScript// router/index.js import { createRouter, createWebHistory } from 'vue-router'; const routes = [ { path: '/', name: 'home', component: () => import('../views/HomeView.vue') // Dynamic import }, { path: '/about', name: 'about', component: () => import('../views/AboutView.vue') // Dynamic import } ]; const router = createRouter({ history: createWebHistory(), routes, }); export default router;
2. Component-Based Splitting
Anda dapat memisahkan komponen individu yang besar dan tidak selalu diperlukan pada initial load. Ini berguna untuk komponen seperti modal, popup, carousel, atau library pihak ketiga yang jarang digunakan.
-
Contoh dengan React (
JavaScriptReact.lazy()):// src/components/MyBigModal.js (komponen yang ingin dipisah) import React from 'react'; const MyBigModal = ({ isOpen, onClose }) => { if (!isOpen) return null; return ( <div className="modal"> <h2>Modal Content</h2> <p>This is a lot of content loaded on demand.</p> <button onClick={onClose}>Close</button> </div> ); }; export default MyBigModal; // src/App.js import React, { Suspense, lazy, useState } from 'react'; const LazyMyBigModal = lazy(() => import('./components/MyBigModal')); function App() { const [showModal, setShowModal] = useState(false); return ( <div> <h1>Welcome</h1> <button onClick={() => setShowModal(true)}>Open Big Modal</button> {showModal && ( <Suspense fallback={<div>Loading Modal...</div>}> <LazyMyBigModal isOpen={showModal} onClose={() => setShowModal(false)} /> </Suspense> )} </div> ); } export default App;Dalam contoh ini,
MyBigModalhanya akan di-download dan di-parse ketikashowModalmenjaditrue.
3. Vendor Splitting
Memisahkan kode dari vendor dependencies (misalnya, library seperti React, Vue, Lodash, Moment.js) ke dalam chunk terpisah. Kode vendor cenderung jarang berubah, sehingga dapat di-cache oleh browser dalam jangka waktu yang lebih lama.
-
Ini biasanya dikonfigurasi di bundler Anda (misalnya, Webpack Configuration:
JavaScriptoptimization.splitChunks).// webpack.config.js (contoh sederhana) module.exports = { // ... optimization: { splitChunks: { chunks: 'all', // Memecah semua chunk (async dan initial) minSize: 20000, // Minimal ukuran chunk untuk dipecah maxSize: 70000, // Ukuran maksimal sebelum dipecah lagi cacheGroups: { vendor: { test: /[/]node_modules[/]/, // Kode dari node_modules name: 'vendors', chunks: 'all', priority: -10 // Prioritas lebih rendah }, default: { minChunks: 2, // Modul yang digunakan minimal 2x priority: -20, reuseExistingChunk: true // Gunakan kembali chunk yang ada } } } } };
4. Manual Splitting
Jika Anda memiliki kode spesifik yang besar dan tidak cocok dengan route atau komponen, Anda dapat secara manual menentukan titik pemisahan menggunakan import():
JavaScript
// Memuat fungsi utilitas yang besar hanya saat dibutuhkan
document.getElementById('myButton').addEventListener('click', async () => {
const { largeUtilityFunction } = await import('./utils/largeUtility.js');
largeUtilityFunction();
});
Pertimbangan Penting dalam Code Splitting
-
Network Overhead: Memecah kode menjadi terlalu banyak chunk dapat meningkatkan jumlah permintaan HTTP, yang bisa menimbulkan overhead jaringan. Temukan keseimbangan yang tepat.
-
Dukungan Browser: Pastikan browser target Anda mendukung dynamic imports (ES Modules) atau gunakan polyfill jika perlu.
-
Loading States: Berikan feedback visual kepada pengguna (misalnya, spinner atau pesan "Loading...") saat chunk sedang diunduh.
-
Preloading/Prefetching: Untuk pengalaman yang lebih baik, Anda dapat memberi tahu browser untuk preload (mengunduh di latar belakang untuk kebutuhan segera) atau prefetch (mengunduh untuk kebutuhan di masa depan) chunk yang mungkin akan dibutuhkan.
-
Di Webpack, Anda bisa menggunakan
/* webpackPrefetch: true */atau/* webpackPreload: true */sebagai komentar inline pada dynamic import.
// Prefetch akan diunduh dengan prioritas rendah const MyComponent = lazy(() => import(/* webpackPrefetch: true */ './MyComponent')); // Preload akan diunduh dengan prioritas tinggi const AdminPanel = lazy(() => import(/* webpackPreload: true */ './AdminPanel')); -
-
Implementasi di Berbagai Framework: Hampir semua framework JavaScript modern (React, Vue, Angular, Svelte) memiliki cara yang terintegrasi untuk mendukung code splitting.
Code splitting adalah teknik optimasi yang sangat efektif untuk aplikasi web yang kompleks, secara langsung berkontribusi pada peningkatan kecepatan load time dan pengalaman pengguna. Dengan memecah bundle besar menjadi chunk yang lebih kecil dan memuatnya sesuai permintaan, Anda dapat memastikan bahwa pengguna mendapatkan akses ke aplikasi Anda lebih cepat, bahkan pada koneksi yang lebih lambat. Menguasai teknik ini sangat penting dalam membangun website modern yang berkinerja tinggi.
0 Komentar
Artikel Terkait







