Require.js(almond.js)时间关闭

时间:2014-03-05 02:09:37

标签: requirejs requirejs-optimizer

我正在尝试使用Almond.js和Require.js优化器来创建一个可以在没有Require.js的情况下使用的独立文件。我已经能够成功编译该文件,所有代码都运行,但是有一个问题:代码执行顺序错误。

假设我的主文件(传递给优化器的include=选项中的文件)具有以下内容:

console.log('outside');
require(['someFile'], function(someModule) {
    console.log('inside');
    window.foo = someModule.rightValue;
});

然后在我的HTML中我有:

<script src="myCompiledFile.js"></script>
<script>
    console.log('out in the HTML');
</script>

由于我正在使用almond.js和一个已编译的文件(因此没有文件加载)我希望得到输出:

outside
inside
out in the HTML

然而,事实证明仍有一些异步性,因为我实际看到的是:

outside
out in the HTML
inside

如果我尝试从HTML中检查window.foo,那就不存在了。

所以,我的问题是,我怎样才能使代码更像普通/同步JS文件,在将内容传递到下一个script块之前先运行所有代码?我无法确切地告诉我的用户“将所有代码包装在window.setTimeout中”。

1 个答案:

答案 0 :(得分:2)

默认情况下,Almond复制RequireJS'require调用的计时语义。由于require在RequireJS中是异步的,因此它在Almond中也是异步的。这可以在source中轻松观察到:Almond使用setTimeout来安排模块的执行,即使它可以立即执行它。这是有道理的,因为在通用案例中,开发人员不希望他们精心设计的代码异步工作会因为他们使用Almond而突然变得同步。它在每个项目中无关紧要,但在一个项目中,UI(例如)应按特定顺序刷新,更改时序语义可能会破坏代码。

两个选项:

  • 作为setTimeout状态之前的评论,使用require('id')与Almond一起使用全球。这是因为一旦你的软件包被加载,一切都会被保证加载(因为杏仁不会动态加载)。

  • 还可以使用extra arguments来呼叫require。如果第四个参数为true,则调用将是同步的:

    require(['someFile'], function(someModule) {
        console.log('inside');
        window.foo = someModule.rightValue;
    }, undefined, true);
    

这可以通过阅读杏仁的代码来确定。我没有在forceSync上找到的文档(这是有问题的参数的名称),但有些错误报告mention it,我没有看到任何评论,它意味着它是一个私有功能。