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中将一个值转换为字符串的方法分析[译]
Sep 21 Javascript
javascript的parseFloat()方法精度问题探讨
Nov 26 Javascript
jquery中使用循环下拉菜单示例代码
Sep 24 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
Dec 18 Javascript
js实现分割上传大文件
Mar 09 Javascript
Node.js文件操作方法汇总
Mar 22 Javascript
简单实现jQuery多选框功能
Jan 09 Javascript
详解本地Node.js服务器作为api服务器的解决办法
Feb 28 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
微信小程序城市选择及搜索功能的方法
Mar 22 Javascript
WebPack工具运行原理及入门教程
Dec 02 Javascript
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
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
PHP6 先修班 JSON实例代码
2008/08/23 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
用js遍历 table的脚本
2008/07/23 Javascript
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
react-native fetch的具体使用方法
2017/11/01 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
一份婚庆公司创业计划书
2014/01/11 职场文书
机工车间主任岗位职责
2014/03/05 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
给老婆道歉的话
2015/01/20 职场文书
法学专业求职信范文
2015/03/19 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
Mysql中常用的join连接方式
2022/05/11 MySQL