我正在使用AMD和RequireJS将项目从Dojo 1.6.1升级到带有新AMD加载器的Dojo 1.7.1。我必须处理旧的JavaScript文件,而不是作为AMD模块编写,并且必须以正确的顺序加载它们。
在我使用RequireJS订单插件之前,它似乎不适用于Dojo AMD Loader。我在loader文档或Dojo Build System文档中找不到任何相关内容。
对此有何想法?如果没有订单插件,我应该如何与Dojo 1.7一起处理纯JavaScript文件?我是否需要单独处理它们,或者在加载器或构建系统中是否有这方面的功能?
答案 0 :(得分:4)
我自己刚刚了解这一点,但我找到的文档提到了Generic Script Injection
按照文档中的说明加载通用脚本,同时指定{async:0}作为require()的配置选项。根据我的理解,这会按照您在第二个参数(包含脚本文件名/路径的数组)中指定的顺序加载脚本。
我的例子:
require({async:0},['test1.js','test2.js','test3.js'],function(){
//do stuff with reference to loaded scripts
});
我的本地测试显示我是否将配置更改为{async:1}脚本的加载顺序与我指定的顺序不同。到目前为止,我还没有在dojo加载器代码中跟踪它,但它似乎有意义,并且工作,并且不是黑客。
答案 1 :(得分:3)
我想为上述评论中提到的这种依赖模块提出另一种方法。问题是define
不接受async
参数。在require
函数中使用简单的define
会引入竞争条件,因为尚未执行所需模块的代码。
示例(错误):
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. })
但是,有一个解决此问题的方法。您需要返回一个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. }); });
答案 2 :(得分:2)
我认为插件通常不兼容AMD加载器。它不是最优的,但你可以使用dojo / text!有一个评估。这将在构建时内联内容。