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 28 Javascript
js实现仿百度瀑布流的方法
Feb 05 Javascript
JavaScript分页功能的实现方法
Apr 25 Javascript
js同源策略详解
May 21 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
Oct 29 Javascript
angularjs自定义ng-model标签的属性
Jan 21 Javascript
基于JavaScript实现前端数据多条件筛选功能
Aug 19 Javascript
vue.js通过路由实现经典的三栏布局实例代码
Jul 08 Javascript
手把手教你写一个微信小程序(推荐)
Oct 17 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
Oct 08 jQuery
详解如何在Vue项目中发送jsonp请求
Oct 25 Javascript
如何基于filter实现网站整体变灰功能
Apr 17 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下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
2020/12/22 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
vue实现图片上传功能
2020/05/28 Javascript
[01:27]2014DOTA2展望TI 剑指西雅图IG战队专访
2014/06/30 DOTA
Python函数式编程指南(四):生成器详解
2015/06/24 Python
详解django中使用定时任务的方法
2018/09/27 Python
Python给图像添加噪声具体操作
2019/03/03 Python
python ftplib模块使用代码实例
2019/12/31 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
python openpyxl模块的使用详解
2021/02/25 Python
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
2018/02/07 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
学生拾金不昧表扬信
2014/01/21 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
环卫工作个人总结
2015/03/04 职场文书
护理培训心得体会
2016/01/22 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js