2013-05-03 35 views
2

RequireJS提供了用於加載不支持AMD的傳統/舊式庫的Shim配置。 shim配置允許將所述庫導出到變量。RequireJS Shim配置爲下劃線

'backbone' : { 
      deps : ['underscore', 'jquery'], 
      exports : 'Backbone' 
} 

如上所示,Backbone與AMD不兼容,因此shim配置用於將庫導出到變量。同樣,這可以爲Underscore完成。

'underscore' : { 
      exports : '_' 
} 

但即使我們沒有指定填充配置爲Underscore,它仍然工作正常。怎麼樣 ?有人可以對此有所瞭解嗎?

回答

3

骨幹有下劃線的依賴。沒有必要通過需求和其他東西(如墊片)來獲得這種依賴關係。
骨幹只能期望_在全局命名空間中包含下劃線庫的接口。

當您需要主幹時,我們作爲應用開發人員使用shim選項和deps屬性來提供依賴關係,以說明此特定模塊的所有依賴關係。

只有在引用非AMD模塊(如主幹或_)時,exports屬性才能告訴require使用全局名稱空間中的屬性。

所以要回答你的問題。如果你沒有提供shim config下劃線,你的下一行將失敗。

var _ = require('underscore'); 

變量_在本地命名空間會在這種情況下是不確定的,和骨幹將使用_從全局命名空間。

回答你的疑問。它如何在骨幹源中起作用。

// Require Underscore, if we're on the server, and it's not already present. 
    var _ = root._; 
    if (!_ && (typeof require !== 'undefined')) _ = require('underscore'); 

上面是主幹源的摘錄,它需要下劃線。 從上面的評論可以明顯看出,這個要求是針對服務器端的。 在瀏覽器中的根對象指的是窗口。所以你的第一個檢查「!_」在瀏覽器中返回false,原因_在gloabl對象窗口中可用。所以這個require不會在瀏覽器中發生(如果下劃線已經存在)。

2

它的工作原理是因爲下劃線定義了在Backbone中使用的全局變量_,而Backbone的shim配置正確設置了依賴關係,因此下劃線和jquery在Backbone之前加載。

但是,如果你沒有爲下劃線墊片配置,然後嘗試將其導入您的模塊中它不應該工作:

define(['underscore'], function(_) { 

}) 
+0

我還是不明白,因爲即使我們沒有指定用於下劃線的填充,當骨幹在內部需要下劃線時,它是如何工作的?主幹源代碼顯示它需要下劃線。 – SrikanthManian 2013-05-03 09:28:09

+0

主幹只需要'_'作爲全局變量。在Backbone正常工作之前,應該包含下劃線腳本。 – 2013-05-03 09:52:01