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 相关文章推荐
图片自动缩小 点击放大
Jul 07 Javascript
基于jquery打造的百分比动态色彩条插件
Sep 19 Javascript
jQuery移动和复制dom节点实用DOM操作案例
Dec 17 Javascript
Javascript无阻塞加载具体方式
Jun 28 Javascript
使用js对select动态添加和删除OPTION示例代码
Aug 12 Javascript
如何获取select下拉框的值(option没有及有value属性)
Nov 08 Javascript
理解javascript中DOM事件
Dec 25 Javascript
jQuery实现获取隐藏div高度的方法示例
Feb 09 Javascript
Bootstrap栅格系统简单实现代码
Mar 06 Javascript
最基础的vue.js双向绑定操作
Aug 23 Javascript
10行原生JS实现文字无缝滚动(超简单)
Jan 02 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
May 28 jQuery
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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
一个查看session内容的函数
2006/10/09 PHP
使用 php4 加速 web 传输
2006/10/09 PHP
PHP XML error parsing SOAP payload on line 1
2010/06/17 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
Javascript模块模式分析
2008/05/16 Javascript
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
一个超级简单的python web程序
2014/09/11 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
求职简历中的自我评价分享
2013/12/08 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
5s推行计划书
2014/05/06 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
员工规章制度范本
2015/08/07 职场文书
校园运动会广播稿
2015/08/19 职场文书
python装饰器代码解析
2022/03/23 Python