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字母大小写转换的4个函数详解
May 09 Javascript
JavaScript原生对象之String对象的属性和方法详解
Mar 13 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
Aug 10 Javascript
基于javascript制作微博发布栏效果
Apr 04 Javascript
jQuery实现的模拟弹出窗口功能示例
Nov 24 Javascript
jQuery自定义插件详解及实例代码
Dec 29 Javascript
Angular实现下拉框模糊查询功能示例
Jan 03 Javascript
vue的toast弹窗组件实例详解
May 14 Javascript
vue组件之间通信实例总结(点赞功能)
Dec 05 Javascript
vue动态绘制四分之三圆环图效果
Sep 03 Javascript
JS如何在数组指定位置插入元素
Mar 10 Javascript
nginx部署多个vue项目的方法示例
Sep 06 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
mayfish 数据入库验证代码
2010/04/30 PHP
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
优化PHP代码技巧的小结
2013/06/02 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
PHP实现文件上传与下载
2020/08/28 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
js中各浏览器中鼠标按键值的差异
2011/04/07 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
jquery中常用的函数和属性详细解析
2014/03/07 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
jQuery中next方法用法实例
2015/04/24 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
JS hashMap实例详解
2016/05/26 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
python函数map()和partial()的知识点总结
2020/05/26 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
快速了解Python开发环境Spyder
2020/06/29 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
Java语言程序设计测试题改错题部分
2014/07/22 面试题
最新创业融资计划书
2014/01/19 职场文书
《夜晚的实验》教学反思
2014/02/19 职场文书
村干部培训班主持词
2014/03/28 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
工作岗位职责范本
2015/02/15 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
python3操作redis实现List列表实例
2021/08/04 Python
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang
MySQL添加索引特点及优化问题
2022/07/23 MySQL