2012-01-16 67 views
9

我正在为使用RequireJS的应用程序编写一些测试。由于应用程序的工作原理,期望通过调用require来获得一些类。所以,为了测试,我有一些虚拟类,但我不想将它们放入单个文件中,仅用于此测试。我更喜欢只define()他们手动在我的测试文件像这样:定义模块并立即使用它们RequireJS

define('test/foo', function() { 
    return "foo"; 
}); 

define('test/bar', function() { 
    return "bar"; 
}); 

test("...", function() { 
    MyApp.load("test/foo"); // <-- internally, it calls require('test/foo') 
}); 

的这里的问题是,这些模块的评价被延迟,直到剧本的onload事件被触发。

require.js around line 1600

//Always save off evaluating the def call until the script onload handler. 
//This allows multiple modules to be in a file without prematurely 
//tracing dependencies, and allows for anonymous module support, 
//where the module name is not known until the script onload event 
//occurs. If no context, use the global queue, and get it processed 
//in the onscript load callback. 
(context ? context.defQueue : globalDefQueue).push([name, deps, callback]); 

有一些方法我可以手动触发队列进行评估?

回答

0

模块定义应限制为每个文件一个(请参阅here)。我猜想在单个文件中定义多个模块会破坏内部加载机制,这会依赖脚本的加载事件来确定它在解决依赖性时已准备就绪。

即使它只是用于测试,我建议将这些定义分成多个文件。

希望有帮助!干杯。

+0

您可以添加每个文件多个模块(当你优化+运行如下整个应用程序考虑),你只需要给每个模块一个特定的名字(参见OP中每个'define'函数的第一个字符串参数)。 – nickf 2012-01-16 18:17:08

+0

此外,这些模块仅用于测试,它们非常**基本。比上面的例子稍微复杂一些,但不是很多。将每个文件放在自己的文件中会太麻烦。 – nickf 2012-01-16 18:18:17

+0

当然,我明白了。但从我可以从文档中知道的情况来看,在具有多个模块的单个文件的唯一情况下是在优化/构建步骤发生之后。说实话,我不熟悉requirejs,但是我已经将它用于几个项目。但文档非常清晰:'磁盘上每个文件只能有一个*模块定义。这些模块可以通过优化工具分组到优化的捆绑包中。'我会从那里开始:) – keeganwatkins 2012-01-16 18:34:08

1

我发现到目前为止是异步要求模块的最佳:

define("test/foo", function() { ... }); 
define("test/bar", function() { ... }); 

require(["test/foo"], function() { 
    var foo = require('test/foo'), 
     bar = require('test/bar'); 
    // continue with the tests.. 
}); 
相关问题