【发布时间】:2013-11-15 16:48:54
【问题描述】:
我很难理解为什么加载了 RequireJS 的模块无法访问 define 函数。
在我的 HTML 中:
<script data-main="/assets/js/app/main.js" src="/assets/libs/require.js/2.1.9/require.js" type="text/javascript"></script>
在main.js:
// Initialize Require.js
require.config({
baseUrl: 'http://test.dev/cart/assets',
paths: {
jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min'
}
});
// Main app logic
require( ['jquery',
'js/app/cart',
'js/app/wizard',
'js/lib/colorbox',
'js/lib/jvfloat'], function ($, Cart, Wizard, ColorBox, jvfloat) {
// Initialize Cart
Cart.init();
// Initialize Wizard
Wizard.init();
}
);
在这方面,colorbox.js 加载得很好,并且包装如下:
define(['jquery'], function ( jQuery ) {
// ...Colorbox code here
});
当它尝试加载 jvfloat.js 时,它会抛出:
未捕获的引用错误:未定义定义
即使它使用 exact 与 colorbox 相同的包装器进行包装。
我什至尝试过添加一个垫片(没有意义),看看我是否可以强制加载......但这也不起作用:
shim: {
'jvfloat': {
deps: ['require','jquery'],
exports: 'jvfloat'
}
}
我还尝试删除 define 包装器,并像这样设置我的垫片,这就是 documentation suggests to do it:
shim: {
'jvfloat': {
deps: ['jquery'],
exports: 'jQuery.fn.jvfloat'
}
}
TL;DR; 什么会导致 RequireJS 加载的库无法访问 define 函数?
【问题讨论】:
-
如果 jvfloat 的包装方式与 colorbox 相同,为什么要使用
shim?shim用于没有用define包裹的模块。 -
我说我什至尝试过使用垫片。我理解它的目的。 jvFloat 是一个 jQuery 插件,因此,为了确保它具有它的依赖关系,我试图让它与 RequireJS 一起工作,并确保插件被添加到同一个 jQuery 实例中RequireJS 绕过。
-
我想我专注于代码块并错过了上面的简短描述。我的错误...这看起来确实是一种非常奇怪的行为,
define在全局范围内,并且应该在它没有被遮蔽的任何地方都可见。
标签: javascript requirejs amd