webpack4实现不同的导出类型


Posted in Javascript onApril 09, 2019

webpack最基本的配置就是导出一个静态的对象,但是由于我们业务比较复杂,往往需要动态配置webpack以构建目标代码。

幸运的是,webpack为我们提供了动态配置webpack文件的支持。

下面介绍一下webpack的多种配置类型。

1、导出为一个对象(Object)

webpack最常见的配置类型为导出一个对象,即

const path = require('path')
module.exports = {
 entry: './src/index.js',
 output: {
  filename: 'bundle.js',
  path: path.resolve(__dirname, 'dist')
 }
}

2、导出为一个函数(Function)

很明显,导出为一个对象缺乏灵活性。若我们想要根据不同的开发环境构建不一样的代码。此时,webpack配置也应该随着改变。

所以,webpack支持我们导出一个函数,这个导出函数的默认参数为env和argv。其中,env为环境对象,我们可以通过命令行对其进行配置(webpack可自动读取该配置),argv为命令行输入参数的map。

(1)--env 参数支持各种各样的配置:

Invocation Resulting environment notes
webpack --env prod "prod" env为String类型,赋值为prod
webpack --env.prod { prod: true } env为对象,prod是对象的属性, 默认为true
webpack --env.prod=1 { prod: 1 } env为对象,prod是对象的属性,赋值为1
webpack --env.prod=foo { prod: "foo" } env为对象,prod是对象的属性,赋值为foo
webpack --env.prod --env.min [ prod: true, min: true ] env为对象,prod和min是对象的属性,默认为true。--env命令可以多次使用,不会被覆盖
webpack --env.prod --env min [{ prod: true }, "min"] env 为数组,第一个数组元素为对象,prod是其属性,默认为true。第二个数组元素为String,赋值为min
webpack --env.prod=foo --env.prod=bar { prod: ["foo", "bar"] } env为对象,prod是对象的属性。prod是一个数组,第一个数组元素为"foo",第二个数组对象为"bar"。注意,即使这种情况下,prod值不会被覆盖,而是转化为数组。

(2)argv为webpack命令行参数的map。

例如,我们在命令行键入webpack --entry-filename=index,则在webpack配置文件中,我们可以通过argv["entry-filename"]来获取命令行配置的值。即:

argv["entry-filename"] === "index"

(3)举个例子:

const path = require('path')

module.exports = function (env, argv) {
 return {
  entry: './src/' + argv['entry-filename'] + '.js',
  output: {
   filename: 'bundle.js',
   path: path.resolve(__dirname, 'dist'),
  },
  devtool: env.prod ? 'source-map' : 'eval'
 }
}

在命令行中,我们需要自键入

webpack --env.prod --entry-filename=index

注意,凡是webpack配置文件中使用到的命令行参数,例如argv["entry-filename"],均需要在命令行传入,一个不能遗漏,否则webpack会报错:Config did not export an object

3、导出为一个Promise对象

除了导出为一个函数,webpack还支持我们异步获取配置变量来配置相关文件。(真是很强大!)

为了体现异步获取数据的过程,我们把webpack.config.js修改为以下内容:

const path = require('path')
module.exports = () => {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   resolve({
    entry: './src/index.js',
    output: {
     filename: 'bundle.js',
     path: path.resolve(__dirname, 'dist')
    }
   })
  }, 1000)
 })
}

4、导出多个配置

修改webpack.config.js的内容如下:

const path = require('path')

module.exports = [
 {
  name: 'index',
  entry: './src/index.js',
  output: {
   filename: 'index.js',
   path: path.resolve(__dirname, 'dist')
  },
  mode: 'production'
 },
 {
  name: 'main',
  entry: './src/main.js',
  output: {
   filename: 'main.js',
   path: path.resolve(__dirname, 'dist')
  }
 }
]

当我们运行webpack时,以上多个配置都会被构建出来。如果我们只想构建其中一份代码,那么只需要传入--config-name参数即可:

webpack --config-name=index

webpack --config-name=main

如上所示,我们可以分别构建出name为index、name为main的配置对象所配置的内容。

以上配置常见的场景有:npm包利用不同的模块语法构建不同的输出文件,供不同的项目进行使用:

module.exports = [{
 output: {
  filename: './dist-amd.js',
  libraryTarget: 'amd'
 },
 name: 'amd',
 entry: './app.js',
 mode: 'production',
},{
 output: {
  filename: './dist-commonjs.js',
  libraryTarget: 'commonjs'
 },
 name: 'commonjs',
 entry: './app.js',
 mode: 'production',
}]

总而言之,webpack为我们提供了众多灵活的配置解决方案。当我们遇到复杂项目的时候,只要明确心中需求,大多数都能够找到对应的解决方案。

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

Javascript 相关文章推荐
jQuery 淡出一个图像到另一个图像的实现代码
Jun 12 Javascript
没有document.getElementByName方法
Aug 19 Javascript
JavaScript中的console.assert()函数介绍
Dec 29 Javascript
js改变Iframe中Src的方法
May 05 Javascript
Bootstrap的基本应用要点浅析
Dec 19 Javascript
Bootstrap风格的zTree右键菜单
Feb 17 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
Apr 13 Javascript
JavaScript中将值转换为字符串的五种方法总结
Jun 06 Javascript
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
JavaScript使用prototype属性实现继承操作示例
May 22 Javascript
vue实现登录拦截
Jun 29 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
Dec 30 jQuery
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
Apr 09 #Javascript
基于three.js实现的3D粒子动效实例代码
Apr 09 #Javascript
Koa 中的错误处理解析
Apr 09 #Javascript
简单说说如何使用vue-router插件的方法
Apr 08 #Javascript
利用Bootstrap Multiselect实现下拉框多选功能
Apr 08 #Javascript
纯javascript实现选择框的全选与反选功能
Apr 08 #Javascript
详解小程序如何避免多次点击,重复触发事件
Apr 08 #Javascript
You might like
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
php实现登录页面的简单实例
2019/09/29 PHP
jQuery 技巧小结
2010/04/02 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
基于Python的接口测试框架实例
2016/11/04 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
Python如何在DataFrame增加数值
2020/02/14 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
婚庆司仪主持词
2014/03/15 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android