1. Pengenalan Turbopack
Turbopack adalah bundler generasi baru yang dibangun dengan Rust oleh tim yang sama yang mengembangkan Webpack β Tobias Koppers, bekerja sama dengan Vercel. Turbopack dirancang untuk menggantikan Webpack dengan performa yang jauh lebih cepat berkat arsitektur incremental computation yang revolusioner.
Turbopack pertama kali diumumkan pada Oktober 2022 bersamaan dengan Next.js 13, dan saat ini sudah tersedia sebagai bundler default untuk development di Next.js 15+.
Mengapa Turbopack Dibutuhkan?
| Masalah | Webpack | Turbopack |
|---|---|---|
| Bahasa | JavaScript (single-threaded) | Rust (multi-threaded, zero-cost abstractions) |
| Incremental Build | Terbatas (caching) | Fine-grained incremental computation |
| Cold Start | Lambat (parsing JS) | Sangat cepat (native binary) |
| HMR | ~1-5 detik (proyek besar) | <100ms bahkan di proyek sangat besar |
| Bundle Size | Webpack runtime cukup besar | Minimal runtime overhead |
| Ekosistem | Sangat matang (2000+ plugins) | Berkembang, Webpack-compatible |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β EVOLUSI JAVASCRIPT BUNDLERS β β β β 2012 2015 2017 2020 2023 β β β β β β β β β βΌ βΌ βΌ βΌ βΌ β β Browserify Webpack Rollup esbuild Turbopack β β (Node.js) v1 (ES mod) (Go) (Rust) β β β β ββββββββ ββββββββ ββββββββ ββββββββ ββββββββ β β β β ββββββββ ββββββββ ββββββββ ββββββββ β β β JS β β JS β β JS β β Go β β Rust β β β β β β β β β β β β β β β β Slow β β Med β β Fast β β V.Fastβ βFastestβ β β ββββββββ ββββββββ ββββββββ ββββββββ ββββββββ β β β β Speed: 1x 2-5x 10-20x 100x+ 700x+ β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2. Arsitektur Turbopack
Turbopack menggunakan arsitektur Turbo Engine β sebuah system incremental computation yang melacak setiap fungsi dan nilai secara granular. Saat file berubah, Turbo Engine hanya menghitung ulang bagian yang terpengaruh, bukan seluruh dependency graph.
Incremental Computation
// CONTOH: Bagaimana incremental computation bekerja // Misal proyek Anda punya 10.000 file // Anda mengubah 1 file: src/components/Button.tsx // Webpack (lama): // 1. Parse ulang 10.000 file // 2. Rebuild dependency graph // 3. Re-compile semua module // 4. Generate new bundle // β Waktu: 5-30 detik // Turbopack (incremental): // 1. Deteksi Button.tsx berubah // 2. Hitung ulang HANYA Button.tsx // 3. Hitung ulang HANYA file yang import Button // 4. Generate patch untuk browser // β Waktu: <100ms // Turbo Engine melacak dependency pada level FUNCTION // bukan level FILE seperti Webpack
Task Graph
ββββββββββββββββββββββββββββββββββββββββββββββββββββ β TURBO ENGINE TASK GRAPH β β β β File: Button.tsx berubah β β β β β ββββββββββΌββββββββββ β β β Parse Button β β Task 1 β β β .tsx β β β ββββββββββ¬ββββββββββ β β β β β ββββββββββββΌβββββββββββ β β βΌ βΌ βΌ β β ββββββββββββ ββββββββββ ββββββββββββ β β βTransform β βResolve β βGenerate β β β β JSX β β importsβ β CSS β β β ββββββ¬ββββββ ββββββ¬ββββ ββββββ¬ββββββ β β β β β β β βΌ βΌ βΌ β β βββββββββββββββββββββββββββββββββββ β β β Merge & Emit HMR Patch β β β βββββββββββββββββββββββββββββββββββ β β β β Yang TIDAK dihitung ulang: β β β File lain yang tidak meng-import Button β β β File yang Button tidak import β β β CSS yang tidak berubah β β β Asset yang tidak berubah β ββββββββββββββββββββββββββββββββββββββββββββββββββββ
Multi-Threading dengan Rust
// Turbopack memanfaatkan Rust untuk: // 1. Multi-threading paralel β memproses banyak file sekaligus // 2. Zero-cost abstractions β tidak ada GC overhead // 3. Memory safety tanpa garbage collector // 4. Native compilation β binary yang sangat cepat // Arsitektur Thread Pool: // // βββββββββββββββββββββββββββββββββββββββββββ // β Main Thread (Orchestrator) β // β β’ Koordinasi task β // β β’ File watching β // β β’ HMR communication β // ββββββββββββ¬ββββββββββββ¬βββββββββββββββββββ // β β // βββββββββΌββββ ββββββΌβββββββ ββββββββββββ // β Worker 1 β β Worker 2 β β Worker N β // β β’ Parse β β β’ Parse β β β’ Parse β // β β’ Transformβ β β’ Transformβ β β’ Trans. β // β β’ Resolve β β β’ Resolve β β β’ Resolveβ // βββββββββββββ βββββββββββββ ββββββββββββ // // Setiap worker memproses file secara independen // Hasil digabungkan oleh main thread
3. Performa dan Benchmark
Turbopack menunjukkan peningkatan performa yang dramatis dibanding Webpack, terutama pada proyek besar.
Benchmark: Cold Start (Dev Server)
| Ukuran Proyek | Webpack 5 | Vite | Turbopack |
|---|---|---|---|
| Small (100 modules) | 1.5s | 0.4s | 0.3s |
| Medium (1.000 modules) | 8s | 1.2s | 0.5s |
| Large (10.000 modules) | 35s | 4.5s | 1.1s |
| XL (30.000 modules) | 120s | 12s | 2.8s |
Benchmark: HMR (Hot Module Replacement)
| Perubahan | Webpack 5 | Vite | Turbopack |
|---|---|---|---|
| Komponen kecil | 1-3s | 50-150ms | 10-30ms |
| File dengan banyak imports | 5-15s | 200-500ms | 20-80ms |
| CSS change | 2-5s | 30-100ms | 10-40ms |
| Global util change | 10-30s | 500ms-2s | 50-200ms |
Performa Turbopack semakin terasa pada proyek besar. Untuk proyek kecil (<100 files), perbedaan dengan Vite mungkin tidak terlalu signifikan. Turbopack benar-benar unggul di proyek enterprise dengan ribuan file.
4. Integrasi dengan Next.js
Turbopack saat ini terintegrasi langsung ke Next.js dan bisa diaktifkan sebagai bundler development.
Mengaktifkan Turbopack di Next.js
# Next.js 15+ β Turbopack sudah tersedia # Aktifkan dengan flag --turbopack (atau -T) # Development dengan Turbopack npx next dev --turbopack # Atau shorthand npx next dev -T # Cek apakah Turbopack aktif # Output akan menunjukkan "Turbopack" di terminal: # β² Next.js 15.x # - Local: http://localhost:3000 # - Environments: .env.local # - Turbopack: enabled β
Konfigurasi Turbopack di next.config.js
// next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
// Konfigurasi Turbopack
turbopack: {
// Resolve aliases β mirip webpack.resolve.alias
resolveAlias: {
'@components': './src/components',
'@utils': './src/utils',
'@hooks': './src/hooks',
'@styles': './src/styles'
},
// Resolve extensions
resolveExtensions: [
'.tsx', '.ts', '.jsx', '.js',
'.json', '.mjs', '.css'
]
},
// Konfigurasi umum Next.js
experimental: {
// Turbopack-specific features
turbo: {
// Loader configuration (untuk file non-standard)
loaders: {
'.md': ['@mdx-js/loader'],
'.svg': ['@svgr/webpack'],
'.glsl': ['raw-loader']
}
}
}
};
module.exports = nextConfig;
5. Konfigurasi Turbopack
Environment Variables
// Turbopack mendukung .env files secara otomatis // Urutan prioritas: // 1. .env.development.local (saat next dev) // 2. .env.local (tidak di-commit ke git) // 3. .env.development (saat next dev) // 4. .env (default) // Mengakses env di Turbopack: // process.env.VARIABLE_NAME β server-side // process.env.NEXT_PUBLIC_* β client-side (exposed) // .env.local // NEXT_PUBLIC_API_URL=https://api.example.com // DATABASE_URL=postgresql://... // SECRET_KEY=rahasia123
CSS Configuration
// next.config.js β CSS di Turbopack
const nextConfig = {
turbopack: {
rules: {
// PostCSS sudah terintegrasi otomatis
// Cukup buat postcss.config.js
// SCSS/SASS support
'*.scss': {
loaders: ['sass-loader'],
as: '*.css'
}
}
},
// CSS Modules β otomatis aktif untuk .module.css
// Tidak perlu konfigurasi tambahan
// PostCSS config β diterapkan otomatis
// Buat postcss.config.js di root proyek
};
Image Optimization
// Import gambar langsung di Turbopack
import heroImage from './hero.jpg';
import logoSvg from './logo.svg';
// Menggunakan Next.js Image component
import Image from 'next/image';
export default function Hero() {
return (
<div>
<Image
src={heroImage}
alt="Hero banner"
width={1200}
height={600}
priority
/>
<Image
src={logoSvg}
alt="Logo"
width={200}
height={50}
/>
</div>
);
}
// Supported formats:
// .jpg, .jpeg, .png, .gif, .svg, .webp, .avif, .ico
// .mp4, .webm (video)
// .woff, .woff2, .ttf, .otf (fonts)
6. Migrasi dari Webpack
Migrasi dari Webpack ke Turbopack di Next.js cukup mudah karena Turbopack mendukung sebagian besar konfigurasi Webpack secara kompatibel.
Langkah Migrasi
LANGKAH 1: Update Next.js ke versi terbaru $ npm install next@latest react@latest react-dom@latest LANGKAH 2: Cek kompatibilitas webpack config Anda - Buka next.config.js - Identifikasi custom webpack config (jika ada) - Cek apakah Turbopack sudah support fitur yang sama LANGKAH 3: Jalankan dengan Turbopack $ npx next dev --turbopack LANGKAH 4: Periksa error dan warning - Terminal akan menunjukkan fitur yang belum didukung - Perbaiki satu per satu LANGKAH 5: Migrasi webpack.config.js ke turbopack config - resolveAlias β turbopack.resolveAlias - module.rules β turbopack.rules (atau loaders) - plugins β biasanya tidak diperlukan di Turbopack LANGKAH 6: Test semua halaman dan fitur - Pastikan semua route berfungsi - Cek CSS dan styling - Cek image loading - Cek environment variables
Kompatibilitas Webpack Features
| Fitur Webpack | Status Turbopack | Alternatif |
|---|---|---|
| resolve.alias | β Didukung | turbopack.resolveAlias |
| module.rules (loaders) | β Sebagian | turbopack.loaders |
| DefinePlugin | β Otomatis | env variables |
| CSS Modules | β Didukung | Sama persis |
| PostCSS | β Didukung | postcss.config.js |
| SCSS/SASS | β Didukung | Install sass |
| Custom Webpack Plugins | β Tidak langsung | Perlu alternatif |
| webpack-bundle-analyzer | β Belum | Turbopack built-in tracing |
Jika proyek Anda sangat bergantung pada custom Webpack plugins, migrasi ke Turbopack mungkin memerlukan penyesuaian signifikan. Turbopack belum mendukung semua Webpack plugin API. Cek kompatibilitas sebelum migrasi!
7. Loaders dan Aliases
Loader Configuration
// next.config.js β Turbopack loaders
module.exports = {
experimental: {
turbo: {
loaders: {
// SVG sebagai React component
'*.svg': ['@svgr/webpack'],
// Markdown dengan MDX
'*.md': ['@mdx-js/loader'],
// GLSL shaders
'*.glsl': ['raw-loader'],
// YAML files
'*.yaml': ['yaml-loader'],
// Custom loader untuk file tertentu
'*.graphql': {
loaders: ['graphql-tag/loader'],
as: '*.js'
}
}
}
}
};
Path Aliases
// tsconfig.json β TypeScript path aliases
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"],
"@components/*": ["./src/components/*"],
"@utils/*": ["./src/utils/*"],
"@hooks/*": ["./src/hooks/*"],
"@styles/*": ["./src/styles/*"],
"@types/*": ["./src/types/*"]
}
}
}
// next.config.js β Turbopack aliases (opsional)
// Turbopack bisa membaca langsung dari tsconfig.json
module.exports = {
turbopack: {
resolveAlias: {
// Tambahkan alias yang tidak ada di tsconfig
'@lib': './src/lib',
'@config': './config'
}
}
};
// Penggunaan di kode:
import Button from '@components/Button';
import { formatRupiah } from '@utils/format';
import useAuth from '@hooks/useAuth';
8. CSS dan Asset Handling
CSS Modules
/* components/Button.module.css */
/* CSS Modules β class names di-scope secara otomatis */
.button {
padding: 0.75rem 1.5rem;
border-radius: 8px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.primary {
background: #3b82f6;
color: white;
border: none;
}
.primary:hover {
background: #2563eb;
transform: translateY(-1px);
}
.secondary {
background: transparent;
color: #3b82f6;
border: 2px solid #3b82f6;
}
.secondary:hover {
background: #3b82f6;
color: white;
}
/* Output: class names menjadi unik */
/* .Button_button__x7d2k { ... } */
/* .Button_primary__a3f9m { ... } */
// components/Button.tsx
import styles from './Button.module.css';
interface ButtonProps {
variant?: 'primary' | 'secondary';
children: React.ReactNode;
onClick?: () => void;
}
export default function Button({
variant = 'primary',
children,
onClick
}: ButtonProps) {
return (
<button
className={`${styles.button} ${styles[variant]}`}
onClick={onClick}
>
{children}
</button>
);
}
// Penggunaan:
// <Button variant="primary">Simpan</Button>
// <Button variant="secondary">Batal</Button>
9. Komparasi dengan Bundler Lain
Turbopack vs Webpack vs Vite vs esbuild
| Aspek | Turbopack | Webpack | Vite | esbuild |
|---|---|---|---|---|
| Bahasa | Rust | JavaScript | JS + esbuild | Go |
| Dev Speed | β‘ Tercepat | π Lambat | π Cepat | π Cepat |
| HMR | β‘ <100ms | 1-10s | 50-200ms | N/A (no HMR) |
| Prod Build | π‘ Berkembang | β Mature | β (Rollup) | β‘ Tercepat |
| Code Splitting | β Automatic | β Manual/Optimal | β (Rollup) | π‘ Basic |
| CSS Support | β Full | β Full | β Full | π‘ Basic |
| Ekosistem | π‘ Growing | β Massive | β Large | π‘ Growing |
| Framework | Next.js | Semua | Semua | Semua |
| Best For | Next.js apps | Legacy/Large | Modern SPA | Libraries |
Kapan Harus Menggunakan Turbopack?
β GUNAKAN Turbopack jika: - Anda menggunakan Next.js 15+ - Proyek sangat besar (10.000+ files) - HMR lambat dengan bundler saat ini - Development speed adalah prioritas utama - Proyek baru yang belum punya custom build config β JANGAN GUNAKAN Turbopack jika: - Menggunakan framework selain Next.js (misal: Nuxt, SvelteKit) - Membutuhkan plugin Webpack yang kompleks - Membutuhkan production build optimization (belum matang) - Proyek sangat bergantung pada custom webpack config - Stabilitas lebih penting daripada speed (gunakan Webpack/Vite)
10. Masa Depan Turbopack
Turbopack masih dalam pengembangan aktif. Berikut roadmap yang diumumkan oleh tim Vercel:
Roadmap Turbopack
2024 (SELESAI): β Turbopack Dev β stable di Next.js 15 β CSS Modules, PostCSS, Tailwind support β HMR yang sangat cepat β Server Components support 2025-2026 (DALAM PENGEMBANGAN): π Turbopack Build β production bundling π Improved caching (persistent disk cache) π Module Federation support π Broader framework support (beyond Next.js) FUTURE (PLANNED): π Turbopack as standalone tool π Custom plugin API π Better bundle analysis tools π Parallel compilation improvements π Support untuk library bundling GOAL AKHIR: β Turbopack menjadi bundler default untuk semua proyek β Menggantikan Webpack di ekosistem JavaScript β Menggabungkan kecepatan esbuild + fitur Webpack
Saat ini Turbopack paling optimal digunakan untuk development di Next.js. Untuk production build, Next.js masih menggunakan Webpack/Rollup secara default. Namun seiring Turbopack Build stabil, ini akan berubah.
11. Quiz Pemahaman
1. Bahasa apa yang digunakan untuk membangun Turbopack?
2. Apa konsep kunci yang membuat Turbopack sangat cepat?
3. Bagaimana cara mengaktifkan Turbopack di Next.js?
4. Siapa yang mengembangkan Turbopack?
5. Apa status Turbopack untuk production build saat ini?
Dalam tutorial ini, Anda telah mempelajari:
- Pengenalan Turbopack dan motivasi pembuatannya
- Arsitektur incremental computation dengan Turbo Engine
- Performa dan benchmark dibanding Webpack dan Vite
- Integrasi dengan Next.js dan cara mengaktifkannya
- Konfigurasi loaders, aliases, dan environment variables
- Migrasi dari Webpack ke Turbopack
- CSS Modules dan asset handling
- Komparasi dengan bundler lain
- Roadmap dan masa depan Turbopack