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 纠正 cleanWhitespace函数
Mar 11 Javascript
IE6下通过a标签点击切换图片的问题
Nov 14 Javascript
JavaScript获取路径设计源码
May 22 Javascript
JavaScript数据结构与算法之栈详解
Mar 12 Javascript
JavaScript中数据结构与算法(二):队列
Jun 19 Javascript
jQuery简单动画变换效果实例分析
Jul 04 Javascript
jquery css实现邮箱自动补全
Nov 14 Javascript
Node.js用readline模块实现输入输出
Dec 16 Javascript
vue.js评论发布信息可插入QQ表情功能
Aug 08 Javascript
记一次webapck4 配置文件无效的解决历程
Sep 19 Javascript
vue+iview动态渲染表格详解
Mar 19 Javascript
ant-design-vue中tree增删改的操作方法
Nov 03 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
JSON在PHP中的应用介绍
2012/09/08 PHP
培养自己的php编码规范
2015/09/28 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
简单了解python中对象的取反运算符
2019/07/01 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
车间班组长岗位职责
2013/11/13 职场文书
个人实用的自我评价范文
2013/11/23 职场文书
客服专员岗位职责范本
2013/11/29 职场文书
小学生红领巾广播稿
2014/01/21 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
群众路线表态发言材料
2014/10/17 职场文书
python xlwt模块的使用解析
2021/04/13 Python
Python中request的基本使用解决乱码问题
2022/04/12 Python
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技