如何从Require.js导出全局变量?

mac*_*ost 9 requirejs almond

我正在尝试使用Require.js创建一个外部库.感谢Require.js没有正确编译单个js文件Require.js(almond.js)Timing Off我已经弄清楚如何将所有内容"编译"到一个优化/构建的文件中,并且该单个文件可以正常工作.只有一个问题:我无法弄清楚如何为我的库设置变量.

假设我希望我的库可以创建window.Foo.我尝试使用以下main.js文件:

window.Foo = require([], function() {
    window.Foo = {someValue: 1};
    return {someValue: 2};
});
Run Code Online (Sandbox Code Playgroud)

和一个包装器结束片段:

    return require('main');
}));
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我尝试通过window.Foo从require调用内部显式设置并通过结束片段的返回值从外部显式设置Foo来将Foo暴露给全局空间.但是没有人工作; 如果我console.log(window.foo)在加载构建文件后添加一个权限,它会告诉我这window.Foo是未定义的.

如果我做一个window.setTimeout window.Foo最终会设置(to {someValue: 1}),但我不能指望我的用户必须用超时包装所有代码.任何人都可以解释一下window.Foo我的优化/构建文件加载后如何定义?

Lou*_*uis 13

如果你按照詹姆斯的指示在这里,你可以很容易地制作设计的RequireJS模块捆绑,有人可以同步加载库.

我有一个github 存储库来说明整个事情.重点:

  • main模块出口Foo到全球空间:

    define('main', ["./modC"], function () {
    
    console.log("inside");
    window.Foo = {someValue: 1};
    
    return {someValue: 2};
    
    });
    
    Run Code Online (Sandbox Code Playgroud)

    它还返回一个由起始片段导出的值Bar(即所说的行root.Bar = factory();).因此,它说明了两种导出到全球空间的方法.

  • r.jsstarts 使用的包装器代码与同步形式require:

    require(`main`);
    
    Run Code Online (Sandbox Code Playgroud)

如果加载它,您将看到以下输出:

outside
loaded modC
inside
out in the HTML!
value of window.Foo: Object {someValue: 1}
value of window.Bar: Object {someValue: 2}
Run Code Online (Sandbox Code Playgroud)