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 相关文章推荐
JS 用6N±1法求素数 实例教程
Oct 20 Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
jQuery .tmpl() 用法示例介绍
Aug 21 Javascript
jQuery中even选择器的定义和用法
Dec 23 Javascript
js获取内联样式的方法
Jan 27 Javascript
js+cookies实现悬浮购物车的方法
May 25 Javascript
JS与jQuery遍历Table所有单元格内容的方法
Dec 07 Javascript
webpack配置的最佳实践分享
Apr 21 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
Jun 09 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
Jul 28 Javascript
js实现各浏览器全屏代码实例
Jul 03 Javascript
小程序表单认证布局及验证详解
Jun 19 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正确解析UTF-8字符串技巧应用
2012/11/07 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
input的focus方法使用
2010/03/13 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
文字垂直滚动之javascript代码
2015/07/29 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
react-router中的属性详解
2017/06/01 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
vue监听对象及对象属性问题
2018/08/20 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
婚前协议书
2014/04/15 职场文书
白莲教口号
2014/06/18 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
见义勇为事迹材料
2014/12/24 职场文书
硕士论文致谢范文
2015/05/14 职场文书
催款函范文
2015/06/24 职场文书
如何写通讯稿
2015/07/22 职场文书
开学典礼致辞
2015/07/29 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
2016五一手机促销广告语
2016/01/28 职场文书