浅谈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 遍历验证所有文本框的值
Aug 27 Javascript
Javascript学习笔记一 之 数据类型
Dec 15 Javascript
javascript设计模式 接口介绍
Jul 24 Javascript
JS特权方法定义作用以及与公有方法的区别
Mar 18 Javascript
复制js对象方法(详解)
Jul 08 Javascript
网页前端优化之滚动延时加载图片示例
Jul 13 Javascript
javascript替换已有元素replaceChild()使用介绍
Apr 03 Javascript
js日期范围初始化得到前一个月日期的方法
May 05 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
May 17 Javascript
JavaScript实现按键精灵的原理分析
Feb 21 Javascript
React 组件渲染和更新的实现代码示例
Feb 21 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
Nov 03 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
DSP接收机前端设想
2021/03/02 无线电
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
深入Python解释器理解Python中的字节码
2015/04/01 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
使用Python 统计高频字数的方法
2019/01/31 Python
python之拟合的实现
2019/07/19 Python
python中time库的实例使用方法
2019/10/31 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
预备党员入党思想汇报
2014/01/04 职场文书
寄语十八大感言
2014/02/07 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
Nginx限流和黑名单配置
2022/05/20 Servers