你們好!我是蘿蔔,這一章跟你們介紹 webpack 4 常見的配置。javascript
webpack 是可配置的模塊打包工具,能夠經過修改 webpack.config.js 的配置文件對 webpack 進行配置,webpack 的配置文件遵循 Nodejs 的 CommonJS 模塊規範,可經過 require() 語法導入其餘文件或者使用 Nodejs 內置的模塊,其實 webpack.config.js 是一個 Nodejs 的模塊。css
const path = require('path'); module.exports = { mode: 'development', entry: './entry.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'entry.bundle.js' } };
上面例子中使用CommonJS的 require 引入 Nodejs 內置的 path 模塊,而後經過 module.exports 將 webpack 的配置導出。html
Tips: webpack 的配置是一個 Nodejs 模塊,並非 JSON 對象。
webpack 不只僅支持 js 配置,還支持 TypeScript 、CoffeeScript 甚至 JSX 語法的配置,可是不論使用什麼語言,核心配置項是相同的,只不過是語法不一樣。除了配置文件的語法多樣以外,對於配置的類型也是多樣的,最多見的是做爲一個對象來使用,除了對象,webpack 還支持函數、Promise 和多配置數組。前端
默認狀況下,webpack 會查找執行目錄下的 webpack.config.js 做爲配置,若是須要指定某個配置文件,可使用命令:java
npx webpack --config webpack.config.js
或者在項目目錄下運行node
node ./node_modules/webpack/bin/webpack --config webpack.config.js
雖然 webpack 的功能強大且配置項多,可是隻要理解了如下的幾個核心概念,就能隨心應手的使用它,webpack 有如下幾個核心概念:webpack
webpack 是一個模塊打包工具,可以從一個須要處理的 javascript 文件開始,構建一個依賴關係圖(dependency graph),該圖映射到了項目中每一個模塊,而後將這個依賴關係圖輸出到一個或者多個 bundle 中。
webpack 是從指定的入口文件(entry)開始,通過加工處理,最終按照 output 輸出固定內容的 bundle。而這個加工處理的過程,就用到了 loader 和 plugin 兩個工具,loader 是源代碼的處理器,plugin 解決的是 loader 處理不了的事情。web
webpack 的 entry 支持多種類型,包括字符串、對象、數組。從做用上說,包括單文件入口和多文件入口兩種方式。數組
module.exports = { entry: 'path/index.js' } // 使用對象的方式 module.exports = { entry: { main: 'path/index.js' } }
單文件入口能夠快速建立一個只有單一文件入口的狀況,可是相對簡單,在擴展配置時靈活性較低。瀏覽器
module.exports = { mode: 'development', entry: ['./src/index1.js', './src/index2.js'] }
不管是字符串仍是字符串數組的 entry ,實際上都是隻有一個入口,可是在打包產出上會有差別:
若是直接是 string 的形式,那麼 webpack 就是直接把該 string 指定的模塊做爲入口模塊。
若是是數組的形式,那麼 webpack 會自動生成另外一個入口模塊,並將數組中的每一個元素指定的模塊加載進來,並將最後一個模塊的 module.exports 做爲入口模塊的 module.exports 導出。
多文件入口是使用對象語法來經過支持多個 entry ,多文件入口的對象語法相對於單文件入口,具備更高的靈活性,例如多頁應用、頁面模塊化分離優化。
module.exports = { entry: { home: 'path/home.js', search: 'path/search.js', list: 'path/list.js' } }
上面的語法將 entry 分紅了 3 個獨立的入口文件,這樣會打包出來三個對應的 bundle。
Tips: 對於一個 html 頁面,我推薦只用一個 entry ,經過統一入口,解析出來的依賴關係更方便管理和維護。
webpack 的 output 是指定了 entry 對應文件編譯打包後的輸出 bundle 。output 的經常使用屬性是:
Tips: 當不指定 output 的時候,默認輸出到 dist/main.js,即 output.path 是
dist,output.filename 是 main。
一個 webpack 的配置,能夠包含多個 entry ,可是隻能有一個 output 。對於不一樣的 entry 能夠經過 output.filename 佔位符來區分。
module.exports = { entry: { home: 'path/home.js', search: 'path/search.js', list: 'path/list.js' }, output: { filename: '[name].js', path: __dirname + '/dist' } }
其中 [name] 就是佔位符,它對應的是 entry 的 key (home、search、list)。
目前 webpack 支持的佔位符有:
[hash] 和 [chunkhash] 的長度可使用[hash:16] (默認爲 20) 來指定,或者經過指定output.hashDigestLength 在全局配置長度,那麼他們之間的區別是什麼?
[hash]、[chunkhash] 和 [contenthash] 都支持 [xxx:length] 語法。
Tips: 佔位符是能夠組合使用的,例如 [name]-[hash:8]
咱們構建出的靜態資源文件都是經過 <script> 或者 <link> 標籤進行加載的,並且這些靜態資源文件都是須要部署在靜態資源服務器或者 CDN 上,那麼如何將這些靜態資源文件放在不一樣的域名或者 CDN 上面呢?這時就要用到 output.publicPath 來進行配置:
module.exports = { output: { filename: '[name]_[chunkhash:8].js', publicPath: 'https://cdn.ezample.com/assets/' } }
則輸出:
<script src="https://cdn.ezample.com/assets/a_456456456.js"></script>
咱們在實際開發中老是須要去打包一些供團隊其餘小夥伴使用的庫,這時就須要用到 output.library 與 output.libraryTarget,output.library 用來指定庫的名稱,output.libraryTarget 用來指定打包出來的規範,好比:commonjs二、amd、umd2等。
這一章咱們從 webpack 的配置文件 webpack.config.js 基本語法入手,講解了配置的基本用法以及 mode、context、entry、output基礎概念,但願能給你們帶來一些幫助,若是想了解更多,請持續關注個人文章。