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 相关文章推荐
通过JavaScript控制字体大小的代码
Oct 04 Javascript
JS对img标签进行优化使用onerror显示默认图像
Apr 24 Javascript
一款由jquery实现的整屏切换特效
Sep 15 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
javascript无刷新评论实现方法
May 13 Javascript
理解Javascript的动态语言特性
Jun 17 Javascript
Javascript的表单验证-初识正则表达式
Mar 18 Javascript
JS实现图片预加载之无序预加载功能代码
May 12 Javascript
jQuery实现可兼容IE6的滚动监听功能
Sep 20 jQuery
vue单页面应用打开新窗口显示跳转页面的实例
Sep 21 Javascript
微信小程序动画(Animation)的实现及执行步骤
Oct 28 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 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__ 常量
2008/07/23 PHP
php 发送带附件邮件示例
2014/01/23 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
JQuery中$之选择器用法介绍
2011/04/05 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
vue中本地静态图片路径写法
2018/03/06 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
在python里从协程返回一个值的示例
2019/02/19 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
Python tornado上传文件的功能
2020/03/26 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
Python实现简单猜数字游戏
2021/02/03 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
入党积极分子学习优秀共产党员先进事迹思想汇报
2014/09/13 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
小升初自荐信范文
2015/03/05 职场文书
亲戚关系证明
2015/06/24 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
队名及霸气口号大全
2015/12/25 职场文书
python全面解析接口返回数据
2022/02/12 Python
JavaScript中reduce()的用法
2022/05/11 Javascript