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 相关文章推荐
浅析JavaScript中两种类型的全局对象/函数
Dec 05 Javascript
JavaScript实现获得所有兄弟节点的方法
Jul 23 Javascript
javascript实现框架高度随内容改变的方法
Jul 23 Javascript
D3.js实现柱状图的方法详解
Sep 21 Javascript
JavaScript reduce和reduceRight详解
Oct 24 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
Apr 13 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
Sep 20 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
Mar 13 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
Mar 20 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
Oct 19 Javascript
解决vue刷新页面以后丢失store的数据问题
Aug 11 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
用Zend Encode编写开发PHP程序
2006/10/09 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
php二维码生成以及下载实现
2017/09/28 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
jquery 学习笔记一
2010/04/07 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
JS中的Replace()传入函数时的用法详解
2017/09/11 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
vue 中swiper的使用教程
2018/05/22 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
python 中random模块的常用方法总结
2017/07/08 Python
Python处理中文标点符号大集合
2018/05/14 Python
通过实例学习Python Excel操作
2020/01/06 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
党支部公开承诺践诺书
2014/03/28 职场文书
大学班级计划书
2014/04/29 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
教师个人培训总结
2015/02/11 职场文书
主持稿开场白
2015/06/01 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
vue的项目如何打包上线
2022/04/13 Vue.js