访问 requireJS 中的 backbone 对象而不定义它
Accessing backbone object inside requireJS without defining it
我将 RequireJS 与 Backbone.js 一起使用。
In index.html I link 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 模块加载,它仍然会向全局 space 导出符号 Backbone
。 (root
变量相当于浏览器中的 window
或 Node.js 中的 global
。)这就是您的代码有效的原因。
为了我自己的工作,我会这样写调用:
require(['backbone', 'child'], function (Backbone, Child) {
以免依赖全局符号。 Backbone 的未来版本可能会 在检测到它们作为 AMD 模块加载时停止导出全局符号。
我将 RequireJS 与 Backbone.js 一起使用。
In index.html I link 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 模块加载,它仍然会向全局 space 导出符号 Backbone
。 (root
变量相当于浏览器中的 window
或 Node.js 中的 global
。)这就是您的代码有效的原因。
为了我自己的工作,我会这样写调用:
require(['backbone', 'child'], function (Backbone, Child) {
以免依赖全局符号。 Backbone 的未来版本可能会 在检测到它们作为 AMD 模块加载时停止导出全局符号。