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实现的网站首页随机公告随机公告
Mar 14 Javascript
javascript实现检验的各种规则
Jul 31 Javascript
简单谈谈Javascript中类型的判断
Oct 19 Javascript
jQuery Easyui 验证两次密码输入是否相等
May 13 Javascript
javascript 解决浏览器不支持的问题
Sep 24 Javascript
Ztree新增角色和编辑角色回显问题的解决
Oct 25 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
May 25 Javascript
原生JS实现列表子元素顺序反转的方法分析
Jul 02 Javascript
mac上配置Android环境变量的方法
Jul 08 Javascript
小程序跳转H5页面的方法步骤
Mar 06 Javascript
解决vuecli3中img src 的引入问题
Aug 04 Javascript
vue实现省市区联动 element-china-area-data插件
Apr 22 Vue.js
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环境搭建的详细步骤
2016/06/30 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
设定php简写功能的方法
2019/11/28 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
JavaScript中数组的22种方法必学(推荐)
2016/07/20 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
Python中AND、OR的一个使用小技巧
2015/02/18 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
什么时候需要进行强制类型转换
2016/09/03 面试题
行政经理岗位职责
2013/11/09 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
工程安全员岗位职责
2014/03/09 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
cf战队收人口号
2014/06/21 职场文书
通知怎么写?
2019/04/17 职场文书
德劲DE1108畅想
2021/04/22 无线电
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android