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 可拖拽的窗体控件实现代码
Mar 21 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
May 24 Javascript
解析使用JS 清空File控件的路径值
Jul 08 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
Mar 19 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
jQuery DOM删除节点操作指南
Mar 03 Javascript
jquery实现移动端点击图片查看大图特效
Sep 11 Javascript
js带闹铃功能的倒计时代码
Sep 29 Javascript
js改变html的原有内容实现方法
Oct 05 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
Jan 15 Javascript
angular6开发steps步骤条组件
Jul 04 Javascript
Vue h函数的使用详解
Feb 18 Vue.js
使用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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
PHP 柱状图实现代码
2009/12/04 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
2013/03/01 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
分享jQuery封装好的一些常用操作
2016/07/28 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
小程序Request的另类用法详解
2019/08/09 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
Python生成器(Generator)详解
2015/04/13 Python
基于Python实现对PDF文件的OCR识别
2016/08/05 Python
python 公共方法汇总解析
2019/09/16 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
介绍一下代理模式(Proxy)
2014/10/17 面试题
北大研究生linux应用求职信
2013/10/29 职场文书
应届生人事助理求职信
2013/11/09 职场文书
五年级学生评语
2014/04/22 职场文书
统计专业自荐书
2014/07/06 职场文书
解放思想大讨论活动心得体会
2014/09/11 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
国博复兴之路观后感
2015/06/02 职场文书
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android