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 相关文章推荐
在html页面中包含共享页面的方法
Oct 24 Javascript
利用js(jquery)操作Cookie的方法说明
Dec 19 Javascript
分享一个常用的javascript静态类
Dec 31 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
Jun 19 Javascript
AngularJS向后端ASP.NET API控制器上传文件
Feb 03 Javascript
Uploadify上传文件方法
Mar 16 Javascript
JavaScript操作选择对象的简单实例
May 16 Javascript
Vue实例简单方法介绍
Jan 20 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
Mar 08 Javascript
js控制文本框禁止输入特殊字符详解
Apr 07 Javascript
小程序Request的另类用法详解
Aug 09 Javascript
JavaScript中this的学习笔记及用法整理
Feb 17 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获取网站百度快照日期的方法
2015/07/29 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
vue 中 命名视图的用法实例详解
2019/08/14 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
详解Python中的日志模块logging
2015/06/19 Python
Python 将pdf转成图片的方法
2018/04/23 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
python 6种方法实现单例模式
2020/12/15 Python
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
大二自我鉴定
2014/01/31 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
人力资源作业细则
2014/03/03 职场文书
《菜园里》教学反思
2014/04/17 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
学生保证书格式
2015/02/27 职场文书
详解PyTorch模型保存与加载
2022/04/28 Python
使用Redis实现分布式锁的方法
2022/06/16 Redis