Webpack自定义Loader怎么处理异步逻辑?
我最近在写一个自定义的Webpack loader,需要读取文件并做一些异步处理(比如调用API或者读取其他资源),但发现直接用async/await好像不行,构建会卡住或者报错。我试过返回Promise,也试过用this.async(),但总是拿不到预期的结果。
比如下面这段代码,我想在loader里异步获取一些数据再拼接到源码里:
module.exports = function(source) {
const callback = this.async();
setTimeout(() => {
const result = source + 'n// injected by my loader';
callback(null, result);
}, 100);
}
但有时候callback没被调用,或者Webpack直接报“loader didn’t return a value”之类的错误。到底该怎么正确处理异步loader啊?
1. 必须确保callback被调用,而且只能调用一次。你例子里的setTimeout可能在某些情况下没执行完,建议加个catch处理错误:
2. 检查loader配置里有没有漏掉async标识。虽然Webpack 4+能自动检测,但显式声明更稳妥:
3. 如果还是有问题,试试用Promise.resolve包裹同步代码,保持统一接口:
遇到过最坑的情况是忘了return导致loader没结束,所以确保所有路径都有返回值。另外调试时可以用
this.emitWarning打日志看执行流程。