浅谈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 相关文章推荐
浅析基于WEB前端页面的页面内容搜索的实现思路
Jun 10 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
Oct 29 Javascript
javascript递归回溯法解八皇后问题
Apr 22 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
May 20 Javascript
基于javascript制作微信聊天面板
Aug 09 Javascript
AngulerJS学习之按需动态加载文件
Feb 13 Javascript
jquery获取select,option所有的value和text的实例
Mar 06 Javascript
浅谈vuex之mutation和action的基本使用
Aug 29 Javascript
详解vue-cli 2.0配置文件(小结)
Jan 14 Javascript
vue图片上传本地预览组件使用详解
Feb 20 Javascript
vue中渲染对象中属性时显示未定义的解决
Jul 31 Javascript
微信小程序实现下拉加载更多商品
Dec 29 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 STRING 陷阱原理说明
2010/07/24 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
最适应的vue.js的form提交涉及多种插件【推荐】
2018/08/27 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
Python实现字符串格式化输出的方法详解
2017/09/20 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
python标准库sys和OS的函数使用方法与实例详解
2020/02/12 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
比利时买床:Beter Bed
2017/12/06 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
大一期末自我鉴定
2013/12/13 职场文书
七一建党节演讲稿
2014/09/11 职场文书
婚礼答谢词
2015/01/04 职场文书
校园之声广播稿
2015/08/18 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
检讨书格式
2019/04/25 职场文书
Redis 哨兵机制及配置实现
2022/03/25 Redis