浅谈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 相关文章推荐
MooTools 1.2中的Drag.Move来实现拖放
Sep 15 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
Dec 26 Javascript
js判断输入是否为数字的具体实例
Aug 03 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
Nov 15 Javascript
Javascript基础教程之关键字和保留字汇总
Jan 18 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
Mar 01 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
Apr 12 Javascript
JS、jQuery中select的用法详解
Apr 21 Javascript
微信小程序通过api接口将json数据展现到小程序示例
Jan 20 Javascript
Vue使用Proxy监听所有接口状态的方法实现
Jun 07 Javascript
Vue.js下拉菜单组件使用方法详解
Oct 19 Javascript
OpenLayer3自定义测量控件MeasureTool
Sep 28 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
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
python获取标准北京时间的方法
2015/03/24 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
python实现朴素贝叶斯算法
2018/11/19 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
Python整数对象实现原理详解
2019/07/01 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
this关键字的作用
2016/01/30 面试题
体育课课后反思
2014/04/24 职场文书
公司承诺书格式
2014/05/21 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
公司聚餐通知
2015/04/22 职场文书
网吧温馨提示
2015/07/17 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书