除了經過最多見的導出一個 Object 來描述 Webpack 所需的配置外,還有其它更靈活的方式,以簡化不一樣場景的配置。
下面來一一介紹它們。html
在大多數時候你須要從同一份源代碼中構建出多份代碼,例如一份用於開發時,一份用於發佈到線上。webpack
若是採用導出一個 Object 來描述 Webpack 所需的配置的方法,須要寫量個文件。
一個用於開發環境,一個用於線上環境。再在啓動時經過 webpack --config webpack.config.js
指定使用哪一個配置文件。web
採用導出一個 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
構建出壓縮的代碼。函數
本實例 提供項目完整代碼
在有些狀況下你不能以同步的方式返回一個描述配置的 Object,Webpack 還支持導出一個返回 Promise 的函數,使用以下:ui
module.exports = function(env = {}, argv) { return new Promise((resolve, reject) => { setTimeout(() => { resolve({ // ... }) }, 5000) }) }
除了只導出一份配置外,Webpack 還支持導出一個數組,數組中能夠包含每份配置,而且每份配置都會執行一遍構建。spa
注意本特性從 Webpack 3.1.0 版本纔開始支持。
使用以下:命令行
module.exports = [ // 採用 Object 描述的一份配置 { // ... }, // 採用函數描述的一份配置 function() { return { // ... } }, // 採用異步函數描述的一份配置 function() { return Promise(); } ]
以上配置會致使 Webpack 針對這三份配置執行三次不一樣的構建。
這特別適合於用 Webpack 構建一個要上傳到 Npm 倉庫的庫,由於庫中可能須要包含多種模塊化格式的代碼,例如 CommonJS、UMD。