代码之家  ›  专栏  ›  技术社区  ›  Max Koretskyi

网页包插件-何时调用doResolve,何时回调?

  •  4
  • Max Koretskyi  · 技术社区  · 7 年前

    resolver.plugin(this.source, function(request, callback) {
        if (something) {
             resolver.doResolve(target, obj, "aliased with mapping '" + name + "': '" + ...)
        } else {
             callback(...);
        }
    

    谁能解释一下我应该什么时候打电话吗 doResolve

    要将请求传递给其他解析插件,请使用 这doResolve(类型:String | String[],请求:请求,回调) 方法

    然而,我不知道该怎么办。看来 多雷索夫 从一开始就启动流程。下面是堆栈在中的外观 多雷索夫 :

    enter image description here

    你可以看到这些阶段从一开始就开始了。为什么?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Max Koretskyi    7 年前

    Webpack使用运行解析程序的所有插件 applyPluginsAsyncSeriesBailResult1 这个 bail 这意味着一旦一个插件返回错误,序列就会中断。这种方法也称为“快速失败”。但是 BailResult

    applyPluginsAsyncSeriesBailResult1 = function applyPluginsAsyncSeriesBailResult1(name, param, callback) {
        var plugins = this._plugins[name];
        if(!plugins || plugins.length === 0) return callback();
        var i = 0;
        var _this = this;
        var innerCallback = function next(err, result) {
            // if the plugin returned an error or a result - break
            if(arguments.length > 0) return callback(err, result);
            i++;
            // if all plugins have run - break
            if(i >= plugins.length) {
                return callback();
            }
            // trigger next plugin - continue
            plugins[i].call(_this, param, innerCallback);
        });
        plugins[0].call(this, param, innerCallback);
    };
    

    从这段代码中你可以看到,只要你打电话 callback 打断 序列。第一个参数是误差,第二个参数是结果。这与 Node.js 回调 如果没有参数,序列是 继续的 .

    现在,你也可以打电话 doResolve 这将再次运行整个插件序列。这通常是在您对请求应用一些更改时完成的,因此您希望再次给所有其他插件一个机会来对新请求做出反应。因为你当前的插件将在下一天再次调用 path , request , query directory module 从以下来源可以看出匹配:

    Resolver.prototype.doResolve = function doResolve(type, request, message, callback) {
        var resolver = this;
        var stackLine = type + ": (" + request.path + ") " +
            (request.request || "") + (request.query || "") +
            (request.directory ? " directory" : "") +
            (request.module ? " module" : "");
        var newStack = [stackLine];
        if(callback.stack) {
            newStack = callback.stack.concat(newStack);
            if(callback.stack.indexOf(stackLine) >= 0) {
                // Prevent recursion
                var recursionError = new Error("Recursion in resolving\nStack:\n  " + newStack.join("\n  "));
    

    在回调中 你通常会打电话 callback() 在有机会对更新后的请求做出反应后,要想摆脱当前一轮的插件:

    resolver.plugin(this.source, function(request, callback) {
        if (something) {
             resolver.doResolve(target, obj, 
                   "aliased with mapping '" + name + "': '" + ..., 
                   function() { callback(error, result) }
             )