vue按需加载组件webpack require.ensure的方法


Posted in Javascript onDecember 13, 2017

vue-cli是由vue官方发布的快速构建vue单页面的脚手架。

使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build 会将所有的js代码打包为一个整体,

打包位置是 dist/static/js/app.[contenthash].js

类似下面的路由代码

router/index.js 路由相关信息,该路由文件引入了多个 .vue组件

import Hello from '@/components/Hello'
import Province from '@/components/Province'
import Segment from '@/components/Segment'
import User from '@/components/User'
import Loading from '@/components/Loading'

执行 npm run build 会打包为一个整体 app.[contenthash].js ,这个文件是非常大,可能几兆或者几十兆,加载会很慢

vue按需加载组件webpack require.ensure的方法

所以我们需要分模块打包,把我们想要组合在一起的组件打包到一个 chunk块中去,分模块打包需要下面这样使用 webpack的 require.ensure,并且在最后加入一个 chunk名,相同 chunk名字的模块将会打包到一起。

webpack中利用require.ensure()实现按需加载

1、require.ensure()

webpack 在编译时,会静态地解析代码中的 require.ensure(),同时将模块添加到一个分开的 chunk 当中。这个新的 chunk 会被 webpack 通过 jsonp 来按需加载。

语法如下:

require.ensure(dependencies: String[], callback: function(require), chunkName: String)

依赖 dependencies

这是一个字符串数组,通过这个参数,在所有的回调函数的代码被执行前,我们可以将所有需要用到的模块进行声明。

回调 callback

当所有的依赖都加载完成后,webpack会执行这个回调函数。require 对象的一个实现会作为一个参数传递给这个回调函数。因此,我们可以进一步 require() 依赖和其它模块提供下一步的执行。

chunk名称 chunkName

chunkName 是提供给这个特定的 require.ensure() 的 chunk 的名称。通过提供 require.ensure() 不同执行点相同的名称,我们可以保证所有的依赖都会一起放进相同的 文件束(bundle)。

让我们来看以下的项目

\\ file structure
  |
  js --|
  |  |-- entry.js
  |  |-- a.js
  |  |-- b.js
  webpack.config.js
  |
  dist
\\ entry.js
require('a');
require.ensure([], function(require){
  require('b');
});
\\ a.js
console.log('***** I AM a *****');
\\ b.js
console.log('***** I AM b *****');
\\ webpack.config.js
var path = require('path');
module.exports = function(env) {
  return {
    entry: './js/entry.js',
    output: {
      filename: 'bundle.js',
      path: path.resolve(__dirname, 'dist')
    }
  }
}

通过执行这个项目的 webpack 构建,我们发现 webpack 创建了2个新的文件束, bundle.js 和 0.bundle.js。

entry.js 和 a.js 被打包进 bundle.js.

b.js 被打包进 0.bundle.js.

2、require.ensure() 的坑点

(1)、空数组作为参数

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

以上代码保证了拆分点被创建,而且 a.js 被 webpack 分开打包。

(2)、依赖作为参数

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

上面代码, a.js 和 b.js 都被打包到一起,而且从主文件束中拆分出来。但只有 b.js 的内容被执行。a.js 的内容仅仅是可被使用,但并没有被输出。

想去执行 a.js,我们需要异步地引用它,如 require(‘./a.js'),让它的 JavaScritp 被执行。

(3)、单独打包成自己写的名字配置

需要配置chunkFilename,和publicPath。publicPath是按需加载单独打包出来的chunk是以publicPath会基准来存放的,chunkFilename:[name].js这样才会最终生成正确的路径和名字

module.exports={
  entry:'./js/entry.js',
  output:{
    path:path.resolve(__dirname,"./dist"),
    filename:'js/a.bundle.js',
    publicPath:"./",
    chunkFilename:'js/[name].js'
  }

所以router/index.js 修改为懒加载组件:

const Province = r => require.ensure([], () => r(require('@/components/Province.vue')), 'chunkname1')
const Segment = r => require.ensure([], () => r(require('@/components/Segment.vue')), 'chunkname2')
const Loading = r => require.ensure([], () => r(require('@/components/Loading.vue')), 'chunkname3')
const User = r => require.ensure([], () => r(require('@/components/User.vue')), 'chunkname3')

根据 chunkame的不同, 上面的四个组件, 将会被分成3个块打包,最终打包之后与组件相关的js文件会分为3个 (除了app.js,manifest.js, vendor.js)

分模块打包之后在 dist目录下是这样的, 这样就把一个大的 js文件分为一个个小的js文件了,按需去下载,其他的使用方法和import的效果一样

vue按需加载组件webpack require.ensure的方法

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

Javascript 相关文章推荐
JavaScript中判断函数是new还是()调用的区别说明
Apr 07 Javascript
node+express+jade制作简单网站指南
Nov 26 Javascript
JavaScript多线程详解
Aug 12 Javascript
jQuery+CSS3实现3D立方体旋转效果
Nov 10 Javascript
高效利用Angular中内置服务$http、$location等
Mar 22 Javascript
网页中JS函数自动执行常用三种方法
Mar 30 Javascript
Bootstrap每天必学之导航组件
Apr 25 Javascript
利用types增强vscode中js代码提示功能详解
Jul 07 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
Apr 11 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
JS实现的全选、全不选及反选功能【案例】
Feb 19 Javascript
js前端面试常见浏览器缓存强缓存及协商缓存实例
Jun 21 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
Dec 13 #Javascript
vue组件中使用iframe元素的示例代码
Dec 13 #Javascript
vue中路由验证和相应拦截的使用详解
Dec 13 #Javascript
vue实现nav导航栏的方法
Dec 13 #Javascript
vue实现导航栏效果(选中状态刷新不消失)
Dec 13 #Javascript
仿京东快报向上滚动的实例
Dec 13 #Javascript
Angular2使用vscode断点调试ts文件的方法
Dec 13 #Javascript
You might like
php二分法在IP地址查询中的应用
2008/08/12 PHP
如何使用PHP计算上一个月的今天
2013/05/23 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
2015/03/19 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
Python3写入文件常用方法实例分析
2015/05/22 Python
Python内置函数reversed()用法分析
2018/03/20 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
python中的句柄操作的方法示例
2019/06/20 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
JAVA程序员面试题
2012/10/03 面试题
4s店机修工岗位职责
2013/12/20 职场文书
英语专业毕业生自荐信范文
2013/12/31 职场文书
更夫岗位责任制
2014/02/11 职场文书
中专生毕业个人鉴定
2014/02/26 职场文书
求职自我推荐信
2014/06/25 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
公司内部升职自荐信
2015/03/27 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
医院感染管理制度
2015/08/05 职场文书
大学军训口号大全
2015/12/24 职场文书
您对思维方式了解多少?
2019/12/09 职场文书