使用RequireJS加载jQuery插件 - 即使在指定deps之后,jQuery也间歇性地未定义?

时间:2013-12-09 22:37:22

标签: javascript jquery requirejs

我正在尝试通过RequireJS加载jQuery.jstree。您可以在此处查看插件的确切来源:https://gist.github.com/MeoMix/7882144

据我所知,jQuery.jstree有三个依赖:jQuery,jQuery UI和jQuery.cookie。

我首先加载我的RequireJS shim配置,然后调用一个初始'require'来启动:

require.config({

    //  Set the base URL to the Scripts directory of CSWeb
    baseUrl: '/csweb/Scripts/',

    shim: {
        'jquery-ui': ['jquery'],
        'jquery.jstree': ['jquery', 'jquery-ui', 'jquery.cookie'],
        'jquery.cookie': ['jquery']
    }

});

在这里,我定义了相对于我的JavaScript文件根目录的基本URL。文件jquery.js位于baseUrl。我还为两个插件定义了依赖项。 注意:我尝试过使用更明确的填充声明,包括定义导出。我注意到效果没有区别。

定义配置后,我打电话给:

require([
    'jquery',
    'jquery-ui',
    'jquery.cookie',
    'jstree/jquery.jstree'
], function () {
    'use strict';

});

这样做会间歇性地产生错误。显然是异步加载问题。错误如下:

Uncaught ReferenceError: jQuery is not defined jquery.jstree.js:978

jquery.jstree的第978行就是将jQuery传递到闭包中以开始初始化插件的地方:

// 978 jquery.jstree.js: })(jQuery);

我在这里不理解什么?我的大部分插件似乎都没有遇到这个问题。关于如何编写这个jstree插件使RequireJS适合,有什么特别糟糕的吗?或者我不理解RequireJS垫片配置的核心机制?

UPDATE 1:看来这与我从路径加载jquery.jstree的事实有关。如果我加载另一个空文件(jstree / jquery.test) - 我可以替换该问题。但是,如果我然后移动测试一个目录,使其与其他插件保持一致 - 它们都可以正常加载。

1 个答案:

答案 0 :(得分:3)

您为shim配置提供的整个路径必须与您需要的模块的整个路径相匹配。

您为垫片jquery.jstree命名,但您需要它为jstree/jquery.jstree,因此RequireJS不使用垫片,因此不知道插件取决于jquery等等等等你得到间歇性的错误。

对于我可能想要全局使用的插件之类的东西,我更喜欢给它们一个众所周知的名称,我可以在整个应用程序中使用它而不用担心路径。所以在你的情况下,我通过将其添加到我的配置来解决问题:

paths: {
    "jquery.jstree": "jstree/jquery.jstree"
}

然后我会要求jquery.jstree