Lazy Loading Modules Angular: Panduan Lengkap Optimasi Performa
Sebagai pengembang Angular, kita semua tahu bahwa performa aplikasi adalah kunci utama untuk pengalaman pengguna yang memuaskan. Salah satu teknik optimasi yang paling ampuh dan esensial di Angular adalah Lazy Loading Modules. Teknik ini memungkinkan kita untuk memuat modul aplikasi hanya ketika dibutuhkan, bukan sekaligus saat aplikasi pertama kali dimuat. Ini akan secara signifikan mengurangi ukuran bundle awal, mempercepat waktu startup aplikasi, dan pada akhirnya memberikan pengalaman yang lebih responsif bagi pengguna.
Apa itu Lazy Loading Modules?
Secara default, Angular CLI akan membundel semua modul aplikasi Anda ke dalam satu atau beberapa file JavaScript. Ketika pengguna pertama kali membuka aplikasi, seluruh kode ini akan diunduh. Ini bisa menjadi masalah besar untuk aplikasi yang kompleks dengan banyak fitur.
Lazy loading, di sisi lain, membagi aplikasi Anda menjadi beberapa modul yang lebih kecil. Modul-modul ini tidak akan dimuat sampai pengguna benar-benar mengakses bagian dari aplikasi yang memerlukan modul tersebut. Bayangkan sebuah toko: daripada membawa seluruh inventaris toko ke depan pintu, Anda hanya mengeluarkan barang yang diminta pelanggan. Itulah analogi yang tepat untuk lazy loading.
Manfaat Utama Lazy Loading:
- Ukuran Bundle Awal yang Lebih Kecil: Ini adalah keuntungan paling nyata. Dengan hanya memuat kode yang dibutuhkan di awal, ukuran file JavaScript awal yang diunduh pengguna menjadi jauh lebih kecil.
- Waktu Startup Aplikasi yang Lebih Cepat: Karena ukuran bundle awal lebih kecil, browser membutuhkan waktu lebih sedikit untuk mengunduh, mem-parsing, dan mengeksekusi kode. Ini menghasilkan pengalaman startup yang lebih cepat.
- Penggunaan Memori yang Lebih Efisien: Aplikasi yang hanya memuat modul yang aktif pada satu waktu akan menggunakan memori klien lebih sedikit.
- Pengorganisasian Kode yang Lebih Baik: Mendorong pengembang untuk memecah aplikasi menjadi modul-modul yang terorganisir dan kohesif.
Implementasi Lazy Loading di Angular
Angular CLI mempermudah implementasi lazy loading. Kunci utamanya terletak pada konfigurasi routing aplikasi Anda.
Langkah-langkah Implementasi:
-
Buat Modul Baru (jika belum ada): Jika Anda memiliki fitur yang ingin Anda lazy load, pastikan fitur tersebut berada dalam modul terpisah. Anda bisa membuat modul baru menggunakan Angular CLI:
ng generate module features/my-feature --route my-feature --module app.module.tsPerintah ini akan:
- Membuat folder
featuresjika belum ada. - Membuat modul baru bernama
MyFeatureModuledi dalamfeatures/my-feature. - Secara otomatis mengkonfigurasi routing di
app-routing.module.tsuntuk lazy loading modul ini. - Menambahkannya ke daftar
importsdiapp.module.ts(ini adalah perubahan yang perlu Anda perhatikan).
- Membuat folder
-
Konfigurasi Routing untuk Lazy Loading: Dalam file routing utama aplikasi Anda (
app-routing.module.ts), Anda akan melihat konfigurasi untuk modul yang di-lazy load. Perhatikan bagaimanaloadChildrendigunakan:import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: 'my-feature', loadChildren: () => import('./features/my-feature/my-feature.module').then(m => m.MyFeatureModule) }, // Rute lain... ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }path: 'my-feature': Ini adalah path URL yang akan memicu pemuatan modul ini.loadChildren: Ini adalah properti krusial.- Fungsi arrow
() => import('./features/my-feature/my-feature.module').then(m => m.MyFeatureModule)digunakan untuk memuat modul secara dinamis. import(...)adalah sintaks dynamic import ECMAScript standar..then(m => m.MyFeatureModule)akan menunggu promise dari impor selesai, lalu mengembalikan kelas modul (MyFeatureModule) dari objek modul yang dimuat.
- Fungsi arrow
-
Konfigurasi Routing di dalam Modul yang Di-lazy Load: Modul yang di-lazy load juga harus memiliki modul routingnya sendiri. Buat file
my-feature-routing.module.ts(atau nama serupa) di dalam folder modul Anda:import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { MyFeatureComponent } from './my-feature.component'; // Komponen utama fitur Anda const routes: Routes = [ { path: '', // Rute kosong berarti komponen ini adalah komponen utama dari fitur ini component: MyFeatureComponent }, { path: 'detail/:id', component: MyFeatureDetailComponent // Contoh komponen lain dalam fitur } // Rute lain dalam fitur ini... ]; @NgModule({ imports: [RouterModule.forChild(routes)], // Gunakan forChild di sini! exports: [RouterModule] }) export class MyFeatureRoutingModule { }RouterModule.forChild(routes): Sangat penting untuk menggunakanforChilddi sini, bukanforRoot.forChilddigunakan untuk modul anak yang diimpor ke dalam modul utama dan berisi konfigurasi routing spesifik untuk fitur tersebut.
-
Impor Modul Routing di Modul Fitur: Jangan lupa untuk mengimpor modul routing fitur Anda ke dalam modul fitur utama (
my-feature.module.ts):import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MyFeatureRoutingModule } from './my-feature-routing.module'; import { MyFeatureComponent } from './my-feature.component'; import { MyFeatureDetailComponent } from './my-feature-detail.component'; // Impor komponen lain jika ada @NgModule({ declarations: [ MyFeatureComponent, MyFeatureDetailComponent // Deklarasikan komponen lain ], imports: [ CommonModule, MyFeatureRoutingModule // Impor modul routing fitur ] }) export class MyFeatureModule { }Perhatikan bahwa kita mengimpor
MyFeatureRoutingModuleke dalamimportsdariMyFeatureModule.
Tips Praktis dan Teknik Lanjutan:
-
Group Feature Modules Logically: Jangan ragu untuk membuat beberapa modul yang di-lazy load. Group fitur-fitur yang terkait secara logis ke dalam modul yang sama. Misalnya, semua fitur yang berkaitan dengan "Manajemen Pengguna" bisa berada dalam satu modul yang di-lazy load.
-
Preloading Strategies: Angular menyediakan strategi preloading yang dapat Anda terapkan. Ini memungkinkan modul yang di-lazy load untuk dimuat di latar belakang setelah aplikasi startup selesai, sehingga siap ketika pengguna membutuhkannya. Ini memberikan keseimbangan antara lazy loading dan ketersediaan cepat.
Anda bisa mengkonfigurasikan ini di
app-routing.module.ts:import { NgModule } from '@angular/core'; import { RouterModule, Routes, PreloadAllModules } from '@angular/router'; // Impor PreloadAllModules const routes: Routes = [ // ... rute lainnya { path: 'my-feature', loadChildren: () => import('./features/my-feature/my-feature.module').then(m => m.MyFeatureModule) }, ]; @NgModule({ imports: [ RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules // Terapkan strategi preloading }) ], exports: [RouterModule] }) export class AppRoutingModule { }Angular menyediakan beberapa strategi preloading bawaan, seperti:
PreloadAllModules: Memuat semua modul yang di-lazy load di latar belakang.NoPreloading: Tidak melakukan preloading sama sekali (perilaku default tanpa konfigurasipreloadingStrategy).
Anda juga bisa membuat strategi preloading kustom Anda sendiri untuk logika yang lebih spesifik (misalnya, hanya melakukan preloading untuk modul yang paling sering digunakan).
-
Chunk Naming: Saat Angular CLI membundel aplikasi Anda, ia menghasilkan nama file chunk (misalnya,
main.js,polyfills.js,lazy-chunk-1.js,lazy-chunk-2.js). Untuk tujuan debugging dan pemeliharaan, Anda dapat memberikan nama yang lebih deskriptif untuk chunk modul yang di-lazy load. Ini dilakukan diangular.jsondi bawah bagianbuild.options:"build": { "builder": "@angular-devkit/build-angular:browser", "options": { // ... "outputHashing": "all", "namedChunks": true // Mengaktifkan nama chunk }, "configurations": { "production": { // ... "namedChunks": true // Pastikan juga aktif di production } } }Dengan
namedChunksaktif, Anda mungkin melihat nama chunk sepertifeatures-my-feature.jsalih-alihlazy-chunk-1.js. -
Menggunakan
APP_INITIALIZERuntuk Memuat Data Penting: Jika Anda memiliki data atau konfigurasi yang penting dan dibutuhkan oleh banyak modul, Anda bisa memuatnya di awal menggunakan tokenAPP_INITIALIZER. Ini bisa dilakukan sebelum modul utama diinisialisasi sepenuhnya, dan kemudian data tersebut dapat disuntikkan ke modul lain atau disimpan dalam layanan global. Ini menghindari pengulangan permintaan data di setiap modul yang membutuhkannya. -
Periksa Ukuran Bundle Anda: Gunakan alat seperti
webpack-bundle-analyzeruntuk memvisualisasikan isi bundle Anda. Ini akan membantu Anda mengidentifikasi modul mana yang paling besar dan apakah ada dependensi yang tidak perlu yang mungkin dapat dioptimalkan atau dihilangkan.Instal:
npm install --save-dev webpack-bundle-analyzerKemudian, konfigurasikan di
angular.json:"architect": { "build": { "builder": "@angular-devkit/build-angular:browser", "options": { // ... }, "configurations": { "production": { // ... "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" } ], "optimization": true, "outputHashing": "all", "sourceMap": false, "namedChunks": true, "extractLicenses": true, "vendorChunk": true, "buildOptimizer": true, "budgets": [ // Untuk melihat ukuran bundle { "type": "initial", "maximumWarning": "500kb", "maximumError": "1mb" }, { "type": "anyComponentStyle", "maximumWarning": "2kb", "maximumError": "4kb" } ], "allowedCommonJsGlobal: false", "extraWebpackConfig": "./webpack.bundle.analyzer.js" // Anda perlu membuat file ini } } } }Buat file
webpack.bundle.analyzer.js:const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; module.exports = { plugins: [ new BundleAnalyzerPlugin() ] };Jalankan
ng build --configuration production, lalu bukahttp://127.0.0.1:8080di browser Anda.
Kesimpulan
Lazy loading modules adalah teknik optimasi performa yang sangat penting dalam pengembangan aplikasi Angular. Dengan memuat modul hanya ketika dibutuhkan, Anda dapat secara drastis meningkatkan waktu startup aplikasi, mengurangi konsumsi memori, dan memberikan pengalaman pengguna yang lebih baik. Implementasi dasarnya cukup sederhana melalui konfigurasi routing, dan dengan memanfaatkan strategi preloading serta praktik terbaik lainnya, Anda dapat membawa performa aplikasi Angular Anda ke level profesional. Selalu ukur performa Anda dan gunakan alat yang tersedia untuk terus mengoptimalkan aplikasi Anda.
Berikan Rating
Komentar (0)
Silakan login untuk memberikan komentar.
Login SekarangBelum ada komentar. Jadilah yang pertama!
Kata Kunci
Pembaca (1)