我常常用 webpack
,打算作一次比較詳細的概念清點和梳理。從 0 配置 webpack
,因爲 webpack5
(2019.07.27)暫時尚未發佈。而且從Webpack Milestones上來看,截止到 7 月 27 日,完成度是 64%。有喜歡鑽研的同窗能夠去研究一下 5,個人重點仍是當前 4.X。javascript
因爲是概念清點,先從最基礎的開始。css
mkdir webpack-test cd webpack-test npm init -y npm i --save-dev webpack
接下來,新建一個src
目錄,建立index.js
,而後在package.json
的scripts
下加入java
"scripts": { "webpack": "webpack" }
接着在當前目錄啓動終端,輸入node
npm run webpack
這個時候就能看到webpack
把src
入口的index.js
打包到dist
目錄下的main.js
。webpack
因爲parcle
宣傳約定先於配置的火爆,webpack
在 4.X 中也加入了默認配置,即若是沒有webpack.config.js
或者沒有配置入口entry
,則默認爲src/index.js
。同理,默認的輸出output
s 是dist/main.js
。git
webpack
有五個概念須要瞭解。github
entry
用來告訴webpack
應該從哪一個 JS 文件開始去尋找相關依賴,而且把它們打包成一個或者多個 bundle,最終輸出到指定目錄。默認值爲./src/index.js
,能夠有多個 entry。經常使用的配置以下:web
// 單文件 module.exports = { entry: "./src/file1.js" }; // 單文件數組,不經常使用,默認打到一個文件中 module.exports = { entry: ["./src/file1.js", "./src/file2.js"] }; // 將輸出 // dist // └── main.js // 多文件對象,經常使用,會分entry入口打包,輸出文件名爲entry配置的key module.exports = { entry: { file1: "./src/file1.js", file22: "./src/file2.js" } }; // 將輸出 // dist // ├── file1.js // └── file22.js
output
就是用來指定把 bundle 輸出到哪裏的配置,默認值爲./dist
。
output
有兩個配置項:npm
// 默認配置 const path = require("path"); module.exports = { output: { filename: "main.js", path: path.join(__dirname, "dist") } };
若是有多個入口,則可使用佔位符來指定文件名,或者添加 hash 等。json
module.exports = { output: { filename: "[name].[hash:16].js", path: path.join(__dirname, "dist") } };
loader
主要用來預處理各類文件。好比咱們經常使用的babel-loader
,css-loader
。
在使用以前,須要先安裝
npm install --save-dev css-loader style-loader npm install --save-dev babel-loader @babel/core @babel/preset-env
爲文件加入loader
配置
module.exports = { module: { rules: [ { test: /\.css$/, use: ["style-loader", "css-loader"] }, { test: /\.jsx?$/, exclude: /node_modules/, use: { loader: "babel-loader", options: { presets: ["@babel/preset-env"] } } } ] } };
插件機制給webpack
提供了更多自定義的能力。webpack
的plugin
具備apply
方法,而且會在webpack
編譯時調用,經過在plugin
對象中對webpack
提供的各類hook
作操做,達到咱們修改bundle
的目的。
官網的一個例子:
const pluginName = "ConsoleLogOnBuildWebpackPlugin"; class ConsoleLogOnBuildWebpackPlugin { apply(compiler) { compiler.hooks.run.tap(pluginName, compilation => { console.log("webpack 構建過程開始!"); }); } }
mode
比較簡單,一般來講,有兩種內置mode
,development
和production
,能夠經過webpack.config.js
配置,或者經過CLI
參數傳遞。
module.exports = { mode: "production" };
webpack --mode=production
設置了mode
以後,nodejs
進程中的process.env.NODE_ENV
也會被同步設置。
webpack
對於mode
有一些本身的區分,在production
模式下,會打開代碼壓縮、去除一些熱更新的代碼等,在生產環境中切記要將mode
設置爲production
。