通常情况下,我们项目里的webpack配置文件都是都导出一个对象,但其实除了导出对象,还可以有其它的导出方式,列举如下

接下来分别介绍上述的类型

bqb

js对象

这是最常见的场景,其实这也是我目前唯一使用过的方式 = =,使用方式很简单,直接导出一个对象就ok了,示例如下

1
2
3
4
5
6
7
8
9
const path = require('path')

module.exports = {
entry: './src/entry.js',
output: {
path: path.join(__dirname,'dist'),
filename: 'output.js'
}
}

这种方式没有需要深挖的东西,next!

函数

这种形式的实现方式就是导出一个函数,这个函数接受两个参数

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const path = require('path')

module.exports = function(env, argv) {
return {
mode: env.production ? 'production' : 'development',
devtool: env.production ? 'source-map' : 'eval',
plugins: [
new TerserPlugin({
terserOptions: {
compress: argv.mode === 'production'
}
})
]
};
};

promise

当需要 异步加载 webpack配置项时,就需要导出一个 promise, 支持使用 Promise.all 导出多个promise,示例如下

1
2
3
4
5
6
7
8
9
10
module.exports = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
entry: './entry.js'
/* ... */
})
}, 5000)
})
}

数组

这种方式在多targets(如 AMD 和 CommonJS)构建 library 时会非常有用,在webpack打包时,每一个配置项都会进行 各自的 打包工作,从而输出 不同的 构建产物,配置示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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'
}
]

结语

虽然大多数场景下导出对象就足够用了,但掌握更多类型的使用方式可以满足特定场景下的需求,让我们更加从容面对不同的场景与挑战,这也是与其它人拉开差距的地方,所以,加油把,骚年!