Angular實作預先載入延遲模組實例分享

小云云
發布: 2018-01-24 14:07:46
原創
1642 人瀏覽過

本文主要介紹Angular實作預先載入延遲模組的範例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。

在使用路由延遲載入中,我們介紹如何使用模組來拆分應用,在訪問到這個模組的時候, Angular 載入這個模組。但這需要一點時間。在用戶第一次點擊的時候,會有一點延遲。

我們可以透過預先載入路由來修復這個問題。路由可以在使用者與其它部分互動的時候,非同步載入延遲的模組。這可以使用戶在訪問延遲模組的時候更快地訪問。

本文將在上一個範例的基礎上,並增加預先載入的功能。

在上一節中,我們的根路由定義在 main.routing.ts,我們在 app.module.ts 中使用了根路由定義。

要注意的是,Home 元件是事先載入的。我們將在系統啟動之後渲染這個元件。

在 Angular 渲染 Home 元件之後,使用者就可以與應用程式互動了,我們可以透過簡單的配置在背景預先載入其它模組。

啟用預先載入

我們在 forRoot 函數中,提供一個預先載入的策略。


import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { routes } from './main.routing';
import { RouterModule } from '@angular/router';
import { PreloadAllModules } from '@angular/router';

@NgModule({
 declarations: [
  AppComponent,
  HomeComponent
 ],
 imports: [
  BrowserModule,
  RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
 ],
 providers: [],
 bootstrap: [AppComponent]
})
export class AppModule { }
登入後複製

這個 PreloadAllModules 策略來自 @angular/router,所以我們還需要匯入它。

自訂預先載入策略

router 套件中預先定義了兩個策略:

  1. 不預先載入NoPreloading

  2. 預先載入所有模組PreloadAllModules

#5 秒之後載入模組

但是,您可以自己定義一個客製化的策略。這比您想的要更為簡單。例如,您希望在套用初始化 5 秒之後載入其餘的模組。

您需要實作介面 PreloadingStrategy,我們定義一個 CustomPreloadingStrategy 的自訂策略類別。


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());
  }
}
登入後複製

然後,修改 app.module.ts 使用這個自訂策略。需要注意的是,您還需要在 propers 中加入這個類別。以實現依賴注入。


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 { }
登入後複製

你會看到 在 5 秒鐘之後,這個功能模組被自動載入了。

載入指定模組

我們也可以在路由中定義附加的參數來指定哪些模組進行預先加載,我們使用路由定義中的data 來提供這個附加的資料。


import { Routes } from &#39;@angular/router&#39;;
// HomeComponent this components will be eager loaded
import { HomeComponent } from &#39;./home/home.component&#39;;

export const routes: Routes = [
  { path: &#39;&#39;, component: HomeComponent, pathMatch: &#39;full&#39; },
  { path: &#39;shop&#39;, loadChildren: &#39;./shop/shop.module#ShopModule&#39;, data: {preload: true} },
  { path: &#39;**&#39;, component: HomeComponent }
];
登入後複製

然後,我們定義新的載入策略。


import { Observable } from &#39;rxjs/Rx&#39;;
import { PreloadingStrategy, Route } from &#39;@angular/router&#39;;

export class PreloadSelectedModules implements PreloadingStrategy {
  preload(route: Route, load: Function): Observable<any> {
    return route.data && route.data.preload ? load() : Observable.of(null);
  }
}
登入後複製

最後,在 app.module.ts 中使用這個策略。


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 { PreloadSelectedModules } from &#39;./preload.module&#39;;

@NgModule({
 declarations: [
  AppComponent,
  HomeComponent
 ],
 imports: [
  BrowserModule,
  RouterModule.forRoot(routes, { preloadingStrategy: PreloadSelectedModules })
 ],
 providers: [PreloadSelectedModules ],
 bootstrap: [AppComponent]
})
export class AppModule { }
登入後複製

此時,可以看到,模組直接被預先載入了。即使您點擊鏈接,也不會再有新的請求發生。

相關推薦:

##詳解Laravel如何透過預先載入最佳化Model查詢

單純使用CSS來實現預先載入的動畫效果代碼講解

JS實作圖片無序預先載入功能代碼

以上是Angular實作預先載入延遲模組實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!