requirejs导出全局变量

时间:2014-04-28 07:47:00

标签: javascript jquery requirejs bootbox

我正在尝试使用bootj(http://bootboxjs.com)和requirejs。

main.html中

<script>
var require = {
    baseUrl: 'js',
    paths: {
        "jquery"    :['jquery-1.11.0.min'],
        "bootbox"   :['bootbox.min'],
        "bootstrap" :['//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min']
    },
    shim:
        'bootstrap' :{deps:['jquery']},
        'bootbox'   :{deps:['bootstrap'],exports: 'bootbox'}
    }
}
</script>
<script src="require.min.js"></script>
<script src="myscript1.js"></script>

main.js

define(['bootbox'],function(bootbox){
    bootbox.alert("Hello world!"); // working properly
});

myscript1.js

require(['main'],function(){
    bootbox.alert("Hello world!"); // not functioning (bootbox is not defined)
});

通常一旦加载了bootbox插件,我们就可以在页面的任何地方使用bootbox:bootbox.alert("Hello world!");当使用requirejs时,我必须传递bootbox变量并在每次按顺序使用requirejs时定义它使用bootbox。我尝试过“出口”,但似乎没有帮助。

加载后,我们如何才能使bootbox变量全局可用?

谢谢。

2 个答案:

答案 0 :(得分:3)

这是交易。 Bootbox检测它是否在AMD加载器中运行(如RequireJS)。如果是这样,它将不会将任何内容导出到全局空间,而是将自己定义为AMD模块,由AMD加载器加载。

Tidoo建议加载带有script标记的Bootbox,如果你仔细的话。你需要加载Bootbox 之前加载RequireJS,一件事。否则,它将检测到RequireJS已加载,确定它是否与AMD加载程序一起运行,并将自身定义为AMD模块。这将导致RequireJS出现不匹配的匿名模块错误。另一件事是你必须加载jQuery 外部 RequireJS并在 Bootbox之前加载。这是另一个script标签。

我建议通过简单地修改代码来添加所需的依赖项来避免该解决方案:

require(['bootbox', 'main'],function(bootbox){
    bootbox.alert("Hello world!");
});

此外,您不得对Bootbox 使用shim配置,因为它会检测是否有AMD加载程序,如果检测到,则会自行调用define。仅对不调用shim的代码才需要define配置。

答案 1 :(得分:2)

如果您希望Bootbox全局可用,则应使用脚本标记手动包含它。 RequireJS不公开它。

但是,我强烈建议不要这样做。依赖框架(如RequireJS)的整个概念是,您不在全局范围内定义任何内容,而是使您的依赖项显式化。这不仅允许您延迟加载脚本,而且还可以在以后替换依赖项,例如用于单元测试。

编辑: As Louis correctly mentioned Bootbox已经获得了AMD的支持。如果它检测到RequireJS(或任何其他AMD加载程序),它不会向全局范围公开任何内容,但由于它支持AMD,因此您也不需要对其进行填充。