2013-08-30 30 views
2

我將使用我實際正在做的事例作爲示例。我有一個淘汰賽的自定義綁定,這取決於jquery插件,它本身依賴於jQuery UI,當然取決於jQuery。有依賴於其他插件的另一個文件,並依賴於jQuery用戶界面等。在require.config.js另一個文件我有:require.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用戶界面(這取決於jQuery),但這些都是通過插件隱式加載的。

我的問題是更好地明確所有要求(即在define中包括jQuery和jQuery-UI),並且可能會取消導出,或者是不太詳細的嵌套依賴關係處理首選?

+0

我更喜歡將jQuery作爲一個全局變量 - 儘管有些人可能對此有強烈的觀點,但它讓事情變得更容易。在進行單元測試時,我運行的是使用Node中全局jQuery變量的相同腳本,所以它確實不是問題。你可能也可能包括jQuery UI作爲一個全局變量,但你真的需要它嗎?通常會有一個不那麼臃腫的庫,它可以滿足你需要的一切,甚至更好。但是如果你在應用程序中廣泛使用它,我也會把它放在全局命名空間中。您不必以這種方式處理墊片或加載訂單。 –

回答

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']); 
}); 

這可能是主觀的,但我覺得它更容易通過使每個原因吧模塊定義它自己的依賴關係明確並讓它們解決它們,而不是讓它保持高達信念超出範圍的模塊已經定義了它們,它們打破了模塊化。

通過這樣做,您也知道您的AMD模塊可以獨立測試,而不會重新連接缺失的依賴項。