构建过程
- 初始化;
- 根据配置文件和 shell 语句读取参数;
- 初始化 plugin 和 loader;
- 编译构建流程;
- 从入口文件出发, 串行执行 module, 使用 loader 翻译 module;
- 找到依赖该 module 的 module, 递归进行编译构建;
- 如果定义了若干 plugin, 在对应生命周期拓展 Webpack 行为;
- 输出: 对于比那以后的 module 进行合并处理, 形成 chunk, 输出到文件系统;
loader 和 plugin
loader
- 对于模块进行转换, 在加载模块时处理文件;
- 将非 js 文件转换为 js 文件;
配置方式
- 配置文件定义;
- 内联方式: import 显示指定;
- cli: shell 命令指定;
- 链式调用;
- 在 loader 处理结果之后继续处理;
常见的 loader
- style-loader: css 添加到内联 style 中;
- css-loader: 允许 css 通过 require 引入;
- less-loader;
- sass-loader;
- postcss-loader;
- url-loader;
- html-minify-loader;
- babel-loader;
plugin
- 运行在 webpack 的生命周期的钩子之中;
- 拓展 webpack 的行为;
配置方式
- 配置文件定义;
- 内联方式: import 显示指定;
- cli: shell 命令指定;
常见的 plugin
- clean-webpack-plugin: 自动清理构建目录;
- mini-css-extract-plugin: 单独提取 css 至一个文件中;
- BabelMinifyWebpackPlugin: 使用 babel-minify 进行压缩;
- CopyWebpackPlugin: 将文件或目录复制到构建目录;
- DefinePlugin: 编译时创建全局对象;
loader 和 plugin 的不同
- loader;
- 文件夹加载器, 对于文件进行处理, 打包到指定文件中;
- 运行在文件打包之前;
- plugin;
- 拓展 webpack 功能, 解决 loader 无法实现的行为;
- 在 WebPack 整个生命周期运行;
- WebPack 基于订阅者模式实现事件机制, plugin 通过监听事件, 修改 WebPack 输出, 拓展其行为;