0

为了让 jQuery 连接到 require.js,必须在 require.js之后加载 jQuery 。这很好用,但是一旦我包含一个名为 BlockUI 的 jQuery 插件,它会做一些奇怪的 AMD 东西(参见 BlockUI 源代码的底部),我会得到一个不匹配的错误。我知道 BlockUI 导致了这种情况,因为不匹配错误会吐出整个源,如果我删除 BlockUI,一切正常。是否使用 require.js 无关紧要;仅仅包括图书馆就足够了。

看到这个jsfiddle:http: //goo.gl/4tYE7

切换到左侧的 Resources 选项卡,以验证所有脚本是否以正确的顺序加载。都好?好,现在打开控制台。战俘!到处都是血!

我不确定这是 Require.js 还是 BlockUI 错误(我打赌 BlockUI,因为它有点过时了),但是有什么解决方法吗?BlockUI 底部到底发生了什么?jQuery 在源码底部将自己暴露为 AMD 模块,为什么 BlockUI 会做类似的事情?

我对 BlockUI 的加载没有太多控制,因为它是由 Wordpress 插件(Jigoshop)加载的,所以让它工作非常重要。

4

1 回答 1

4

你是如何使用 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);
于 2013-02-18T17:01:43.193 回答