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 相关文章推荐
写入cookie的JavaScript代码库 cookieLibrary.js
Oct 24 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
Mar 24 Javascript
基于JQuery的一句代码实现表格的简单筛选
Jul 26 Javascript
js 验证密码强弱的小例子
Mar 21 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
Aug 06 Javascript
Bootstrap每天必学之模态框(Modal)插件
Apr 26 Javascript
微信小程序 POST请求的实例详解
Sep 29 Javascript
Angular 4中如何显示内容的CSS样式示例代码
Nov 06 Javascript
解决vue打包项目后刷新404的问题
Mar 06 Javascript
浅谈JavaScript闭包
Apr 09 Javascript
谈谈IntersectionObserver懒加载的具体使用
Oct 15 Javascript
通过实例解析vuejs如何实现调试代码
Jul 16 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 file_get_contents函数轻松采集html数据
2010/04/22 PHP
解析ajax事件的调用顺序
2013/06/17 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
用javascript实现点击链接弹出"图片另存为"而不是直接打开
2007/08/15 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
Python找出最小的K个数实例代码
2018/01/04 Python
python实现数据写入excel表格
2018/03/25 Python
python安装pil库方法及代码
2019/06/25 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
python web框架 django wsgi原理解析
2019/08/20 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
大专应届生个人简历的自我评价
2013/10/15 职场文书
采购部经理岗位职责
2014/02/10 职场文书
大学生就业协议书范本(适用于公司企业)
2014/10/07 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
redis缓存存储Session原理机制
2021/11/20 Redis