Ajukan pertanyaan Anda dan dapatkan ringkasan dokumen dengan merujuk halaman ini dan penyedia AI pilihan Anda
Riwayat Versi
- "`purge` dan `minify` kini bekerja di Next.js melalui `@intlayer/swc` — tidak perlu `babel.config.js`"v9.2.19/8/2026
- "Mencantumkan plugin Babel dalam urutan pipeline yang diperlukan (extract → purge → minify → optimize) pada tabel referensi"v8.12.024/6/2026
- "Menambahkan `intlayerPurgeBabelPlugin` dan `intlayerMinifyBabelPlugin` untuk Babel/Webpack; menjelaskan pipeline plugin"v8.12.07/6/2026
- "Menambahkan opsi `minify` dan `purge` ke konfigurasi build"v8.7.08/4/2026
Konten halaman ini diterjemahkan menggunakan AI.
Lihat versi terakhir dari konten aslinya dalam bahasa InggrisJika Anda memiliki ide untuk meningkatkan dokumentasi ini, silakan berkontribusi dengan mengajukan pull request di GitHub.
Tautan GitHub ke dokumentasiSalin Markdown dokumentasi ke clipboard
Optimasi Ukuran Bundle & Performa i18n
Salah satu tantangan paling umum dari solusi i18n tradisional yang bergantung pada file JSON adalah mengelola ukuran konten. Jika developer tidak secara manual memisahkan konten ke dalam berbagai namespace, sering kali pengguna akan mengunduh terjemahan untuk semua halaman dan berpotensi untuk semua bahasa hanya demi melihat satu halaman saja.
Sebagai contoh, sebuah aplikasi dengan 10 halaman yang diterjemahkan ke dalam 10 bahasa dapat menyebabkan pengguna mengunduh konten yang setara dengan 100 halaman, meskipun mereka sebenarnya hanya membutuhkan satu (halaman yang saat ini dibuka dalam bahasa yang sedang digunakan). Hal ini menyebabkan pemborosan bandwidth dan waktu pemuatan (load time) yang lebih lambat.
Intlayer menyelesaikan masalah ini melalui optimasi build-time. Ia menganalisis kode Anda untuk mendeteksi secara pasti kamus mana yang benar-benar digunakan per komponen dan hanya menyuntikkan ulang konten yang diperlukan ke dalam bundle Anda.
Daftar Isi
Analisis bundle Anda
Menganalisis bundle Anda adalah langkah pertama untuk mengidentifikasi file JSON yang "berat" dan mencari peluang code-splitting. Alat-alat ini menghasilkan treemap visual dari kode aplikasi Anda yang sudah dikompilasi, memungkinkan Anda melihat persis pustaka mana yang menghabiskan ruang paling banyak.
Vite / Rollup
Vite menggunakan Rollup di balik layar. Plugin rollup-plugin-visualizer menghasilkan file HTML interaktif yang menunjukkan ukuran setiap modul dalam graf Anda.
Salin kode ke clipboard
Salin kode ke clipboard
Next.js (Turbopack)
Untuk proyek yang menggunakan App Router dan Turbopack, Next.js menyediakan analyzer eksperimental bawaan yang tidak memerlukan dependensi ekstra.
Salin kode ke clipboard
Next.js (Webpack)
Jika Anda menggunakan bundler Webpack default di Next.js, gunakan bundle analyzer resminya. Pemicu jalannya alat ini bisa diatur menggunakan environment variable selama proses build.
Salin kode ke clipboard
Salin kode ke clipboard
Penggunaan:
Salin kode ke clipboard
Standard Webpack
Untuk Create React App (ejected), Angular, atau setup kustom Webpack, gunakan standar industri webpack-bundle-analyzer.
Salin kode ke clipboard
Salin kode ke clipboard
Bagaimana cara kerjanya
Intlayer menggunakan pendekatan per komponen (per-component). Berbeda dengan file JSON global, konten Anda didefinisikan bersamaan dengan atau di dalam komponen Anda. Selama proses build, Intlayer akan:
- Menganalisis kode Anda untuk menemukan pemanggilan
useIntlayer. - Mem-build konten kamus yang bersesuaian.
- Mengganti pemanggilan
useIntlayerdengan kode yang sudah dioptimalkan berdasarkan konfigurasi Anda.
Hal ini memastikan bahwa:
- Jika komponen tidak diimpor, kontennya tidak disertakan dalam bundle (Dead Code Elimination).
- Jika komponen dimuat secara lazy (lazy-loaded), kontennya juga dimuat secara lazy.
Referensi Plugin
Optimasi build dari Intlayer terbagi menjadi beberapa plugin terpisah yang masing-masing memiliki satu tanggung jawab saja. Memahami apa yang dilakukan oleh setiap plugin akan mencegah kebingungan saat mengonfigurasikannya.
Plugin Babel (@intlayer/babel)
Plugin-plugin ini digunakan secara langsung di dalam babel.config.js untuk setup berbasis Webpack (Next.js dengan Babel, CRA, kustom Webpack, dll).
Tabel di bawah ini mencantumkannya dalam urutan pipeline yang diperlukan (urutan yang sama seperti yang harus muncul di babel.config.js):
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Plugin | Apa yang dilakukannya |
|---|---|
intlayerExtractBabelPlugin | Memindai file .content.ts dan menulis kamus yang telah dikompilasi ke direktori .intlayer/ |
intlayerPurgeBabelPlugin | Memindai semua file source, menghapus field konten yang tidak terpakai dari file kamus .intlayer/**/*.json |
intlayerMinifyBabelPlugin | Mengganti nama kunci (keys) konten menjadi alias alfabet yang pendek (title → a) di file JSON maupun source |
intlayerOptimizeBabelPlugin | Menulis ulang useIntlayer('key') menjadi useDictionary(hash) dan menyuntikkan (injects) import kamus yang sesuai |
Urutan plugin sangat penting. Di dalambabel.config.js, plugin purge dan minify harus ditempatkan sebelum plugin optimize. Langkah optimize menggantikanuseIntlayer('key')dengan pemanggilanuseDictionary(hash)yang menyembunyikan informasi 'key' dari kamus. Informasi 'key' ini sangat diperlukan oleh tahap purge dan minify untuk mengidentifikasi field mana yang dipakai.
Setiap plugin Babel memiliki "options helper" yang berhubungan untuk membaca intlayer.config.ts Anda hanya sekali pada saat memuat konfigurasi, lalu mengembalikan nilai-nilai (values) yang sudah diselesaikan (resolved):
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Options helper | Digunakan dengan |
|---|---|
getExtractPluginOptions() | intlayerExtractBabelPlugin |
getPurgePluginOptions() | intlayerPurgeBabelPlugin |
getMinifyPluginOptions() | intlayerMinifyBabelPlugin |
getOptimizePluginOptions() | intlayerOptimizeBabelPlugin |
Plugin Vite (vite-intlayer)
Pengguna Vite tidak pernah mengonfigurasi ini secara langsung. Plugin ini terpasang secara otomatis ketika Anda memanggil withIntlayer() di dalam vite.config.ts. Flag (penanda) build.purge dan build.minify di intlayer.config.ts dapat menghidupkan/mematikan perilakunya tanpa perlu me-register plugin tambahan apa pun.
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Plugin Vite Internal | Perilaku ekuivalen |
|---|---|
| Usage analyzer | Sama seperti pass analisis (analyse) dari intlayerPurgeBabelPlugin |
| Dictionary prune | Sama seperti pass penulisan JSON dari intlayerPurgeBabelPlugin |
| Dictionary minify | Sama seperti pass penulisan JSON dari intlayerMinifyBabelPlugin |
| Babel transform | Sama seperti penggantian nama kode dari intlayerMinifyBabelPlugin + intlayerOptimizeBabelPlugin |
Plugin SWC (@intlayer/swc)
Pengguna Next.js juga tidak pernah mengonfigurasi ini secara langsung. Sejak v9.2.1, withIntlayer() di next.config.ts menjalankan seluruh pipeline — purge, minify, dan penulisan ulang import — hanya berdasarkan flag build.purge dan build.minify.
Pekerjaan dibagi menjadi dua, karena plugin Wasm SWC mentransformasi satu berkas dalam satu waktu dan tidak memiliki akses ke sistem berkas:
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Tahap | Di mana dijalankan | Apa yang dilakukan |
|---|---|---|
| Analisis penggunaan + purge/minify JSON | Node, di dalam withIntlayer() | Membaca setiap berkas sumber komponen, menulis ulang .intlayer/**/*.json, menghasilkan tabel penggantian nama |
Penulisan ulang sumber (content.title → .a) | @intlayer/swc (Wasm) | Menerapkan tabel penggantian nama pada akses properti yang sesuai di kode Anda |
Penulisan ulang import (useIntlayer → dict) | @intlayer/swc (Wasm) | Sama seperti intlayerOptimizeBabelPlugin |
Menentukan bidang mana yang tidak terpakai dan alias apa yang diterima masing-masing memerlukan status lintas berkas dan I/O berkas, sehingga separuh itu berjalan di Node; plugin SWC hanya menerima tabel hasilnya.
Setup berdasarkan Platform
Next.js
Next.js memerlukan plugin @intlayer/swc, karena Next.js menggunakan SWC untuk build. Sejak v9.2.1, satu paket ini mencakup seluruh pipeline — optimasi (penulisan ulang import), purge, dan minify.
Plugin ini tidak terpasang secara default karena plugin SWC masih berada pada tahap eksperimental untuk Next.js. Hal ini dapat berubah di masa yang akan datang.
Next.js 16.1.0 adalah versi minimum. Ini adalah rilis pertama yang dibangun di atas ABI plugin Wasm SWC yang kompatibel ke depan; rilis sebelumnya menolak plugin tersebut. withIntlayer membaca versi Next.js proyek Anda dan tidak mendaftarkan plugin sama sekali di bawah 16.1.0 — build tersebut tetap berhasil, hanya saja berjalan tanpa optimasi bundle.
Salin kode ke clipboard
Salin kode ke clipboard
Setelah dipasang, Intlayer akan mendeteksi dan menggunakan plugin ini secara otomatis.
Tahap purge dan minify (penghapusan dan penggantian nama bidang) tidak memerlukan paket tambahan maupun babel.config.js. Bungkus konfigurasi Anda dengan withIntlayer dan aktifkan flag di intlayer.config.ts:
Salin kode ke clipboard
Salin kode ke clipboard
Selama next build, withIntlayer menganalisis sumber Anda, menulis ulang kamus yang telah dikompilasi, dan meneruskan tabel penggantian nama bidang yang dihasilkan ke @intlayer/swc, yang memperbarui akses properti yang sesuai di kode Anda.
GunakanwithIntlayeryang asinkron, bukanwithIntlayerSync. Varian sinkron tidak menjalankan pipeline analisis, jadi purge dan minify tidak berpengaruh dengannya.
Purge dan minify hanya berjalan padanext build— pipeline optimasi dimatikan selamanext dev.
Keduanya juga dinonaktifkan ketika pemanggil adapter kompatibilitas dikonfigurasi (swcExtraCallers, disetel oleh paket kompatibilitas seperti@intlayer/next-intlatau@intlayer/react-i18next): titik panggilan tersebut tidak terlihat oleh penganalisis penggunaan, sehingga purge akan menghapus bidang yang masih dibaca oleh kode. Penulisan ulang import tetap aktif.
Versi sebelumnya (sebelum 9.2.1) memerlukan @intlayer/babel dan sebuah babel.config.js yang mendeklarasikan intlayerPurgeBabelPlugin dan intlayerMinifyBabelPlugin. Berkas itu tidak lagi diperlukan dan dapat dihapus.
Vite
Vite menggunakan plugin @intlayer/babel, yang disertakan sebagai dependensi dari vite-intlayer. Proses pipeline optimasi penuh — penulisan ulang import, purge, dan minify — aktif secara otomatis (default) dan tidak memerlukan tambahan setup apa pun.
Aktifkan purge dan minify dengan menetapkan flag terkait di intlayer.config.ts:
Salin kode ke clipboard
Webpack (dan Next.js dengan Babel)
Instal @intlayer/babel:
Salin kode ke clipboard
Tambahkan keempat plugin ke dalam babel.config.js secara berurutan:
Salin kode ke clipboard
Konfigurasi
Anda dapat mengontrol cara Intlayer mengoptimalkan bundle Anda menggunakan properti build di file intlayer.config.ts Anda.
Salin kode ke clipboard
Anda sangat disarankan untuk tetap menggunakan nilai default (undefined) pada pengaturanoptimizedi sebagian besar kasus.
Lihat referensi konfigurasi secara menyeluruh untuk melihat semua opsi yang tersedia: Configuration
Opsi Build
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Properti | Tipe | Default | Deskripsi |
|---|---|---|---|
optimize | boolean / undefined | undefined | Mengaktifkan tahap import rewrite (menulis ulang impor). undefined = hanya aktif di dalam build produksi. Setel ke false untuk mematikan semua opsi purge dan minify. |
minify | boolean | false | Mengganti field keys di file JSON yang sudah terkompilasi menggunakan alias pendek. Juga menulis ulang segala property access yang setara di source code Anda. Tidak akan berefek apabila optimize disetel ke false. |
purge | boolean | false | Menghapus semua field konten di file JSON yang tidak memiliki jejak pemanggilan/akses (property access) di dalam source code Anda secara statik. Tidak akan berefek apabila optimize disetel ke false. |
Minifikasi (penggantian nama kunci file/field)
Perintah build.minify tidak akan melakukan proses minifikasi file JavaScript di bundle Anda — hal itu masih dipegang oleh bundler Anda. Opsi ini difungsikan untuk memperkecil ukuran file kamus JSON dengan menggantikan kunci field buatan pengguna (user-defined keys) menjadi alias huruf abjad yang jauh lebih ringkas:
Salin kode ke clipboard
Hal ini akan berlaku sama persis pada struktur pengaksesan kode (property access) di dalam source code, jadi panggilan content.title akan berubah menjadi content.a di kode kompilasinya. Perilaku eksekusinya tetap sama 100%.
Salin kode ke clipboard
Minifikasi akan dilewati bilaoptimizedisetel menjadifalse. Ketikaeditor.enabledbernilaitrue, proses ini tetap berjalan, tetapi tanpa langkah penggantian nama field — Visual editor menyelesaikan pengeditan melaluikeyPath, sehingga nama field asli harus tetap dipertahankan.
Di Next.js, minifikasi juga dilewati ketika @intlayer/swc tidak terpasang atau tidak dapat dimuat (Next.js di bawah 16.1.0). Plugin inilah separuh yang menulis ulang akses di kode sumber, sehingga mengganti nama kamus tanpa plugin tersebut akan membuat kode Anda membaca nama bidang yang sudah tidak ada.
Proses minifikasi ini juga akan dihiraukan jika file kamus dipanggil lewat importMode: 'fetch' karena file JSON tersebut dikirim dari API terpencil menggunakan nama struktur kunci originalnya. Apabila client mencoba melakukan minifikasi maka jembatan kontrak server/client akan rusak.
Purging (penghapusan field konten tak terpakai)
Fungsi build.purge digunakan untuk menyeleksi mana saja field di dalam konten Anda yang diakses langsung oleh source code. Seluruh data konten lain akan langsung dibersihkan dan dihapus dari kumpulan data kamus JSON.
Salin kode ke clipboard
Contoh: Ada sebuah kamus dengan lima field, namun hanya dua yang digunakan:
Salin kode ke clipboard
Purge akan dilewati ketikaoptimizebernilaifalse. Proses ini tetap aktif ketikaeditor.enabledbernilaitrue— field yang telah dipangkas tidak dibaca oleh komponen mana pun, sehingga editor tidak akan pernah merendernya. Di Next.js, ia juga dilewati ketika@intlayer/swctidak tersedia dan ketika pemanggil adapter kompatibilitas dikonfigurasi.
Secara konservatif, proses purge tidak akan dilaksanakan jika file asal (source file) gagal dipindai, atau pemanggilan useIntlayer disimpan di variabel untuk lalu disebarluaskan di mana proses pindaian statik tak mampu melacak jejaknya (contoh lewat spread function atau pengiriman prop secara untuh). Jika skenario ini terjadi, file kamus tak akan disentuh.
Mode Import
Bagi aplikasi dengan skala besar dan memiliki banyak sekali jumlah halaman juga jumlah terjemahan, file JSON terkadang memakan bagian yang amat substansial di bundle Anda. Menggunakan opsi importMode dapat mengatur secara fleksibel strategi pendistribusian file kamus.
Pengaturan Global
Metode pemanggilan importMode bisa dikonfigurasi melalui scope global via file intlayer.config.ts.
Salin kode ke clipboard
Definisi spesifik (Per-dictionary)
Anda juga bisa melakukan pengeditan secara individu dengan mencabut pengaturan global untuk diganti secara lekat (override) langsung via properti .content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5|md|mdx|yaml|yml}}.
Salin kode ke clipboard
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Properti | Tipe | Default | Deskripsi |
|---|---|---|---|
importMode | 'static', 'dynamic', 'fetch' | 'static' | Deprecated (Kedaluwarsa): Silakan gunakan dictionary.importMode. Opsi untuk memilih cara pendistribusian. |
Properti importMode akan langsung berdampak pada metode penanaman konten aplikasi Anda. Konfigurasi ini bisa didefinisikan lewat intlayer.config.ts pada objek dictionary (secara luas) atau ditargetkan pada file kamus individu via berkas .content.ts.
1. Mode Static (Static Mode - default)
Dengan metode ini, Intlayer akan mengganti tulisan useIntlayer menjadi useDictionary lalu melakukan penanaman langsung semua data konten tersebut secara murni tanpa jeda ke dalam bundle aplikasi.
- Kelebihan (Pros): Rendersi secara instan (synchronous), nol jaringan interupsi saat proses hidrasi (hydration).
- Kekurangan (Cons): Bundle Anda akan menyimpan paket bahasa utuh di komponen tersebut sepenuhnya.
- Peruntukan (Best for): Single Page Applications (SPA).
Contoh kode usai transformasi:
Salin kode ke clipboard
2. Mode Dinamis (Dynamic Mode)
Lewat fungsi dynamic, Intlayer me-rewrite instruksi useIntlayer memakai useDictionaryAsync. Konsepnya menyalin sistem kerja import() (hampir sama seperti React Suspense), ini menjamin setiap file dictionary JSON hanya akan dijalankan berdasar rute letak wilayah spesifik Anda berada (locale).
- Kelebihan (Pros): Penerapan locale-level tree shaking. Pengguna yang membuka tampilan bahasa Inggris akan men-download file bahasa Inggrisnya saja tanpa membawa konten bahasa Indonesianya. File Bahasa Indonesia tidak akan dimuat.
- Kekurangan (Cons): Menyisipkan satu pemanggilan aset (asset fetch/jaringan ekstra) di kala hidrasi komponen berjalan.
- Peruntukan (Best for): Blog atau teks naratif artikel besar, aplikasi berat dan masif yang butuh penanganan optimasi total pada bobot bundle file.
Contoh kode usai transformasi:
Salin kode ke clipboard
Catatan: ApabilaimportMode: 'dynamic'diaplikasikan pada 100 tempat penggunaanuseIntlayerdi sebuah halamannya secara terpisah, hal itu dapat menimbulkan "waterfall" di mana browser memicu 100 pendistribusian network secara parsial. Solusinya, Anda dapat mengelompokkan panggilan dictionary itu di bawah satu nama (dengan me-mergenya jadi satu kelompok besar) ketimbang membaginya menjadi objek komponen terkecil demi keseimbangan loading time Anda.
3. Mode Fetch (Fetch Mode)
Sifat eksekusinya sama persis seperti fungsi Dinamis (Dynamic) namun bedanya metode ini mengumpulkan aset datanya via penarikan melalui API Intlayer Live Sync. Jikalau rute pemanggilan datanya gagal atau memang fiturnya diposisikan mati, program akan me-refresh kondisinya menggunakan teknik dynamic import standar.
Contoh kode usai transformasi:
Salin kode ke clipboard
Lihat panduan CMS untuk petunjuk spesifikasinya: CMS
Di dalam mode fetch, purge dan minify tak bisa dilaksanakan disebabkan file JSON Anda dipanggil menggunakan API cloud dengan spesifikasi original names (namanya tetap dipertahankan murni).
Kesimpulan: Static vs Dinamis (Dynamic)
Buka tabel dalam modal untuk melihat semua isi data dengan jelas
| Fitur | Mode Static (Statis) | Mode Dinamis (Dynamic) |
|---|---|---|
| Ukuran Bundle JS | Lebih besar (berisi utuh seisi bahasa komponennya) | Amat kecil (murni skrip, tiada data) |
| Loading Awal (Init) | Cepat (Lengkap sepaket dengan bundle) | Butuh jeda kecil (harus me-load JSON) |
| Ketergantungan Network | 0 penarikan tambahan (bebas jaringan) | 1 penarikan per satuan key dictionary |
| Pemotongan file (Tree Shaking) | Hanya di ranah komponen | Menyortir per komponen + wilayah lokal |
| Skema Target Terbaik | Tombol navigasi (UI), Situs SPA Kecil | Artikel berat/banyak, Beragam terjemahan |
