4

通常一个 requirejs 模块看起来像:

define('ModuleName', ['jquery', 'underscore', 'backbone'], function($, _, Backbone){

});

因为我的设置中的每个文件都需要下划线和主干,所以我希望它们在模块中自动可用,而不必将它们定义为依赖项。

所以像:

define('ModuleName', ['jquery'], function($){
    $("div.someClass").addClass('hide'); // works
    var Model = Backbone.Model.extend(); // works too
});

这可能吗?

如果是的话,我必须寻找的关键字是什么?

4

1 回答 1

2

您感兴趣的模块必须附加到外部范围。默认情况下,Backbone、Underscore、jQuery 等保持附加到全局范围,除非您对它们调用 noConflict()(并非所有模块都提供这种精确性)。将您的模块附加到全局范围不是一个很好的解决方案,但可以完成您的要求,并且无论如何都是默认行为。更好的选择是定义一个外部模块(或只是一个 require() 调用),除了您命名的子模块之外,它还包含这些依赖项。否则,使用 RequireJS 的大部分理由都会丢失。

编辑例如:

require(['underscore', 'backbone'],
    function (_, Backbone) {
        define('ModuleName', ['jquery'], function($){
            $("div.someClass").addClass('hide'); // works
            var Model = Backbone.Model.extend(); // works too
         });

        //Other modules here, otherwise this is pointless too
    }
);

即使这仅在您在同一个文件中定义多个命名模块时才有用。不幸的是,从我的角度来看,最好的解决方案是显式导入您的模块并允许隐式模块命名,但上面的示例最接近您的要求。至于隐式模块名称,来自RequireJS api docs

您可以自己显式命名模块,但这会降低模块的可移植性——如果将文件移动到另一个目录,则需要更改名称。

于 2012-07-07T06:10:39.680 回答