2012-01-11 117 views
5

我正在使用AMD和RequireJS將Dojo 1.6.1的項目從其新的AMD加載器升級到Dojo 1.7.1。我必須處理舊的JavaScript文件,而不是寫成AMD模塊,並且必須以正確的順序加載它們。RequireJS訂單插件和Dojo 1.7.1

在使用RequireJS訂單插件之前,它似乎不適用於Dojo AMD Loader。在loader文檔或Dojo Build System文檔中我找不到任何關於它的信息。

對此有何想法?如果沒有訂單插件,我應該如何處理普通的JavaScript文件和Dojo 1.7?我是否需要單獨處理它們,或者在裝載機或構建系統中是否有這些功能?

+0

你說的是模塊少的文件或舊款式同步的模塊? – hugomg 2012-01-11 16:03:05

+0

只是普通的JavaScript文件,就像jQuery(不能用作AMD模塊)一樣,可以用任何風格編寫。 – 2012-01-12 08:50:30

回答

4

我剛學這個我自己,但我發現的文件是指Generic Script Injection

裝入通用腳本,在該文檔中描述的那樣,同時指定{異步:0}爲需要配置選項() 。對此,我的理解,並加載腳本,你的第二個參數中指定(數組包含腳本文件名/路徑)

我的例子順序:

require({async:0},['test1.js','test2.js','test3.js'],function(){ 
    //do stuff with reference to loaded scripts 

}); 

我的本地測試顯示,如果我將配置更改爲{async:1}腳本以與我指定的順序不同的順序加載。到目前爲止,我還沒有在dojo加載器代碼中對它進行跟蹤,但它似乎是有意義的,並且工作,而不是黑客。

+0

我接受這個答案,因爲它的工作原理!我以這種方式創建了一個「依賴模塊」:define([「require」],function(require){require({async:0},[「script1.js」,「script2.js」,「script3.js」 ]);});'。我認爲這是一個好的解決方案。謝謝! – 2012-01-16 09:52:37

+0

一個警告,但。我還沒有進一步調查,但似乎(至少當你如上所述在一個單獨的模塊中加載腳本時)腳本加載的範圍與通過傳統腳本標記加載的範圍不同。例如,我必須用'window.uglyGlobal = true'替換'var uglyGlobal = true'。 – 2012-01-16 10:47:04

+0

用於'{async:1}'腳本的腳本注入方法使用注入的'

2

我不認爲插件在AMD裝載器中通常是兼容的。這不是最優的,但你可以使用dojo /文本!與評估。這將在構建時嵌入內容。

+0

你的意思是這樣嗎? 'define([「text!myScript」,「text!myScript2」],function(s,s2){eval(s); eval(s2)})' – 2012-01-12 09:18:46

+0

它可以工作,我在doh測試中使用它,但我不願意將其標記爲接受的答案,這是一個黑客=) – 2012-01-12 12:41:10

3

我想爲上述評論中提到的這種依賴模塊提出另一種方法。問題是define不接受async參數。在define函數中使用簡單的require會引入競爭條件,因爲所需模塊的代碼尚未執行。

實施例(WRONG):
oldCode.js

 
window.foo = function(){}; 

legacyWrapper.js

 
define(["require"],function(require){ 
    require({async:0},["./oldCode"]); 
}) 

code.js

 
define(["./legacyWrapper"],function(){ 
    window.foo(); //throws exception, foo has not been loaded yet. 
}) 

jsFiddle demo

然而,這個問題有一個解決方案。您需要返回一個Deferred,只要所有模塊都加載完畢即可解決。以下示例按順序加載a,b,c,d。

 
define(["require","dojo/Deferred"],function(require,Deferred){ 
    var def = new Deferred(); 
    require({async:0}, 
      ["./moduleA", 
      "./moduleB", 
      "./moduleC", 
      "./moduleD"], 
      function(){ 
     def.resolve(); 
    }); 
    return def; 
}) 

要moduleA定義的訪問屬性,你現在可以使用

 
require(["legacyDeps"],function(legacyDeps){ 
    legacyDeps.then(function(){ 
     //It's save to assume that all legacy modules have been loaded here. 
    }); 
});