我会以我实际做的为例。我有一个淘汰赛自定义绑定依赖于一个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)并且可能不使用导出,或者是否是较为冗长的嵌套依赖处理首选?
答案 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模块可以独立测试,而无需重新连接缺少的依赖项。