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 相关文章推荐
扩展jquery实现客户端表格的分页、排序功能代码
Mar 16 Javascript
jQuery的初始化与对象构建之浅析
Apr 12 Javascript
Jquery chosen动态设置值实例介绍
Aug 08 Javascript
控制台报错object is not a function的解决方法
Aug 24 Javascript
JavaScript中pop()方法的使用教程
Jun 09 Javascript
javascript关于继承解析
May 10 Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 Javascript
基于jquery实现弹幕效果
Sep 29 Javascript
基于JS组件实现拖动滑块验证功能(代码分享)
Nov 18 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
Nov 29 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
Mar 07 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 一个比较完善的简单文件上传
2010/03/25 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
php一个找二层目录的小东东
2012/08/02 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
IE8 原生JSON支持
2009/04/13 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
Django中使用locals()函数的技巧
2015/07/16 Python
Python ftp上传文件
2016/02/13 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
python中for用来遍历range函数的方法
2018/06/08 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
Python 读取位于包中的数据文件
2020/08/07 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
意大利奢侈品多品牌集合店:TheDoubleF
2019/08/24 全球购物
先进个人获奖感言
2014/01/24 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
商场广播稿范文
2015/08/19 职场文书
2016年教师节感言
2015/12/09 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫
python的html标准库
2022/04/29 Python