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 相关文章推荐
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
May 24 Javascript
JS操作JSON要领详细总结
Aug 25 Javascript
Js 导出table内容到Excel的简单实例
Nov 19 Javascript
一道关于JavaScript变量作用域的面试题
Mar 08 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
Dec 28 Javascript
jQuery实现判断上传图片类型和大小的方法示例
Apr 11 jQuery
JS实现获取word文档内容并输出显示到html页面示例
Jun 23 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
Jul 24 jQuery
抖音上用记事本编写爱心小程序教程
Apr 17 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 Javascript
JavaScript碰撞检测原理及其实现代码
Mar 12 Javascript
前端使用crypto.js进行加密的函数代码
Aug 16 Javascript
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之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
js 单引号 传递方法
2009/06/22 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
django orm 通过related_name反向查询的方法
2018/12/15 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
python实现简单井字棋游戏
2020/03/04 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
优秀生推荐信范文
2013/11/28 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
培训演讲稿范文
2014/01/12 职场文书
2014年大学生就业规划书
2014/04/04 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
Java实现学生管理系统(IO版)
2022/02/24 Java/Android
Pandas实现批量拆分与合并Excel的示例代码
2022/05/30 Python