ホームページ  >  記事  >  ウェブフロントエンド  >  Angular のプリロード構成と遅延ロード構成に関する簡単な説明

Angular のプリロード構成と遅延ロード構成に関する簡単な説明

青灯夜游
青灯夜游転載
2021-11-05 10:13:552347ブラウズ

この記事では、Angular のルーティング設定を理解し、プリロード設定と遅延読み込み設定について簡単に紹介します。

Angular のプリロード構成と遅延ロード構成に関する簡単な説明

NgModule は Angular モジュールのコアです。最初にそれについて説明しましょう。

1. @NgModule の役割:

  • NgModule の最も基本的な意味は、開発者がビジネス コードを整理できるようにすることです。密接に関連するコンポーネントをまとめて整理するには、NgModule を使用するのが基本です。
  • NgModule は、コンポーネント、命令、パイプなどを使用できるかどうかを制御するために使用されます。同じ NgModule 内のコンポーネントはデフォルトで相互に表示されます。外部コンポーネントの場合は、NgModule によってエクスポートされたコンテンツのみが表示されますつまり、定義した NgModule がコンテンツをエクスポートしない場合、外部ユーザーは、モジュールをインポートしたとしても、その中で定義されたコンテンツを使用できません。
  • NgModule はパッケージ化するときに使用される最小単位です。パッケージ化するとき、すべての @NgModule とルーティング設定がチェックされます。Angular の最下層は webpack を使用してパッケージ化されます。 Angular は既に Webpack を構成しているため、開発者にとっては非常に簡単です。そうでない場合は、環境を自分で構成する必要があります。
  • NgModule は Router が非同期にロードできる最小単位です Router がロードできる最小単位はコンポーネントではなくモジュールです。もちろん、モジュール内にコンポーネントを 1 つだけ配置することは許可されており、多くのコンポーネント ライブラリでこれが行われます。 [関連チュートリアルの推奨事項: "angular チュートリアル"]

2. @NgModule 構造の説明:

@NgModule({ 
  declarations: [], //属于当前模块的组件、指令及管道
  imports: [], //当前模板所依赖的项,即外部模块(包括httpModule、路由等)
  export:[],//声明出应用给其他的module使用
  providers: [], //注入服务到当前模块
  bootstrap: []//默认启动哪个组件(只有根模块才能设置bootstrap属性)
})

3. 遅延ロード命令

# (1) RouterModule オブジェクトは 2 つの静的メソッドを提供します: forRoot () および forChild() を使用してルーティング情報を構成します。

  • forRoot()//メインモジュールでメインのルーティング情報を定義します
  • forChild()``//Application in feature module (sub-module)

(2) 遅延読み込み:loadChildren

対応するモジュールはここで AppModule に追加されませんが、 loadChildren 属性は、loadChildren 属性で構成されたパスに基づいて、対応するモジュールをロードするように Angular ルーティングに指示します。これはモジュールの遅延ロード機能の具体的なアプリケーションであり、ユーザーが /xxx/** パスにアクセスすると、対応するモジュールがロードされ、アプリケーションの起動時にロードされるリソースのサイズが削減されます。 loadChildren の属性値は 3 つの部分で構成されます:

  • インポートする必要があるモジュールの相対パス
  • #Separator
  • エクスポートされたモジュールの名前class

(3) プリロード

遅延ロードを使用すると、ルートが初めてモジュールをロードするときに応答が遅れることがあります。現時点では、プリロード戦略を使用してこの問題を解決できます。

Angular は 2 つの読み込み戦略を提供します。

  • PreloadAllModules-preloading
  • NoPreloading-プリロードなし (デフォルト)。

RouterModule.forRoo() 2 番目のパラメータ は構成オプションを追加できます。構成オプションの 1 つは preloadingStrategy 構成です。この構成はプリロードポリシー設定。

//使用默认预加载-预加载全部模块
import { NgModule } from '@angular/core'; 
import { AppComponent } from './app.component'; 
import { routes } from './main.routing'; 
import { RouterModule } from '@angular/router'; 
import { PreloadAllModules } from '@angular/router'; 
@NgModule({ 
  declarations: [AppComponent], 
  imports: [ BrowserModule, RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }) ], 
  providers: [], 
  bootstrap: [AppComponent] }) 
export class AppModule { }

ただし、モジュールのプリロードを自分で制御することを好みます。この場合、プリロード戦略をカスタマイズする必要があります

A. カスタマイズ - 5 秒後にすべてのモジュールをロードします

アプリと同じレベルで新しいcustom-preloading-strategy.tsファイルを作成します。

import { Route } from '@angular/router';
import { PreloadingStrategy } from '@angular/router';
import { Observable } from 'rxjs/Rx';

export class CustomPreloadingStrategy implements PreloadingStrategy {
    preload(route: Route, fn: () => Observable<boolean>): Observable<boolean> {
        return Observable.of(true).delay(5000).flatMap((_: boolean) => fn());
    }
}

#
import { BrowserModule } from &#39;@angular/platform-browser&#39;;
import { NgModule } from &#39;@angular/core&#39;;

import { AppComponent } from &#39;./app.component&#39;;
import { HomeComponent } from &#39;./home/home.component&#39;;
import { routes } from &#39;./main.routing&#39;;
import { RouterModule } from &#39;@angular/router&#39;;
import { CustomPreloadingStrategy } from &#39;./preload&#39;;

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(routes, { preloadingStrategy:  CustomPreloadingStrategy })
  ],
  providers: [CustomPreloadingStrategy ],
  bootstrap: [AppComponent]
})
export class AppModule { }

B、カスタム指定モジュールをapp.modulesのプロバイダーに挿入します。 ts Preloading

selective-preloading-strategy.ts ファイルをアプリと同じレベルに作成します (このファイルは、プロバイダーによって app-routing.module.ts に挿入され、ルートで定義されたデータが挿入される必要があります)追加パラメータを介して渡されます) プリロードするかどうかを設定します)

import { Injectable } from &#39;@angular/core&#39;;
import { PreloadingStrategy, Route } from &#39;@angular/router&#39;;
import { Observable} from &#39;rxjs/Observable&#39;;
import &#39;rxjs/add/observable/of&#39;;
@Injectable()
export class SelectivePreloadingStrategy implements PreloadingStrategy {
  preloadedModules: string[] = [];

  preload(route: Route, load: () => Observable<any>): Observable<any> {
    if (route.data && route.data[&#39;preload&#39;]) {
      return load();
    } else {
      return Observable.of(null);
    }
  }
}

app-routing.module.ts (このファイルは遅延読み込みとプリロードを組み合わせています)

import { NgModule } from &#39;@angular/core&#39;;
import { RouterModule, Routes } from &#39;@angular/router&#39;;
import { CanDeactivateGuard } from &#39;./guard/can-deactivate-guard.service&#39;;
import { SelectivePreloadingStrategy } from &#39;./selective-preloading-strategy&#39;; // 预加载
import { PageNotFoundComponent } from &#39;./not-found.component&#39;;
const appRoutes: Routes = [
{ path: &#39;&#39;, redirectTo: &#39;home&#39;, pathMatch: &#39;full&#39;},
{ path: &#39;mian&#39;, loadChildren: &#39;./main/mian.module#MainModule&#39; }, // 懒加载(在这个层级的router配置文件及module文件都不需要引入该组建)
{ path: &#39;home&#39;, loadChildren: &#39;./home/home.module#HomeModule&#39;, data: { preload: true } }, // 懒加载 + 预加载
{ path: &#39;**&#39;, component: PageNotFoundComponent } // 注意要放到最后
];
@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes,{
      enableTracing: true, // <-- debugging purposes only
      preloadingStrategy: SelectivePreloadingStrategy // 预加载
    })
  ],
  exports: [
    RouterModule
  ],
  providers: [
    CanDeactivateGuard,
    SelectivePreloadingStrategy
  ]
})
export class AppRoutingModule { }

4. Sub -routing 作成手順 (作成手順なし、直接手動) (1) 新しいメイン フォルダーを作成します

Directory main

    main.component .html
  • main.component.scss
  • main.component.ts
  • main.module.ts
  • main-routing.module.ts
  • ##main.service.ts
  • ディレクトリ A

      A.component.html
      ##A.component.scss
      A.component.ts
      • ディレクトリB
    • B.component .html
      B.component.scss
      • ##B.component.ts
    たとえば、上記の main.component.html には、サブビューを配置するための領域があります (アイデアについては以下で説明します) (その他は詳しく説明しません)
  • <div>下面的区域是另一个路由出口</div>
    <router-outlet></router-outlet><!--此处依照下面的路由配置,默认显示AComponent组件的内容-->
(1). main-routing.module.tsのmainフォルダ配下にルーティングを設定します。コンポーネントを参照する必要があります。各コンポーネント (ルーティングを設定する必要があるコンポーネント) の

import {NgModule} from &#39;@angular/core&#39;;
import {RouterModule, Routes} from &#39;@angular/router&#39;;
import {MainComponent} from &#39;./main.component&#39;;
import{AComponent} from &#39;./A/A.component&#39;;
import{BComponent} from &#39;./B/B.component&#39;;
const mainRoute: Routes = [
  {
    path: &#39;&#39;,
    component: MainComponent,
    data: {
      title: &#39;面试预约&#39;,
    },
    children: [
      {
        path: &#39;&#39;,//path为空表示默认路由
        component: AComponent,
        data: {
          title: &#39;大活动&#39;,
        }
      },
      {
        path: &#39;activity&#39;,
        component: BComponent,
        data: {
          title: &#39;中活动&#39;,
        }
      }
    ]
  }
];


@NgModule({
  imports: [
    RouterModule.forChild(mainRoute)
  ],
  exports: [
    RouterModule
  ]
})
export class MainRoutingModule{
}

(2)、通常、main.service.ts は http リクエストを送信するために使用されます

import { AppService } from &#39;./../../app.service&#39;;
import { Observable } from &#39;rxjs/Observable&#39;;
import { Injectable } from &#39;@angular/core&#39;;
import { HttpParams } from &#39;@angular/common/http&#39;;
import { PageData, ActivitysManage } from &#39;./model/activitys-manage&#39;;
import { BehaviorSubject } from &#39;rxjs&#39;;
import {PageDataBig, ActivitySmall, PageDataSmall } from &#39;./model/activitys-manage&#39;;
@Injectable()
export class MainService {
  
}

main文件夹下的组件如要调用MainService,需要在组件的ts文件引入MainService

(3)、在main.module.ts中引入各组件(包括自身、路由配置文件所用到的所有组件以及路由的module)

import { FormsModule } from &#39;@angular/forms&#39;;
import { CommonModule } from &#39;@angular/common&#39;;
import { MainComponent } from &#39;./interview-appointment.component&#39;;
import { AComponent } from &#39;./A/A.component&#39;;
import { BComponent } from &#39;./B/B.component&#39;;
import { NgModule } from &#39;@angular/core&#39;;
import { CoreFrameCommonModule } from &#39;../../common/common.module&#39;;
import { MainRoutingModule } from &#39;./main-routing.module&#39;;
import { NgZorroAntdModule } from &#39;../../zorro/ng-zorro-antd.module&#39;;
import { MainService } from &#39;./interview-appointment.service&#39;;
@NgModule({
  imports: [FormsModule,CoreFrameCommonModule, CommonModule, MainRoutingModule,NgZorroAntdModule],
  exports: [],
  declarations: [MainComponent,AComponent,BComponent],
  providers: [MainService],
})
export class MainModule{ }

更多编程相关知识,请访问:编程视频!!

以上がAngular のプリロード構成と遅延ロード構成に関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。