2012-01-11 37 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. 
    }); 
});