我制作一个webpack插件,从javascript文件中提取内容,然后注入一个从该内容生成的新模块。
我以这种方式提取内容:
var content = [];
compiler.parser.plugin("call " + this.functionName, function (expr) {
//example of extraction:
content.push(this.evaluateExpression(expr.arguments[0]).string);
});
以这种方式注入新模块:
var needRebuild = true, source = '';
var buildPromise = Promise.resolve();
var listModule = new Module(); //TODO refactor and extend Module
listModule.identifier = listModule.readableIdentifier = function () {
return listModuleName;
};
listModule.needRebuild = function () {
return needRebuild;
};
listModule.build = function (options, compilation, resolver, fs, callback) {
var that = this;
//Here is my problem. For now I try to delay the build with a promise.
buildPromise.then(function () {
//example of source generation
source = "module.exports=" + JSON.stringify(content, null, ' ') + ';';
needRebuild = false;
callback();
});
};
listModule.source = function () {
if (this.useSourceMap) {
return new OriginalSource(source, this.identifier());
} else {
return new RawSource(source);
}
};
listModule.size = function () {
return source.length || -1;
};
compiler.plugin("normal-module-factory", function (normalModuleFactory) {
normalModuleFactory.plugin("resolver", function (next) {
return function (data, callback) {
if (data.request === listModuleName) {
return callback(null, listModule);
}
return next(data, callback);
}
});
});
所以我的问题是在解析所有内容之前,虚拟插件的构建太快了。
我尝试用承诺延迟构建,并在例如compiler.plugin("compilation",
中解决承诺。但这似乎不起作用。我无法找到合适的地方来解决承诺/进行构建。