Webpack插件,在构建虚拟模块时?

时间:2016-05-23 04:25:42

标签: webpack

我制作一个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",中解决承诺。但这似乎不起作用。我无法找到合适的地方来解决承诺/进行构建。

0 个答案:

没有答案