Angular

Mengoptimalkan Performa Angular: Panduan Mendalam tentang Lazy Loading Modules

Lazy Loading Modules Angular: Panduan Lengkap Optimasi Performa

PPLG

PPLG

Penulis

08 May 2026
32 x dilihat

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:

  1. 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.ts
    

    Perintah ini akan:

    • Membuat folder features jika belum ada.
    • Membuat modul baru bernama MyFeatureModule di dalam features/my-feature.
    • Secara otomatis mengkonfigurasi routing di app-routing.module.ts untuk lazy loading modul ini.
    • Menambahkannya ke daftar imports di app.module.ts (ini adalah perubahan yang perlu Anda perhatikan).
  2. 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 bagaimana loadChildren digunakan:

    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.
  3. 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 menggunakan forChild di sini, bukan forRoot. forChild digunakan untuk modul anak yang diimpor ke dalam modul utama dan berisi konfigurasi routing spesifik untuk fitur tersebut.
  4. 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 MyFeatureRoutingModule ke dalam imports dari MyFeatureModule.

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 konfigurasi preloadingStrategy).

    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 di angular.json di bawah bagian build.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 namedChunks aktif, Anda mungkin melihat nama chunk seperti features-my-feature.js alih-alih lazy-chunk-1.js.

  • Menggunakan APP_INITIALIZER untuk Memuat Data Penting: Jika Anda memiliki data atau konfigurasi yang penting dan dibutuhkan oleh banyak modul, Anda bisa memuatnya di awal menggunakan token APP_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-analyzer untuk 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-analyzer
    

    Kemudian, 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 buka http://127.0.0.1:8080 di 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.

0.0

Berikan Rating

Komentar (0)

Silakan login untuk memberikan komentar.

Login Sekarang

Belum ada komentar. Jadilah yang pertama!

Pembaca (1)