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的一些看法
May 27 Javascript
js实现的类似于asp数据字典的数据类型代码实例
Sep 03 Javascript
jQuery判断数组是否包含了指定的元素
Mar 10 Javascript
jquery实现简单的自动播放幻灯片效果
Jun 13 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
Aug 24 Javascript
js实现继承的5种方式
Dec 01 Javascript
值得分享的bootstrap table实例
Sep 22 Javascript
AngularJS $http模块POST请求实现
Apr 08 Javascript
关于预加载InstantClick的问题解决方法
Sep 12 Javascript
通过实例了解JS 连续赋值
Sep 24 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
Nov 12 Javascript
vue 实现动态路由的方法
Jul 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
BBS(php &amp; mysql)完整版(五)
2006/10/09 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
Prototype Array对象 学习
2009/07/19 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
js与运算符和或运算符的妙用
2014/02/14 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
BootStrap selectpicker
2016/06/20 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
Python函数嵌套实例
2014/09/23 Python
Python自动扫雷实现方法
2015/07/25 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
周年庆典邀请函范文
2014/01/24 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
党员倡议书
2015/01/19 职场文书
2015年电工工作总结
2015/04/10 职场文书
python自动化测试之Selenium详解
2022/03/13 Python
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis