真实面经题目 · 原创解析
webpack 的 loader 和 plugin 的区别
这题考察 Webpack 扩展机制的职责边界。高质量回答要说明 loader 处理单个模块内容,plugin 参与构建生命周期,并能说清执行时机和典型场景。
真实面经题目 · 原创解析
这题考察 Webpack 扩展机制的职责边界。高质量回答要说明 loader 处理单个模块内容,plugin 参与构建生命周期,并能说清执行时机和典型场景。
Loader 面向模块内容转换,接收源文件内容,按链式规则从右到左或从后到前执行,最终返回 JS 模块代码或资源描述,比如把 TS、Less、字体资源转成 Webpack 能处理的模块。Plugin 面向构建流程扩展,通过 compiler 和 compilation 的 hooks 参与从初始化、编译、优化到输出的生命周期,可做 HTML 注入、环境变量、资源压缩、产物分析等。简单说,loader 转文件,plugin 管流程。
loader 解决某类资源如何变成模块的问题;plugin 解决构建过程某个阶段要额外做什么的问题。一个偏局部转换,一个偏全局流程。
loader 配在 module.rules 中,匹配单个资源后按链式顺序执行。它可以接收源码和 source map,返回转换后的代码,也可以异步处理文件内容。
plugin 通常是带 apply 方法的对象或类实例,挂到 plugins 数组。Webpack 启动后把 compiler 传给 apply,plugin 再注册不同生命周期钩子。
loader 主要发生在模块构建阶段,每个匹配模块都会执行;plugin 可贯穿整个构建,从环境初始化、模块解析、chunk 优化到资源输出都能介入。
babel-loader 处理 JS 语法转换,css-loader 处理 CSS 依赖,style-loader 注入样式;HtmlWebpackPlugin 生成 HTML,DefinePlugin 注入编译期常量,MiniCssExtractPlugin 抽离 CSS。
Webpack plugin 和 Babel plugin 不是同一层概念。Babel plugin 工作在 Babel 转换 AST 的阶段,Webpack plugin 工作在 Webpack 构建生命周期。
一个资源可能需要多步转换,例如 Less 先转 CSS,CSS 再解析依赖,最后注入页面或抽离文件。链式设计让每个 loader 只做单一职责。
pitch 是 loader 正常执行前的前置阶段,可用于短路后续 loader 或做资源准备。多数业务面试不要求展开,但知道它说明对 loader 流程更熟。
因为 plugin 能访问 compiler、compilation、assets、chunks、modules 等构建上下文,可以在多个生命周期阶段读写构建状态。
抽离 CSS 涉及跨模块收集、生成独立 asset、处理 chunk 关系和输出文件,不只是单个 CSS 文件转换,因此需要 plugin 参与产物阶段。