浅谈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 相关文章推荐
简单的无缝滚动程序-仅几行代码
May 08 Javascript
javascript 无提示关闭窗口脚本
Aug 17 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
Feb 26 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
JavaScript 浏览器对象模型BOM使用介绍
Apr 13 Javascript
让编辑器支持word复制黏贴、截屏的js代码
Oct 17 Javascript
vue.js编译时给生成的文件增加版本号
Sep 17 Javascript
详解关于element el-button使用$attrs的一个注意要点
Nov 09 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
Mar 06 jQuery
inquirer.js一个用户与命令行交互的工具详解
May 18 Javascript
javascript导出csv文件(excel)的方法示例
Aug 25 Javascript
Ajax异步刷新功能及简单案例
Nov 20 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
Yii 2.0中场景的使用教程
2017/06/02 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
预订奥兰多和佛罗里达州公园门票:FloridaTix
2018/01/03 全球购物
英文求职信结束语大全
2013/10/26 职场文书
外贸业务员求职信范文
2013/12/12 职场文书
专业求职信撰写要诀
2014/02/18 职场文书
工程质量月活动方案
2014/02/19 职场文书
产品质量保证书
2014/04/29 职场文书
学校开学标语
2014/10/06 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
交通事故调解协议书
2015/05/20 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL