vue路由组件按需加载的几种方法小结


Posted in Javascript onJuly 12, 2018

1. 普通加载

使用vue-cli构建项目后,我们会在Router文件夹下面的index.js里面引入相关的路由组件,如:

import Hello from '@/components/Hello'
import Boy from '@/components/Boy'
import Girl from '@/components/Girl'

这样做的结果就是webpack在npm run build的时候会打包成一个整个的js文件,如果页面一多,会导致这个文件非常大,加载缓慢,为了解决这个问题,需要将他分成多个小文件,而且还要实现异步按需加载,即用到了再加载,而不用一股脑全部加载

2. webpack的require.ensure()实现按需加载

语法:require.ensure(dependencies: String[], callback: function(require), errorCallback: function(error), chunkName: String)

  1. dependencies:字符串构成的数组,声明 callback 回调函数中所需的所有模块,模块作为依赖被加载
  2. callback:只要加载好全部依赖,webpack 就会执行此函数。require 函数的实现,作为参数传入此函数。当程序运行需要依赖时,可以使用 require() 来加载依赖。函数体可以使用此参数,来进一步执行 require() 模块。
  3. errorCallback:当 webpack 加载依赖失败时,会执行此函数。
  4. chunkName:由 require.ensure() 创建出的 chunk 的名字。通过将同一个 chunkName 传递给不同的 require.ensure() 调用,我们可以将它们的代码合并到一个单独的 chunk 中,从而只产生一个浏览器必须加载的 bundle。

使用方法一:

require.ensure([], function(require){
  require('./a.js');
});
// 此时会单独打包出一个js文件,没有自定义名称的话,会被命名为1.js(有hash时候会带上md5)

使用方法二:

require.ensure(['./a.js'], function(require) {
  require('./b.js');
});

1、此时a.js作为依赖被加载,但是没有被执行(官方文档说的only loads the modules)
2、a.js和b.js会被打包成一个文件。
3、回调函数里只require了b.js,只有b.js的内容会被执行。
4、如果你需要使用a.js的内容,需要再加上require('./a.js')

require.ensure(['./list'], function(require){
  var list = require('./list');
  list.show();
});

给require.ensure的第一个参数传了['./list'],执行到这里的时候list.js会被浏览器下载下来,但是并不会执行list.js模块中的代码,也就是webpack官网说的,不会进行evaluate。真正进行evaluate的时候是到了后面这句var list = require('./list');这就是所谓的懒执行。

写在函数中的多个模块会被打包在一起,这一点和上面没有区别。另外,写在数组中的模块也会跟他们打包在一起,不管你有没有手动执行。

vue中使用

comst List = resolve => {
  require.ensure([],() => {
    resolve(require('./list'))
  },'list')
}

其实resolve的作用就是Promise里面那个resolve,在这里就是定义一个异步的组件

使用动态 import语法

const Foo = () => import(/* webpackChunkName: "foo" */ './Foo.vue');
const router = new VueRouter({
 routes: [
  { path: '/foo', component: Foo }
 ]
})
// /* webpackChunkName: "foo" */使用命名chunk,一个特殊的注释语法来提供 chunk name (需要 Webpack > 2.4)
// webpack要加配置 output需要加个chunkFilename
chunkFilename: '[name].js'

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript div 遮罩层封锁整个页面
Jul 10 Javascript
jquery 新手学习常见问题解决方法
Apr 18 Javascript
jQuery使用技巧简单汇总
Apr 18 Javascript
JQuery工具函数汇总
Jun 15 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
Nov 29 Javascript
你所未知的3种Node.js代码优化方式
Feb 25 Javascript
jQuery属性选择器用法示例
Sep 09 Javascript
利用js定义一个导航条菜单
Mar 14 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
vue-router路由懒加载和权限控制详解
Dec 13 Javascript
详解express使用vue-router的history踩坑
Jun 05 Javascript
解决vue-photo-preview 异步图片放大失效的问题
Jul 29 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
Jul 12 #jQuery
使用json-server简单完成CRUD模拟后台数据的方法
Jul 12 #Javascript
教你如何用node连接redis的示例代码
Jul 12 #Javascript
angular 内存溢出的问题解决
Jul 12 #Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
Jul 12 #Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
Jul 12 #Javascript
vue中如何实现pdf文件预览的方法
Jul 12 #Javascript
You might like
php记录日志的实现代码
2011/08/08 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
PHP实现C#山寨ArrayList的方法
2015/07/16 PHP
php函数连续调用实例分析
2015/07/30 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
Python如何合并多个字典或映射
2020/07/24 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
民政局离婚协议书范本
2014/10/20 职场文书
经理岗位职责
2015/02/02 职场文书
个人培训总结
2015/03/05 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
CAD实训总结范文
2015/08/03 职场文书
MySql子查询IN的执行和优化的实现
2021/08/02 MySQL
vue选项卡切换的实现案例
2022/04/11 Vue.js