我正在尝试通过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) - 我可以替换该问题。但是,如果我然后移动测试一个目录,使其与其他插件保持一致 - 它们都可以正常加载。
答案 0 :(得分:3)
您为shim
配置提供的整个路径必须与您需要的模块的整个路径相匹配。
您为垫片jquery.jstree
命名,但您需要它为jstree/jquery.jstree
,因此RequireJS不使用垫片,因此不知道插件取决于jquery
等等等等你得到间歇性的错误。
对于我可能想要全局使用的插件之类的东西,我更喜欢给它们一个众所周知的名称,我可以在整个应用程序中使用它而不用担心路径。所以在你的情况下,我通过将其添加到我的配置来解决问题:
paths: {
"jquery.jstree": "jstree/jquery.jstree"
}
然后我会要求jquery.jstree
。