除了通過最常見的匯出一個 Object 來描述 Webpack 所需的配置外,還有其它更靈活的方式,以簡化不同場景的配置。 下面來一一介紹它們。
匯出一個 Function
在大多數時候你需要從同一份原始碼中構建出多份程式碼,例如一份用於開發時,一份用於釋出到線上。
如果採用匯出一個 Object 來描述 Webpack 所需的配置的方法,需要寫量個檔案。
一個用於開發環境,一個用於線上環境。再在啟動時通過 webpack --config webpack.config.js
指定使用哪個配置檔案。
採用匯出一個 Function 的方式,能通過 JavaScript 靈活的控制配置,做到只用寫一個配置檔案就能完成以上要求。
匯出一個 Function 的使用方式如下:
const path = require('path');
const UglifyJsPlugin = require('webpack/lib/optimize/UglifyJsPlugin');
module.exports = function (env = {}, argv) {
const plugins = [];
const isProduction = env['production'];
// 在生成環境才壓縮
if (isProduction) {
plugins.push(
// 壓縮輸出的 JS 程式碼
new UglifyJsPlugin()
)
}
return {
plugins: plugins,
// 在生成環境不輸出 Source Map
devtool: isProduction ? undefined : 'source-map',
};
}
複製程式碼
在執行 Webpack 時,會給這個函式傳入2個引數,分別是:
env
:當前執行時的 Webpack 專屬環境變數,env
是一個 Object。讀取時直接訪問 Object 的屬性,設定它需要在啟動 Webpack 時帶上引數。例如啟動命令是webpack --env.production --env.bao=foo
時,則env
的值是{"production":"true","bao":"foo"}
。argv
:代表在啟動 Webpack 時所有通過命令列傳入的引數,例如--config
、--env
、--devtool
,可以通過webpack -h
列出所有 Webpack 支援的命令列引數。
就以上配置檔案而言,在開發時執行命令 webpack
構建出方便除錯的程式碼,在需要構建出釋出到線上的程式碼時執行 webpack --env.production
構建出壓縮的程式碼。
本例項 提供專案完整程式碼
匯出一個返回 Promise 的函式
在有些情況下你不能以同步的方式返回一個描述配置的 Object,Webpack 還支援匯出一個返回 Promise 的函式,使用如下:
module.exports = function(env = {}, argv) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
// ...
})
}, 5000)
})
}
複製程式碼
匯出多份配置
除了只匯出一份配置外,Webpack 還支援匯出一個陣列,陣列中可以包含每份配置,並且每份配置都會執行一遍構建。
注意本特性從 Webpack 3.1.0 版本才開始支援。
使用如下:
module.exports = [
// 採用 Object 描述的一份配置
{
// ...
},
// 採用函式描述的一份配置
function() {
return {
// ...
}
},
// 採用非同步函式描述的一份配置
function() {
return Promise();
}
]
複製程式碼
以上配置會導致 Webpack 針對這三份配置執行三次不同的構建。
這特別適合於用 Webpack 構建一個要上傳到 Npm 倉庫的庫,因為庫中可能需要包含多種模組化格式的程式碼,例如 CommonJS、UMD。