【问题标题】:Loading jQuery plugins using RequireJS -- jQuery undefined intermittently even after specifying deps?使用 RequireJS 加载 jQuery 插件——即使在指定 deps 之后,jQuery 也会间歇性地未定义?
【发布时间】:2013-12-09 22:37:22
【问题描述】:

我正在尝试通过 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。我还为这两个插件定义了依赖项。 注意:我尝试过使用更明确的 shim 声明,包括定义导出。我没有发现效果有什么不同。

定义我的配置后,我调用:

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 shim 配置的核心机制?

更新 1: 这似乎与我从路径加载 jquery.jstree 的事实有关。如果我加载另一个空文件(jstree/jquery.test)——我可以替换这个问题。但是,如果我随后将 test 向上移动一个目录,使其与其他插件处于同一水平 - 一切正常。

【问题讨论】:

  • 所以你正在将 jsTree 添加到需要的项目中?您是否需要为此创建 shim 配置?

标签: javascript jquery requirejs


【解决方案1】:

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

您将 shim 命名为 jquery.jstree,但您需要将其命名为 jstree/jquery.jstree,因此 RequireJS 不使用 shim,因此不知道插件依赖于 jquery 等,因此您会遇到间歇性错误。

对于我可能想在全局范围内使用的插件之类的东西,我更愿意给它们起一个众所周知的名称,这样我就可以在整个应用程序中使用而不必担心路径。因此,在您的情况下,我会通过将其添加到我的配置来解决问题:

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

然后我会要求它jquery.jstree

【讨论】:

  • 啊。好的。谢谢你。这是我第一次将 RequireJS 适配到现有项目中。通常我的所有插件都在 /libs 文件夹中。这行得通!
猜你喜欢
  • 2019-06-16
  • 2018-08-07
  • 2019-12-13
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多