require.js中的显式与隐式依赖关系处理

时间:2013-08-30 14:03:11

标签: javascript requirejs

我会以我实际做的为例。我有一个淘汰赛自定义绑定依赖于一个jquery插件,它本身依赖于jQuery UI,当然这取决于jQuery。还有另一个文件依赖于另一个插件,另一个文件依赖于jQuery UI等。在require.config.js中我有:

shim: {
    "jquery-ui": {exports: "$", deps: ["jquery"]},
    "jquery-plugin1": {exports: "$", deps: ["jquery-ui"]},
    "jquery-plugin2": {exports: "$", deps: ["jquery-ui"]}
}

这样可行,然后在相应的文件中我可以这样做:

define(["jquery-plugin1"], function ($) {

但是,我也可以这样做:

define(["jquery", "jquery-ui", "jquery-plugin1"], function ($) {

还有一种情况,文件可能依赖于两个插件:

// which one?
define(["jquery-plugin1", "jquery-plugin2"], function ($) {
define(["jquery", "jquery-ui", "jquery-plugin1", "jquery-plugin2"], function ($){

可能还有其他依赖项,例如敲除自定义绑定(不需要导出任何内容),所以我最终可能会:

define(["jquery-plugin1", "model1", "model2",
"ko-custom1", "ko-custom2", "ko-custom3",
"jquery-plugin2"],
function ($, m1, m2) {

这个文件也可能依赖于jQuery UI(取决于jQuery),但这些都是通过插件隐式加载的。

我的问题是,更好地明确所有要求(即在define中包含jQuery和jQuery-UI)并且可能不使用导出,或者是否是较为冗长的嵌套依赖处理首选?

1 个答案:

答案 0 :(得分:2)

这是一个很好的问题,在使用AngularJS依赖注入之类的东西时变得非常相关,因为在注册模块之前需要存在这些依赖项。所以这不起作用:

define(['angular'],function (angular) {
  return angular.module('myModule', ['mySubmodule']);
});

// Error: [$injector:nomod] Module 'mySubmodule' is not available!

您还需要定义AMD依赖关系:

define(['angular','./mySubmodule'],function (angular) {
  return angular.module('myModule', ['mySubmodule']);
});

这可能是主观的,但我发现通过让每个模块定义它自己的依赖显式并让requireJS解决它们而不是让它留给信仰超出范围的模块已经定义了它们,这打破了模块化。

通过这样做,您还可以知道您的AMD模块可以独立测试,而无需重新连接缺少的依赖项。