2

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

插件.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"
);

shim 不应该加载将本地 jQuery 模块暴露给插件全局范围的插件代码吗?

4

1 回答 1

3

我相信问题在于您正在尝试使用shimAMD 模块,而实际上该功能是为非 AMD 模块设计的。从文档的该部分

请记住:仅对非 AMD 脚本、尚未调用 define() 的脚本使用 shim 配置。如果在 AMD 脚本上使用 shim 配置将无法正常工作,特别是不会触发 export 和 init 配置,并且 deps 配置在这些情况下会令人困惑。

如果您想将 jQuery 排除在全局范围之外并仍将其与其他模块一起使用,则可以按照Mapping Modules 使用 noConflict方法:

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

另请参阅Using private jquery with RequireJS - issue after optimization的分步示例。

于 2013-07-13T00:24:46.953 回答