浅谈angular2路由预加载策略


Posted in Javascript onOctober 04, 2017

1.问题描述

在没有使路由懒加载的时候,第一次使用的时候加载特别慢,影响用户体验,angular2可以使用loadChildren进行懒加载,第一次使用的时候只会加载需要的模块,其它模块在真正使用的时候才会去加载,这个时候打开浏览器控制台查看js加载的时候,会发现你在使用时候会去加载对应的js,导致第一次点击相应模块的功能时会卡顿一下,后面在使用就不会了,这样还是用户体验不好,接下来告诉你如果使用预加载策略解决这个问题。

2.预加载策略

RouterModule.forRoot的第二个添加了一个配置选项,这人配置选项中就有一个是preloadingStrategy配置,当然它还有其它配置,这里只讲preloadingStrategy,这个配置是一个预加载策略配置,我们需要实现一个自己的预加载策略,在一些不需要预加载的场景加我们可以不配置,首先我们新建一个selective-preloading-strategy.ts的文件,使用class实现PreloadingStrategy接口的preload方法,代码如下:

import { PreloadingStrategy, Route } from "@angular/router";
import { Observable } from "rxjs";
/**
 * 预加载策略
 */
export class SelectivePreloadingStrategy implements PreloadingStrategy {
  preload(route: Route, load: Function): Observable<any> {
    //当路由中配置data: {preload: true}时预加载
    return route.data && route.data && route.data['preload'] ? load() : Observable.of(null);
  }

}

上面的意思很简单,当你在路由中配置了data: {preload: true}参数后,这里面的策略就返回一个load(),表示需要预加载,如果没有配置就不进行预加载,当然你也可以反过来,默认是预加载,只在配置不需要预加载的时候不加载,就像我的github上的一样,自己灵活运用。

接下来,在在路由中加入策略,也就是RouterModule.forRoot中的配置,代码如下:

import { NgModule }       from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

import {SelectivePreloadingStrategy} from "./selective-preloading-strategy";

import { LoginComponent }   from './login/login.component';
import { MainComponent }  from './main/main.component';



/**
 * app路由
 */
const routes: Routes = [
 { path: '', redirectTo: '/login', pathMatch: 'full' },
 { 
   path: 'login', 
   component: LoginComponent
 },
 { 
   path: 'app', 
   component: MainComponent,
   loadChildren: 'app/main/main.module#MainModule',
   data: {preload: true}
 }
];

export const appRoutes=RouterModule.forRoot(routes,{preloadingStrategy: SelectivePreloadingStrategy});

还需要在AppModule的providers添加,代码如下:

/**
 * app模块
 */
@NgModule({
 imports: [
  appRoutes,
  BrowserModule,
  BrowserAnimationsModule,
  NgbModule.forRoot(),
  MainModule,
  LoginModule
 ],
 declarations: [
  AppComponent,
  ToastBoxComponent,
  ToastComponent,
  SpinComponent
 ],
 providers: [AppService,ToastService,HttpService,SpinService,SelectivePreloadingStrategy],
 exports:[ToastBoxComponent,SpinComponent],
 bootstrap: [ AppComponent ]
})
export class AppModule {}

 接下来在路由中使用,代码如下:

import { NgModule, OnInit } from '@angular/core';
import { RouterModule, Routes, Router } from '@angular/router';

/**
 * 主体路由
 */
const routes: Routes = [
   { path: 'home', loadChildren: 'app/home/home.module#HomeModule', data: {preload: true} },
   { path: 'demo', loadChildren: 'app/demo/demo.module#DemoModule', data: {preload: true} },
];

export const mainRoutes = RouterModule.forChild(routes);

打开浏览器F12,查看js的加载,你会发现,当页面加载完后,会预加载其它模块的js

浅谈angular2路由预加载策略

官网上有一个默认实现PreloadAllModules ,自行参考官网说明。

具体代码到我的github上找,https://github.com/332557712/cc 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
Mar 16 Javascript
js函数的延迟加载实现代码
Oct 11 Javascript
js实现全屏漂浮广告移入光标停止移动
Dec 02 Javascript
js实现表单检测及表单提示的方法
Aug 14 Javascript
js实现鼠标点击左上角滑动菜单效果代码
Sep 06 Javascript
js数组去重的5种算法实现
Nov 04 Javascript
你可能不知道的前端算法之文字避让(inMap)
Jan 12 Javascript
webpack分离css单独打包的方法
Jun 12 Javascript
微信小程序Echarts覆盖正常组件问题解决
Jul 13 Javascript
刷新页面后让控制台的js代码继续执行
Sep 20 Javascript
JS实现贪吃蛇游戏
Nov 15 Javascript
jQuery实现二级导航菜单的示例
Sep 30 jQuery
浅谈Angular路由复用策略
Oct 04 #Javascript
React-Native之定时器Timer的实现代码
Oct 04 #Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
Oct 04 #Javascript
无限循环轮播图之运动框架(原生JS实现)
Oct 01 #Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
Oct 01 #Javascript
原生js封装运动框架的示例讲解
Oct 01 #Javascript
JS Testing Properties 判断属性是否在对象里的方法
Oct 01 #Javascript
You might like
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
详解element-ui中form验证杂记
2019/03/04 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
python web框架中实现原生分页
2019/09/08 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
机关保密承诺书
2014/06/03 职场文书
擅自离岗检讨书
2014/09/12 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
2015年度企业工作总结
2015/05/21 职场文书
地道战观后感300字
2015/06/04 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书