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 相关文章推荐
window.location.hash 使用说明
Nov 08 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
Jan 06 Javascript
JS操作CSS随机改变网页背景实现思路
Mar 10 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
Aug 15 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
Mar 21 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 Javascript
JavaScript面试题(指针、帽子和女朋友)
Nov 23 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
Oct 26 jQuery
angularjs结合html5实现拖拽功能
Jun 25 Javascript
Vue中对拿到的数据进行A-Z排序的实例
Sep 25 Javascript
微信小程序动画(Animation)的实现及执行步骤
Oct 28 Javascript
JS实现分页导航效果
Feb 19 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
解析php中array_merge与array+array的区别
2013/06/21 PHP
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
php发送与接收流文件的方法
2015/02/11 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
2018/10/15 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
菜鸟javascript基础资料整理2
2010/12/06 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
js里面的变量范围分享
2020/07/18 Javascript
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
Python Web框架Tornado运行和部署
2020/10/19 Python
详解Python的Lambda函数与排序
2016/10/25 Python
python 根据pid杀死相应进程的方法
2017/01/16 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
浙江文明网签名寄语
2014/01/18 职场文书
教师专业自荐信
2014/05/31 职场文书
运动会加油稿20字
2014/11/15 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python