RequireJs扩展模块初始化开始和结束

时间:2014-02-13 12:13:02

标签: javascript requirejs prototype wrapping

我创建了一个可用于记录目的的JavaScript库 我也想支持requirejs的记录 requirejs的哪些函数/事件可以进行原型化/包装,这样我就可以在初始化模块时进行记录,并在初始化时返回初始化并返回初始化对象。

例如,如果我致电require(["obj1","obj2", "obj3"], function(obj1, obj2, obj3){} 我想知道requirejs何时开始初始化每个对象,我想知道每个对象何时完全初始化。
我查看了文档/代码,但找不到我可以从requirejs对象或require对象访问的任何有用函数。

注意:我不想更改现有的requirejs代码,我希望通过原型设计或包装从外部添加功能。

我尝试过的(问题是这只能访问整批模块的开头和结尾):

var oldrequire = require;

require = function (deps, callback, errback, optional) {
    console.log("start");
    var callbackWrapper = callback;

    callbackWrapper = function () {
        console.log("end");
        var args = new Array();
        for(var i = 0; i < arguments.length; i++) {
            args.push(arguments[i]);
        }
        callback.apply(this, args);
    };
    oldrequire.call(this, deps, callbackWrapper, errback, optional);
};

1 个答案:

答案 0 :(得分:1)

这是一个“总比没有回答”,不是一个明确的答案,但它可能会帮助你从另一个方向看。不确定这是好还是坏,当然是头脑风暴。

我最近研究了一个我必须包装的特定模块。我最后编写了第二个模块(“模块包装器”),为此我添加了一个带有原始模块名称(“模块”)的路径条目。然后我添加了第二个条目(“module-actual”),它引用了我require()作为包装器中的依赖项的实际模块。

然后我可以在初始化之前和之后添加代码,最后返回实际的模块。这对用户模块和实际模块都是透明的,从设计的角度来看非常简洁明了。

但是,在您的情况下手动创建每个模块的包装器显然是不切实际的,但您可能能够通过一些技巧动态生成它们。或者以某种方式找出用于从其中导入(唯一)包装器模块的名称,以便它可以依次动态导入关联的实际模块(使用异步require,这对用户代码不透明)。

当然,如果requirejs提供官方挂钩,那将是最好的。我从来没有在文档中看过这样的钩子,但如果你不比我更确定,你可能想再次浏览它们。