我正在尝试使用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
变量全局可用?
谢谢。
答案 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,因此您也不需要对其进行填充。