ऐंगुलर में रूट-लेवल कोड का बंटवारा

रूट-लेवल पर कोड को बांटने की सुविधा का इस्तेमाल करके, अपने ऐप्लिकेशन की परफ़ॉर्मेंस बेहतर बनाएं!

इस पोस्ट में, किसी Angular ऐप्लिकेशन में रूट-लेवल पर कोड को बांटने की सुविधा को सेट अप करने का तरीका बताया गया है. इससे JavaScript बंडल का साइज़ कम हो सकता है और इंटरैक्टिव में लगने वाला समय बेहतर हो सकता है.

GitHub पर दिए गए इस लेख में दिए गए कोड सैंपल. eager रूटिंग का उदाहरण eager शाखा में उपलब्ध है. रूट-लेवल पर कोड को बांटने का उदाहरण, लेज़ी ब्रांच में है.

कोड को बांटना क्यों ज़रूरी है

वेब ऐप्लिकेशन की बढ़ती जटिलता की वजह से, उपयोगकर्ताओं के लिए JavaScript भेजने की संख्या में काफ़ी बढ़ोतरी हुई है. बड़ी JavaScript फ़ाइलों से इंटरैक्टिविटी में देरी हो सकती है, इसलिए खास तौर पर मोबाइल पर यह एक महंगा संसाधन हो सकता है.

अपने ऐप्लिकेशन में सुविधाओं को छोड़े बिना JavaScript बंडल को छोटा करने का सबसे असरदार तरीका है, असरदार कोड स्प्लिटिंग लागू करना.

कोड को अलग-अलग हिस्सों में बांटने की मदद से, अपने ऐप्लिकेशन के JavaScript को अलग-अलग रूट या सुविधाओं से जुड़े कई हिस्सों में बांटा जा सकता है. यह तरीका उपयोगकर्ताओं को ऐप्लिकेशन लोड होने के शुरुआती समय में ही ज़रूरी JavaScript भेजता है. इससे, लोड होने में लगने वाला समय कम रहता है.

कोड को बांटने की तकनीकें

कोड को दो लेवल पर बांटा जा सकता है: कॉम्पोनेंट लेवल और रूट लेवल.

  • कॉम्पोनेंट-लेवल पर कोड को स्प्लिट करने में, कॉम्पोनेंट को उनके अपने JavaScript हिस्सों में ले जाया जाता है और ज़रूरत पड़ने पर उन्हें लेज़ी तरीके से लोड किया जाता है.
  • रूट-लेवल पर कोड को बांटने में, आप हर रूट के फ़ंक्शन को एक अलग हिस्से में इकट्ठा करते हैं. जब उपयोगकर्ता आपके ऐप्लिकेशन पर नेविगेट करते हैं, तो वे अलग-अलग रूट से जुड़े डेटा इकट्ठा करते हैं. साथ ही, ज़रूरत पड़ने पर उन्हें इससे जुड़े फ़ंक्शन मिलते हैं.

इस पोस्ट में, Angular में रूट लेवल को बांटने की सुविधा सेट अप करने पर फ़ोकस किया गया है.

ऐप्लिकेशन का नमूना

Angular में रूट लेवल कोड को बांटने की सुविधा इस्तेमाल करने से पहले, आइए एक सैंपल ऐप्लिकेशन देखते हैं:

ऐप्लिकेशन के मॉड्यूल लागू होने की जांच करें. AppModule में दो रास्ते बताए गए हैं: HomeComponent से जुड़ा डिफ़ॉल्ट रास्ता और NyanComponent से जुड़ा एक nyan रास्ता:

@NgModule({
  ...
  imports: [
    BrowserModule,
    RouterModule.forRoot([
      {
        path: '',
        component: HomeComponent,
        pathMatch: 'full'
      },
      {
        path: 'nyan',
        component: NyanComponent
      }
    ])
  ],
  ...
})
export class AppModule {}

रूट-लेवल के कोड को बांटना

कोड को बांटने की सुविधा सेट अप करने के लिए, nyan ईगर रूट को फिर से इस्तेमाल करना होगा.

Angular सीएलआई के वर्शन 8.1.0 में, इस निर्देश की मदद से हर काम किया जा सकता है:

ng g module nyan --module app --route nyan

यह जनरेट करेगा: - NyanModule नाम का एक नया रूटिंग मॉड्यूल - AppModule में एक रूट, जिसे nyan कहा जाता है, जो डाइनैमिक रूप से NyanModule को लोड करेगा - NyanModule में एक डिफ़ॉल्ट रूट - NyanComponent नाम का कॉम्पोनेंट, जो उपयोगकर्ता के डिफ़ॉल्ट रूट पर जाने पर रेंडर होगा

आइए मैन्युअल रूप से इन चरणों को देखते हैं, ताकि हमें Angular की मदद से कोड को बांटने की प्रोसेस को बेहतर तरीके से समझने में आसानी हो!

जब उपयोगकर्ता nyan रूट पर नेविगेट करता है, तब राऊटर, राऊटर के आउटलेट में NyanComponent को रेंडर करेगा.

Angular में रूट-लेवल कोड को स्प्लिट करने की सुविधा इस्तेमाल करने के लिए, रूट के एलान की loadChildren प्रॉपर्टी सेट करें और उसे डाइनैमिक इंपोर्ट के साथ जोड़ें:

{
  path: 'nyan',
  loadChildren: () => import('./nyan/nyan.module').then(m => m.NyanModule)
}

ईगर रूट और दो मुख्य अंतर हैं:

  1. आपने component के बजाय loadChildren को सेट किया है. रूट-लेवल पर कोड को स्प्लिट करने की सुविधा का इस्तेमाल करते समय, आपको कॉम्पोनेंट के बजाय, डाइनैमिक तरीके से लोड होने वाले मॉड्यूल का इस्तेमाल करना होगा.
  2. loadChildren में, प्रॉमिस रिज़ॉल्व होने पर, NyanComponent पर ले जाने के बजाय NyanModule दिखाया जाता है.

ऊपर दिए गए स्निपेट से पता चलता है कि जब उपयोगकर्ता nyan पर जाता है, तो Angular को nyan डायरेक्ट्री से nyan.module को डाइनैमिक तौर पर लोड करना चाहिए. साथ ही, मॉड्यूल में बताए गए डिफ़ॉल्ट रूट से जुड़े कॉम्पोनेंट को रेंडर करना चाहिए.

इस एलान का इस्तेमाल करके, डिफ़ॉल्ट रूट को किसी कॉम्पोनेंट के साथ जोड़ा जा सकता है:

import { NgModule } from '@angular/core';
import { NyanComponent } from './nyan.component';
import { RouterModule } from '@angular/router';

@NgModule({
  declarations: [NyanComponent],
  imports: [
    RouterModule.forChild([{
      path: '',
      pathMatch: 'full',
      component: NyanComponent
    }])
  ]
})
export class NyanModule {}

जब उपयोगकर्ता https://example.com/nyan पर जाता है, तब यह कोड NyanComponent को रेंडर करता है.

यह देखने के लिए कि Angular राऊटर आपके आस-पास के डिवाइस में, nyan.module लेज़ीली डाउनलोड को डाउनलोड करता है या नहीं:

  1. DevTools खोलने के लिए, `Control+Shift+J` (या Mac पर `Command+Option+J`) दबाएं.
  2. नेटवर्क टैब पर क्लिक करें.

  3. सैंपल ऐप्लिकेशन में NYAN पर क्लिक करें.

  4. ध्यान दें कि nyan-nyan-module.js फ़ाइल, नेटवर्क टैब में दिखती है.

रूट-लेवल पर कोड को बांटने की सुविधा के साथ JavaScript बंडल की लेज़ी-लोडिंग

GitHub पर यह उदाहरण देखें.

स्पिनर दिखाएं

फ़िलहाल, जब कोई उपयोगकर्ता NYAN बटन पर क्लिक करता है, तो ऐप्लिकेशन यह नहीं बताता कि वह बैकग्राउंड में JavaScript लोड कर रहा है. स्क्रिप्ट लोड करते समय उपयोगकर्ता को सुझाव देने के लिए, आपको स्पिनर जोड़ा जा सकता है.

ऐसा करने के लिए, app.component.html में router-outlet एलिमेंट में इंंडिकेटर के लिए मार्कअप जोड़कर शुरुआत करें:

<router-outlet>
  <span class="loader" *ngIf="loading"></span>
</router-outlet>

इसके बाद, रूटिंग इवेंट को मैनेज करने के लिए, AppComponent क्लास जोड़ें. यह क्लास RouteConfigLoadStart इवेंट सुनने पर loading फ़्लैग को true पर सेट करेगी और RouteConfigLoadEnd इवेंट सुनाई देने पर फ़्लैग को false पर सेट कर देगी.

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  loading: boolean;
  constructor(router: Router) {
    this.loading = false;
    router.events.subscribe(
      (event: RouterEvent): void => {
        if (event instanceof NavigationStart) {
          this.loading = true;
        } else if (event instanceof NavigationEnd) {
          this.loading = false;
        }
      }
    );
  }
}

नीचे दिए गए उदाहरण में हमने एक आर्टिफ़िशियल 500 मि॰से॰ के इंतज़ार का समय पेश किया है, ताकि आप स्पिनर को काम करते हुए देख सकें.

नतीजा

रूट-लेवल पर कोड को बांटने की सुविधा लागू करके, अपने Angular ऐप्लिकेशन के बंडल साइज़ को छोटा किया जा सकता है:

  1. डाइनैमिक रूप से लोड होने वाले रूट को अपने-आप स्केल करने के लिए, एंगुलर सीएलआई लेज़ी-लोडेड मॉड्यूल जनरेटर का इस्तेमाल करें.
  2. जब उपयोगकर्ता लेज़ी रास्ते पर नेविगेट करता है, तब पेज लोड होने की जानकारी देने वाला इंडिकेटर जोड़ें. इससे यह पता चलेगा कि कोई कार्रवाई चल रही है.