Angular实现预加载延迟模块的示例


Posted in Javascript onOctober 12, 2017

在使用路由延迟加载中,我们介绍了如何使用模块来拆分应用,在访问到这个模块的时候, 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 使用这个自定义策略。需要注意的是,您还需要在 prodivers 中添加这个类。以实现依赖注入。

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 { CustomPreloadingStrategy } from './preload';

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

你会看到 在 5 秒钟之后,这个功能模块被自动加载了。

Angular实现预加载延迟模块的示例

加载指定模块

我们还可以在路由中定义附加的参数来指定哪些模块进行预加载,我们使用路由定义中的 data 来提供这个附加的数据。

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

export const routes: Routes = [
  { path: '', component: HomeComponent, pathMatch: 'full' },
  { path: 'shop', loadChildren: './shop/shop.module#ShopModule', data: {preload: true} },
  { path: '**', component: HomeComponent }
];

然后,我们定义新的加载策略。

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

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 '@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 { PreloadSelectedModules } from './preload.module';

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

此时,可以看到,模块直接被预加载了。即使您点击链接,也不会再有新的请求发生。

Angular实现预加载延迟模块的示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 插件实现图片延迟加载效果代码
Feb 06 Javascript
js 中{},[]中括号,大括号使用详解
May 12 Javascript
jquery怎样实现ajax联动框(一)
Mar 08 Javascript
简单的Jquery遮罩层代码实例
Nov 14 Javascript
标题过长使用javascript按字节截取字符串
Apr 24 Javascript
浅谈javascript中的DOM方法
Jul 16 Javascript
如何防止INPUT按回车自动提交表单FORM
Dec 06 Javascript
vue.js利用Object.defineProperty实现双向绑定
Mar 09 Javascript
angular.js指令中的controller、compile与link函数的不同之处
May 10 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
Jun 28 Javascript
JavaScript 反射和属性赋值实例解析
Oct 28 Javascript
three.js利用卷积法如何实现物体描边效果
Nov 27 Javascript
使用cookie绕过验证码登录的实现代码
Oct 12 #Javascript
bootstrap可编辑下拉框jquery.editable-select
Oct 12 #jQuery
使用原生js封装的ajax实例(兼容jsonp)
Oct 12 #Javascript
vue学习之mintui picker选择器实现省市二级联动示例
Oct 12 #Javascript
jQuery中 DOM节点操作方法大全
Oct 12 #jQuery
基于es6三点运算符的使用方法(实例讲解)
Oct 12 #Javascript
浅谈JavaScript的innerWidth与innerHeight
Oct 12 #Javascript
You might like
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
mysql 性能的检查和优化方法
2009/06/21 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
浅谈vuex中store的命名空间
2019/11/08 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
python日志记录模块实例及改进
2017/02/12 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
研究生自荐信
2013/10/09 职场文书
图书室管理制度
2014/01/19 职场文书
全神贯注教学反思
2014/02/03 职场文书
安全责任书范文
2014/08/25 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
Java使用HttpClient实现文件下载
2022/08/14 Java/Android