Q4 · Webpack
是否写过 loader?简单描述一下编写 loader 的思路?
⚡ 速记答案(30 秒)
- 本质:输入字符串 → 输出处理后的字符串(或 Buffer)
- 导出一个函数
(source) => transformedSource,内部可以做 AST 处理、字符串替换等 - 优先保持无状态、纯函数,需要异步时使用
this.async() - 通过
this.query/this.getOptions()读取配置 - 返回的必须是 JS 源码字符串(或让下一个 loader 能识别的格式)
📖 详细讲解
Loader 本质
源代码 (String/Buffer)
↓ loader 处理
转换后的代码 (String/Buffer)编写要点
1. 同步 Loader
module.exports = function(source) {
return source.replace(/foo/g, 'bar');
};2. 异步 Loader
module.exports = function(source) {
const callback = this.async();
asyncTransform(source).then(result => {
callback(null, result);
});
};3. 获取配置
const options = this.getOptions();注意事项
• 保持无状态
• 处理错误要调用 callback(err)
• 可以返回 SourceMap
💻 代码示例
简单的 Markdown Loader
const marked = require('marked');
module.exports = function(source) {
// 1. 获取配置
const options = this.getOptions();
// 2. 转换 Markdown 为 HTML
const html = marked(source, options);
// 3. 返回 JS 模块
return `export default ${JSON.stringify(html)}`;
};面试技巧:回答工程化问题时,结合你实际项目中的配置和优化经验,更有说服力。