我常常用 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
。