angular モジュールを遅延ロードし、ルーティングせずにモジュール内で宣言されたコンポーネントを動的に作成するにはどうすればよいですか?次の記事でその方法を紹介しますので、ご参考になれば幸いです!
環境: Angular 13.x.x
Angular は、ルーティングによる特定のページ モジュールの遅延読み込みをサポートしています。最初の削減が達成されました。 . 画面サイズは、最初の画面の読み込み速度を向上させるために使用されますが、このルーティング方法ではニーズを満たせない場合があります。 [関連チュートリアルの推奨事項: "angularjs ビデオ チュートリアル "]
たとえば、ボタンをクリックすると、ツールバーの行が表示されます。このツールバー コンポーネントをパッケージ化したくないです。デフォルトでは main.js
に追加されますが、コンポーネントは動的にロードされ、ユーザーがボタンをクリックした後に表示されます。
では、なぜ動的にロードする必要があるのでしょうか? ツールバー コンポーネントが導入されている場合ターゲット ページ コンポーネントに直接追加すると、ツールバー コンポーネントのコードがターゲット ページ コンポーネントが配置されているモジュールにパッケージ化されます。これにより、ターゲット ページ コンポーネントが配置されているモジュールによって生成される js のサイズが大きくなります。 ; 動的な遅延読み込みにより、ユーザーがボタンをクリックした後にのみツールバー コンポーネントを読み込むことができます。このようにして、最初の画面のサイズを縮小するという目的を達成できます。 angular プロジェクトを作成し、新しい
ToolbarModule を作成します。プロジェクトのディレクトリ構造は図
の HTML テンプレートに約 1 メートルの Base64 画像を配置し、それを AppModule
ToolbarModule
で直接引用して、ng を実行しました。 build
を実行すると、実行結果は図
## のようになり、パッケージング サイズが
ToolbarModule を削除します。
AppModule の
imports 宣言から取得し、ユーザーが表示する最初のクリック時にツールバー コンポーネントを遅延読み込みします。
ツールバー コンポーネントの遅延読み込み
ToolbarComponent を作成し、
ToolbarModule で ToolbarComponent
を宣言します
import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { ToolbarComponent } from './toolbar.component'; @NgModule({ declarations: [ToolbarComponent], imports: [CommonModule], exports: [ToolbarComponent], }) class ToolbarModule {} export { ToolbarComponent, ToolbarModule };
import { Component, OnInit } from '@angular/core'; @Component({ selector: 'toolbar', templateUrl: './toolbar.component.html', styles: [ ` svg { width: 64px; height: 64px; } Angular でのモジュールの遅延読み込みとそのコンポーネントの動的表示について話しましょう { width: 64px; height: 64px; object-fit: cover; } `, ], }) export class ToolbarComponent implements OnInit { constructor() {} ngOnInit(): void {} }
<p class="flex"> <svg t="1652618923451" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2104" width="200" height="200"><path d="M412 618m-348 0a348 348 0 1 0 696 0 348 348 0 1 0-696 0Z" fill="#C9F4EB" p-id="2105"></path><path d="M673.19 393h-333a25 25 0 0 1 0-50h333a25 25 0 0 1 0 50zM600.89 235H423.11C367.91 235 323 190.28 323 135.32v-12.5a25 25 0 0 1 50 0v12.5c0 27.39 22.48 49.68 50.11 49.68h177.78c27.63 0 50.11-22.29 50.11-49.68v-16.5a25 25 0 1 1 50 0v16.5c0 54.96-44.91 99.68-100.11 99.68zM673.19 585.5h-333a25 25 0 0 1 0-50h333a25 25 0 0 1 0 50zM467 778H340a25 25 0 0 1 0-50h127a25 25 0 0 1 0 50z" fill="#087E6A" p-id="2106"></path><path d="M739.76 952H273.62a125.14 125.14 0 0 1-125-125V197a125.14 125.14 0 0 1 125-125h466.14a125.14 125.14 0 0 1 125 125v630a125.14 125.14 0 0 1-125 125zM273.62 122a75.08 75.08 0 0 0-75 75v630a75.08 75.08 0 0 0 75 75h466.14a75.08 75.08 0 0 0 75-75V197a75.08 75.08 0 0 0-75-75z" fill="#087E6A" p-id="2107"></path></svg> <svg t="1652618941842" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2247" width="200" height="200"> <path d="M415 624m-348 0a348 348 0 1 0 696 0 348 348 0 1 0-696 0Z" fill="#C9F4EB" p-id="2248"></path> <path d="M695 790H362a25 25 0 0 1 0-50h333a25 25 0 0 1 0 50zM583 649H362a25 25 0 0 1 0-50h221a25 25 0 0 1 0 50zM262 287H129a25 25 0 0 1 0-50h133a25 25 0 0 1 0 50zM262 455.33H129a25 25 0 1 1 0-50h133a25 25 0 0 1 0 50zM262 623.67H129a25 25 0 0 1 0-50h133a25 25 0 0 1 0 50zM262 792H129a25 25 0 0 1 0-50h133a25 25 0 0 1 0 50z" fill="#087E6A" p-id="2249"></path> <path d="M761.76 964H295.62a125.14 125.14 0 0 1-125-125V209a125.14 125.14 0 0 1 125-125h466.14a125.14 125.14 0 0 1 125 125v630a125.14 125.14 0 0 1-125 125zM295.62 134a75.09 75.09 0 0 0-75 75v630a75.08 75.08 0 0 0 75 75h466.14a75.08 75.08 0 0 0 75-75V209a75.09 75.09 0 0 0-75-75z" fill="#087E6A" p-id="2250"></path> <path d="M617 376H443a25 25 0 0 1 0-50h174a25 25 0 0 1 0 50z" fill="#087E6A" p-id="2251"></path> <path d="M530 463a25 25 0 0 1-25-25V264a25 25 0 0 1 50 0v174a25 25 0 0 1-25 25z" fill="#087E6A" p-id="2252"></path> </svg> <Angular でのモジュールの遅延読み込みとそのコンポーネントの動的表示について話しましょう src="<这里应该是一张大小将近1M的base64图片, 内容较大, 就略去了...>" alt=""> </p>
app.component.ts
import { Component, createNgModuleRef, Injector, ViewChild, ViewContainerRef } from '@angular/core'; @Component({ selector: 'root', template: ` <p class="container h-screen flex items-center flex-col w-100 justify-center"> <p class="mb-3" [ngClass]="{ hidden: !isToolbarVisible }"> <ng-container #toolbar></ng-container> </p> <p> <button (click)="toggleToolbarVisibility()" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">{{ isToolbarVisible ? '隐藏' : '显示' }}</button> <p class="mt-3">首屏内容</p> </p> </p> `, }) export class AppComponent { title = 'ngx-lazy-load-demo'; toolbarLoaded = false; isToolbarVisible = false; @ViewChild('toolbar', { read: ViewContainerRef }) toolbarViewRef!: ViewContainerRef; constructor(private _injector: Injector) {} toggleToolbarVisibility() { this.isToolbarVisible = !this.isToolbarVisible; this.loadToolbarModule().then(); } private async loadToolbarModule() { if (this.toolbarLoaded) return; this.toolbarLoaded = true; const { ToolbarModule, ToolbarComponent } = await import('./toolbar/toolbar.module'); const moduleRef = createNgModuleRef(ToolbarModule, this._injector); const { injector } = moduleRef; const componentRef = this.toolbarViewRef.createComponent(ToolbarComponent, { injector, ngModuleRef: moduleRef, }); } }
toolbar.module.ts にモジュールをインポートし、# を呼び出します##createNgModuleRef
そして、現在のコンポーネントの Injector
を ToolbarModule
の親 Injector
として渡し、ToolbarModule## をインスタンス化します。 #get
moduleRef オブジェクト、最後に HTML テンプレートで宣言された
ViewContainerRef オブジェクトの
。createComponent メソッドは
ToolbarComponent コンポーネント
を作成します。
private async loadToolbarModule() { if (this.toolbarLoaded) return; this.toolbarLoaded = true; const { ToolbarModule, ToolbarComponent } = await import('./toolbar/toolbar.module'); const moduleRef = createNgModuleRef(ToolbarModule, this._injector); const { injector } = moduleRef; const componentRef = this.toolbarViewRef.createComponent(ToolbarComponent, { injector, ngModuleRef: moduleRef, }); }
今回は、
ng build
最初の画面で、実行後のパッケージのサイズを見てみましょう。その理由は、ToolbarModule
と # が
と
ToolbarModule は別の js ファイル (Lazy Chunk Files) にインポートされます。
Display ボタンが初めてクリックされると、
を含むこのパッケージがロードされます。 ## の js ファイル次の gif デモに注目してください。初めて
show
ボタンをクリックすると、追加のペア src_app_toolbar_toolbar_module_ts.js# が表示されます。 ##ファイル リクエスト
プログラミング関連の知識の詳細については、
をご覧ください。 !
以上がAngular でのモジュールの遅延読み込みとそのコンポーネントの動的表示について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。