requirejs没有使用shim将本地jquery暴露给jquery插件

时间:2013-07-10 15:23:20

标签: javascript jquery jquery-plugins requirejs almond

我已经使用require编写了一个jQuery插件,用杏仁包装它,并通过另一个应用程序中的shim配置加载它。不幸的是,require将全局jQuery暴露给插件而不是本地插件。我的代码:

plugin.js

(function() {
    // almond code
    // other dependencies
    require(dependencies, function (dependencies) {
        !function($) {
            // window.jQuery == $ -> true
            $.fn.plugin = function(options) { return this; }
        }(jQuery);
    });
})();

main.js

require.config({
    paths: { 'jquery': 'vendor/jquery-1.9.1.min' },
    shim: { 'plugin': ['jquery'] }
});

require(['jquery','plugin'], function ($) {
    // window.jQuery == $ -> false
    $('#plugin').plugin(options);
    // error, object [Object object] has no method "plugin"
);

不应该填充插件代码,将本地jQuery模块暴露给插件的全局范围?

1 个答案:

答案 0 :(得分:3)

我认为问题在于您尝试将shim与AMD模块一起使用,而实际上该功能是针对非AMD模块设计的。来自that section of the documentation

  

请记住:仅对非AMD脚本使用shim config,而脚本尚未调用define()。如果在AMD脚本上使用,则shim配置将无法正常工作,特别是,不会触发exports和init配置,并且deps配置会对这些情况造成混淆。

如果您希望将jQuery保留在全局范围之外并仍然将其与其他模块一起使用,则可以遵循Mapping Modules to use noConflict方法:

  

如果所有模块(包括依赖于jQuery的任何第三方jQuery插件或库代码)都是AMD兼容的,并且您希望在调用require时避免在全局命名空间中使用$或jQuery(['jquery']) ,您可以使用map config将jQuery的使用映射到一个调用noConflict的模块,并为'jquery'模块ID返回jQuery的值。

另请参阅Using private jquery with RequireJS - issue after optimisation以获取分步示例。