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 相关文章推荐
来自chinaz的ajax获取评论代码
May 03 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
Mar 04 Javascript
zTree插件之单选下拉菜单实例代码
Nov 07 Javascript
判断javascript的数据类型(示例代码)
Dec 11 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
Mar 22 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
Jun 29 Javascript
很实用的js选项卡切换效果
Aug 12 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 Javascript
详解react-native-fs插件的使用以及遇到的坑
Sep 12 Javascript
vue图片上传本地预览组件使用详解
Feb 20 Javascript
Vue移动端实现图片上传及超过1M压缩上传
Dec 23 Javascript
微信小程序实现列表左右滑动
Nov 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中Session可能会引起并发问题
2015/06/26 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
js验证表单第二部分
2006/11/25 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
js创建对象的方式总结
2015/01/10 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
Unicode和Python的中文处理
2017/03/19 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
澳大利亚音乐商店:Bava’s Music City
2019/05/05 全球购物
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
期末总结的个人自我评价
2013/11/02 职场文书
会计毕业生自我鉴定
2013/11/04 职场文书
法学毕业生自荐信
2013/11/13 职场文书
服务质量承诺书
2014/03/27 职场文书
教师节感谢信
2015/01/22 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
导游词幽默开场白
2019/06/26 职场文书
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle