2011-12-22 59 views
4

我正在編寫使用requireJS的第三方JS應用程序,並且我想保留全局名稱空間除了將由我的應用程序創建的單個全局接口對象之外的所有內容。除了requireJS,我沒有任何問題。如何將requireJS函數保存在全局名稱空間之外?

作爲優化器的一個選項,可以將require.js捲入構建中,並且可以定義名稱空間使優化器將所有引用都要求函數作用於該名稱空間。

例如。需要(...)變成my_scope.require(...)

問題是,這個全局命名空間對象將不會存在,直到它在應用程序中創建。優化器確保requireJS加載&在它加載的任何代碼之前執行,因此當執行require函數(如require或define)時,會引發異常(名稱空間對象未定義)。

是否有人成功地做到了這一點,而無需手動更改構建的腳本或運行與構建腳本分開的另一個腳本?換句話說,是否有適當的方法來實現這一目標?

回答

5

對於其他人一直在尋找這個問題的答案,在這裏,它是在一堆使用過的彎頭油脂中找到的。

在構建配置選項中,忘記使用namespace。有一個屬性「wrap」允許你用你選擇的代碼包裝整個構建腳本。

簡單地把它定義爲下面創建周圍的一切局部範圍(包括requireJS功能):

require.config({ 
    wrap: { 
     start: "(function() {", 
     end: "}());" 
    } 
}) 
0

我的看法是,requirejs,和一般的模塊裝載機,有不同的方法來減少全球混亂比命名空間。使用require,您不需要將事物附加到全局名稱空間,只需在閉包中使用require方法調用即可獲取本地作用域引用。

因此,你需要對所有其他需要附加的東西進行折衷處理(比如window.require)。

在一個命名空間的實現,你會使用類似

var foo = window.my_scope.foo.bar 

隨着模塊裝載機,你會使用一個電話要求。在CommonJS的模塊加載的情況下,你會做這樣的事

var foo = require("my_scope/foo/bar") 

RequireJs更增添了些許複雜,是因爲它是一個AMD模塊加載,但這是另一個整個談話本身就是!

+0

不幸的是,即使加載require.js也會將requireJS函數添加到GNS中。通過要求加載非AMD腳本也不能提供保持GNS不增長的好方法。 – 2012-01-12 01:13:24

相關問題