你是如何使用 BlockUI 的?您是需要它还是将其用作依赖项?取自 RequireJS 网站:
如果您在 HTML 中手动编写脚本标记以通过匿名 define() 调用加载脚本,则可能会发生此错误。
如果您在 HTML 中手动编写脚本标记以加载具有几个命名模块的脚本,然后尝试加载一个匿名模块,该模块最终与手动加载的脚本中的一个命名模块具有相同的名称,也可以看到编码的脚本标签。最后,如果您使用加载器插件或匿名模块(调用 define() 且没有字符串 ID 的模块)但不使用 RequireJS 优化器将文件组合在一起,则可能会发生此错误。
优化器知道如何正确命名匿名模块,以便它们可以与优化文件中的其他模块组合。为避免该错误:确保通过 RequireJS API 加载所有调用 define() 的脚本。不要在 HTML 中手动编写脚本标记来加载其中包含 define() 调用的脚本。如果您手动编写 HTML 脚本标记,请确保它仅包含命名模块,并且不会加载与该文件中的模块之一同名的匿名模块。如果问题是使用加载器插件或匿名模块但 RequireJS 优化器未用于文件捆绑,请使用 RequireJS 优化器。
http://requirejs.org/docs/errors.html
如果你使用 jQuery 和 BlockUI 作为模块,它会工作得很好:
require.config({
'paths': {
'jquery': 'http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min',
'blockUI': 'http://malsup.github.com/jquery.blockUI'
},
'shim': {
'blockUI': ['jquery']
}
})
require(['blockUI'], function(){
// Don't return a value to the callback as it just augments the $.fn
console.log($.fn.block);
console.log($.fn.unblock);
});
示例 - http://jsfiddle.net/Blink/ae4nr/
BlockUI 底部到底发生了什么?jQuery 在源码底部将自己暴露为 AMD 模块,为什么 BlockUI 会做类似的事情?
这是一种用插件等支持 AMD 的已知技术。将代码包装在函数中意味着window.jQuery
如果没有 AMD 存在,则可以传入,否则可以将函数传递给define
,然后一旦加载,jQuery 将传递给它。无论哪种方式,所有插件代码都关心接收用作 $ 的 jQuery 对象。
将“jquery”定义为路径是与 AMD 一起使用它的要求,因此插件作者可以安全地假设“jquery”将被定义:
define(['jquery'], setup);