1

我正在尝试将 bootbox ( 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 时,我必须在每次使用 requirejs 时传递bootbox变量并定义它才能使用bootbox. 我试过“出口”,但似乎没有帮助。

bootbox加载后如何让变量全局可用?

谢谢你。

4

2 回答 2

3

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

script如果您仔细执行,Tidoo 建议使用标签加载 Bootbox 是可行的。一方面,您必须在加载 RequireJS之前加载 Bootbox 。否则,它将检测到 RequireJS 已加载,确定它正在使用 AMD 加载程序运行,并将自身定义为 AMD 模块。这将导致来自 RequireJS 的不匹配匿名模块错误。另一件事是您必须在RequireJS之外加载 jQuery 并在Bootbox之前加载它。所以这是另一个script标签。

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

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

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

于 2014-04-28T16:37:57.617 回答
2

如果您希望 Bootbox 在全球范围内可用,您应该使用脚本标记手动包含它。RequireJS 不会公开它。

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

编辑: 正如 Louis 正确提到的那样, Bootbox 已经支持 AMD。如果它检测到 RequireJS(或任何其他 AMD 加载程序),它不会向全局范围公开任何内容,但由于它具有 AMD 支持,因此您也不需要填充它。

于 2014-04-28T07:52:45.587 回答