gpt4 book ai didi

javascript - 在 requireJS 中访问主干对象而不定义它

转载 作者:行者123 更新时间:2023-12-02 16:08:28 24 4
gpt4 key购买 nike

我将 RequireJS 与 Backbone.js 结合使用。

在index.html中,我链接require.js并定义入口点start.js:

<script src="/app/vendor/require.js" data-main="/app/start"></script>

在 start.js 中,我配置 RequireJS 来访问 Backbone 库及其依赖项:

require.config({
paths: {
jquery: 'vendor/jquery',
underscore: 'vendor/underscore',
backbone: 'vendor/backbone'
},
});

要在此文件中使用 Backbone 模块,我可以将其定义为依赖项:

require(['backbone'], function (Backbone) {
console.log(Backbone);
});

但我定义为依赖子模块,其依赖项为 Backbone

start.js:

require.config({
paths: {
jquery: 'vendor/jquery',
underscore: 'vendor/underscore',
backbone: 'vendor/backbone'
},
});

require(['child'], function (Child) {
console.log(Backbone);
});

child.js:

define(['backbone'], function (Backbone) {});

为什么我可以在start.js中访问Backbone模块而不需要定义它?如果我使用任何其他自定义模块,我将收到错误。这仅适用于 Backbone 模块。

最佳答案

您的 require 调用需要您的 child 模块,而该模块又需要 backbone,因此在加载 child 时并且回调执行后,backbone 模块已加载。现在,让我们看看这个模块的作用:

if (typeof define === 'function' && define.amd) {
define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
// Export global even in AMD case in case this script is loaded with
// others that may still expect a global Backbone.
root.Backbone = factory(root, exports, _, $);
});
...

正如您所看到的,即使您将 Backbone 作为 AMD 模块加载,它仍然会将符号 Backbone 导出到全局空间。 (root 变量相当于浏览器中的 window 或 Node.js 中的 global。)这就是您的代码有效的原因。

对于我自己的工作,我会这样编写调用:

require(['backbone', 'child'], function (Backbone, Child) {

以避免依赖全局符号。 Backbone 的 future 版本在检测到它们作为 AMD 模块加载时可能停止导出全局符号。

关于javascript - 在 requireJS 中访问主干对象而不定义它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com