我正在使用 requirejs 加载一些库和依赖项。
当我加载 jQuery 时,它完美地运行:
main.js
require.config({
shim: {
jquery: {
exports: '$'
}
},
paths: {
jquery: 'vendor/jquery'
}
});
require([
'vendor/jquery',
'app/init'
]);
应用/ init.js
define(
['jquery'],
function ($) {
$(document).ready(function () {
console.log('domready');
})
}
)
但是当我尝试添加下划线时,在网络面板中文件已正确加载但在控制台中我得到了
未捕获错误:模块的加载超时:下划线
发生了什么事? 我还尝试了require.config中的 waitSeconds:200 选项,但没有成功。
在最终(破损)代码下面作为参考:
main.js
require.config({
shim: {
jquery: {
exports: '$'
},
underscore: {
exports: '_'
}
},
paths: {
jquery: 'vendor/jquery',
underscore: 'vendor/underscore',
}
})
require([
'vendor/jquery',
'vendor/underscore',
'app/init'
])
应用/ init.js
define(
['jquery', 'underscore'],
function ($, _) {
$(document).ready(function () {
console.log('domready');
})
}
)
答案 0 :(得分:11)
在define
和require
来电中,您有时会将模块称为"vendor/<name of module>"
,有时称为"<name of module>"
。这是错的。根据您显示的配置,您应该在所有"<name of module>"
和require
来电中将您的模块称为define
。因此,请始终将jQuery和Underscore称为"jquery"
和"underscore"
,而不是"vendor/...
。当您使用完整路径引用它们时,可以绕过shim
配置。
实际上,您可以将require
来电更改为:
require(['app/init']);
你不需要在那里引用jQuery和Underscore。由于app/init.js
需要加载define
,因此会加载它们。
(另外,相对较新版本的jQuery不需要垫片,因为jQuery检测到它是由兼容AMD的加载器加载并调用define
本身。这不是问题的根源,但它是很高兴知道。)