Vue.js如何实现路由懒加载浅析


Posted in Javascript onAugust 14, 2017

前言

懒加载也就是延迟加载,不知道大家在工作中有没有发现,当你的SPA(单页应用程序)变得复杂时,打包构建后的Javascript包会变得非常大,以至于严重影响页面的加载时间。幸运的是:vue-router支持WebPack内置的异步模块加载系统。所以,那些使用较少的路由组件不必打包进bundles里,只需要在路由被访问时按需加载。话不多说了,来一起看看详细的实现过程:

使用

假设你的路由配置是这样的:

import MainPage from './routes/MainPage.vue'
import OtherMassivePage from './routes/OtherMassivePage.vue'

const routes = [
 { path: '/main', component: MainPage },
 { path: '/other', component: OtherMassivePage }
]

简单来说,你可以使用require.ensure来替代import。它能帮你将OtherMassivePage组件以及该组件的所有依赖分割到一个单独的chunk中去。

现在重启你的应用,你会发现并没有什么改变。但,当你打开开发人员工具,选择检查网络,再一次访问/other路径时,你会看到一个新的文件被加载进来。

import MainPage from './routes/MainPage.vue'
const OtherMassivePage = r => require.ensure([], () => r(require('./routes/OtherMassivePage.vue')))

const routes = [
 { path: '/main', component: MainPage },
 { path: '/other', component: OtherMassivePage }
]

是的,这看起来是有点奇怪,相信我,它并不是那么糟糕。

还有一种方法是将路由对应的组件定义成异步组件。

写起来像这样:

const OtherMassivePage = resolve => {
 // 空数组用来指定该路由组件需要加载的依赖
 require.ensure([], () => {
 resolve(require('./routes/OtherMassivePage.vue'))
 })
}

不过,你最好不要使用这种包裹起来的写法,因为WebPack会使用静态分析来检测和分割块。比较好的做法是,将他们写成一行以减少空间的占用。

按组分块

有时候我们想把某个路由下的所有组件都打包在同个异步 chunk 中。只需要 给 chunk 命名,提供require.ensure第三个参数作为 chunk 的名称:

// 这两条路由被打包在相同的块中,访问任一路由都会延迟加载该路由组件
const OtherMassivePage = r => require.ensure([], () => r(require('./routes/OtherMassivePage.vue')), 'big-pages')
const WeightLossPage = r => require.ensure([], () => r(require('./routes/WeightLossPage.vue')), 'big-pages')

不像许多其他的WebPack任务,这个方法出乎意料的简单,并且能产生意想不到的有用结果。如果你正在维护那些变得臃肿不堪的大型单页应用,我会毫不犹豫的将这种方法推荐给你。

作者:Joshua Bemenderfer

原文地址: lazy-loading-routes

译者:jeneser

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery BS,dialog控件自适应大小
Jul 06 Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 Javascript
js加入收藏以及使用Jquery更改透明度
Jan 26 Javascript
js读取配置文件自写
Feb 11 Javascript
javascript单引号和双引号的区别和处理
May 14 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
Mar 13 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
Jun 29 Javascript
微信小程序 Page()函数详解
Oct 17 Javascript
php简单数据库操作类的封装
Jun 08 Javascript
JS滚动到指定位置导航栏固定顶部
Jul 03 Javascript
JavaScript栈和队列相关操作与实现方法详解
Dec 07 Javascript
Node.js fs模块原理及常见用途
Oct 22 Javascript
JavaScript中的return布尔值的用法和原理解析
Aug 14 #Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 #Javascript
利用纯JS实现像素逐渐显示的方法示例
Aug 14 #Javascript
jQuery 实时保存页面动态添加的数据的示例
Aug 14 #jQuery
js异步编程小技巧详解
Aug 14 #Javascript
js数字滑动时钟的简单实现(示例讲解)
Aug 14 #Javascript
使用yeoman构建angular应用的方法
Aug 14 #Javascript
You might like
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
php常量详细解析
2015/10/27 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
2016/05/31 Javascript
Angular.js跨controller实现参数传递的两种方法
2017/02/20 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
微信小程序-API接口安全详解
2019/07/16 Javascript
python切换hosts文件代码示例
2013/12/31 Python
Python Socket编程入门教程
2014/07/11 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Python中property函数用法实例分析
2018/06/04 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
python中的print()输出
2019/04/12 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
大三在校生电子商务求职信
2013/10/29 职场文书
学生实习推荐信范文
2013/11/26 职场文书
实习自我评价怎么写
2013/12/02 职场文书
应聘自荐信
2013/12/14 职场文书
工作失职检讨书500字
2014/10/17 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python