浅谈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 相关文章推荐
Javascript 判断客户端浏览器类型代码
Mar 01 Javascript
javascript时间函数基础介绍
Mar 28 Javascript
display和visibility的区别示例介绍
Feb 26 Javascript
JavaScript中setMonth()方法的使用详解
Jun 11 Javascript
javascript中new关键字详解
Dec 14 Javascript
分享10个优化代码的CSS和JavaScript工具
May 11 Javascript
bootstrapValidator表单验证插件学习
Dec 30 Javascript
JavaScript多种页面刷新方法小结
Apr 04 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
Jul 18 Javascript
微信小程序 简易计算器实现代码实例
Sep 02 Javascript
详解Vue 单文件组件的三种写法
Feb 19 Javascript
JavaScript中break、continue和return的用法区别实例分析
Mar 02 Javascript
浅谈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
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
原生js实现购物车功能
2020/09/23 Javascript
pytyon 带有重复的全排列
2013/08/13 Python
python实现html转ubb代码(html2ubb)
2014/07/03 Python
python中argparse模块用法实例详解
2015/06/03 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
材料采购员岗位职责
2013/12/17 职场文书
接受捐赠答谢词
2014/01/27 职场文书
运动会广播稿20字
2014/02/18 职场文书
国际金融专业自荐信
2014/07/05 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
小学生运动会报道稿
2014/09/12 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
用python画城市轮播地图
2021/05/28 Python
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript