每次需要jQuery时,如何将jQuery的插件与jQuery一起加载?

时间:2014-03-29 22:07:06

标签: javascript requirejs

$("body").slimScroll();抛出错误,因为未定义slimScroll。这是因为require.js可能不会自动加载shim密钥,如果您需要任何模块,在shim中指定为依赖项(我想如果我有shim jquery.slimscroll及其相关性为jquery,当我需要jquery时,它会自动加载jquery.slimscroll - 这种情况不会发生。)

所以正确的方法是调用define(['jquery', 'jquery.slimscroll') function ($) ...,因此需要知道我需要jquery.slimscroll,因为它是在垫片中,它将加载一点不同,因为它不兼容AMD。

问题是如果我有很多jquery plugins,我需要总是在define调用中传递我需要的所有插件。有什么办法,如何解决这种恼人的行为,只写define(['jquery'], function ($) ..

require.config({
    baseUrl: 'js/bower',
    paths: {
        react: 'react/react-with-addons',
        jquery: 'jquery/dist/jquery',
        'jquery-private': '../jquery-private',
        'jquery.slimscroll': 'jquery-slimscroll/jquery.slimscroll.min'
    },
    map: {
        '*': {
            jquery: 'jquery-private',
        },
        'jquery-private': {
                jquery: 'jquery'
        }
    },
    shim: {
        'jquery.slimscroll': ['jquery']
    }

});


require(['jquery'], function ($) {

    $("body").slimScroll();

});

1 个答案:

答案 0 :(得分:1)

您可以将jquery插件添加到jquery-private模块的依赖项中。

define(['jquery', 'jquery.slimscroll', ...], function (jQuery) {
    return jQuery.noConflict(true);
});

这样,当任何模块需要jquery时,插件也会同时加载。

我假设jquery-private是为了加载jQuery,以便它不与其他版本的jQuery冲突。这就是我的例子在上面所反映的内容,但模块实际上做的并不重要。

使用此方法,您仍需要为每个不是AMD模块的插件配置shim。此外,您的插件必须获得map设置,就像jquery-private一样,以获得真正的jquery模块。否则,将存在循环依赖。