Q: Loader 和 Plugin 的区别是什么?它们各自的使用场景?
这两个是 Webpack 扩展能力的核心。
对模块的转换。
Webpack 本身只知道如何处理 JavaScript 和 JSON 文件。Loader 让 Webpack 能够去处理其他类型的文件 (如 .css, .scss, .ts, .vue, .png),并将它们转换为 Webpack 能够理解的有效 模块 (Module)。
input (source code) -> transform -> output (javascript code)。module.rules 中配置,在解析模块时执行。babel-loader, css-loader, style-loader, file-loader, ts-loader。对构建流程的扩展。 Webpack 在运行生命周期中会广播出许多事件。Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的 API 改变输出结果。它的功能范围更广,甚至可以修改编译器 (Compiler) 本身。
apply 方法的类。HtmlWebpackPlugin (生成 index.html), DefinePlugin (注入环境变量), CleanWebpackPlugin (清空 dist), MiniCssExtractPlugin (提取 CSS 为独立文件)。从右到左,或者说 从下到上。
sass-loader: 把 SCSS 编译成 CSS。css-loader: 把 CSS 转换成 CommonJS 模块 (处理 @import/url())。style-loader: 把 JS 字符串生成 style 节点插入 HTML 的 head 中。当 Loader 无法满足需求时。比如: