在requireJS内部访问骨干对象而不定义它
Accessing backbone object inside requireJS without defining it
我使用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中访问主干模块而不定义它?如果我将使用任何其他自定义模块,我会收到错误。
你的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 的未来版本可以在检测到它们作为AMD模块加载时停止导出全局符号。
相关文章:
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- 在setInterval函数之前声明时未定义对象
- 使用数组自定义对象
- 使用带有自定义对象作为属性的jQuery.extend时出现意外行为
- 在JavaScript中定义自定义对象和函数(第2部分)
- 在JavaScript中定义自定义对象和函数
- 使用+=运算符未定义对象中的第一个元素
- 是否可以在定义对象时访问对象值
- 通过 Requirejs 传递的未定义对象
- 如何获得一个动态增长的自定义对象的Javascript数组
- Angular Schema Form-自定义对象编辑器
- 使用JavaScript将自定义对象添加到文档中
- 对象-在定义对象之前先调用对象
- 序列化具有方法的自定义对象.序列化后删除的方法-要采取的步骤
- 正在将img/文件上载到Quickbloxx自定义对象API
- 生成自定义对象调用
- 将自定义对象的猫鼬 PUT 实现到复杂架构中时出现问题
- 在定义对象后在对象上定义函数
- 如何在 Javascript 中制作自定义对象数组
- 使 HTML 元素从自定义对象继承事件