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 相关文章推荐
关于使用runtimeStyle属性问题讨论文章
Mar 08 Javascript
javascript中检测变量的类型的代码
Dec 28 Javascript
js获取多个tagname的节点数组
Sep 22 Javascript
JS实现简易图片轮播效果的方法
Mar 25 Javascript
javascript中innerText和innerHTML属性用法实例分析
May 13 Javascript
JavaScript常用字符串与数组扩展函数小结
Apr 24 Javascript
第十篇BootStrap轮播插件使用详解
Jun 21 Javascript
概述jQuery中的ajax方法
Dec 16 Javascript
移动前端图片压缩上传的实例
Dec 06 Javascript
JavaScript实现求最大公共子串的方法
Feb 03 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
Nov 27 Javascript
jQuery实现的别踩白块小游戏完整示例
Jan 07 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 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
2012/01/11 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
用javascript做拖动布局的思路
2008/05/31 Javascript
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
javascript获取元素CSS样式代码示例
2013/11/28 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
js实现数组转换成json
2015/06/26 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
微信小程序实现单选功能
2018/10/30 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
python爬虫使用cookie登录详解
2017/12/27 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
Puma印度官网:德国运动品牌
2019/10/06 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
UNIX文件类型
2013/08/29 面试题
大四毕业生学习总结的自我评价
2013/10/31 职场文书
美术教师自我鉴定
2014/02/12 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
财务整改报告范文
2014/11/05 职场文书
保研推荐信范文
2015/03/25 职场文书
7个关于Python的经典基础案例
2021/11/07 Python