我正在使用requirejs + jquery + jqueryui。我已经阅读了大量有关如何执行此操作的示例。我想我了解各种方法,在我看来我的设置应该可以正常工作。但是,我偶尔会在依赖 jquery-ui 的自定义模块中收到$.widget is not defined错误。这很痛苦,因为它不一致且难以重现,因此我很难测试替代方法。
我没有填充我所有的 jquery 插件,因为有很多。相反,我使用单独的 requirejs 调用加载 jquery。然后,在回调中,我加载了其余的东西。这样我就不必为我的所有 jquery 插件维护一个垫片列表。
对于 jquery-ui,我使用 shim 使其依赖于 jquery。然后我所有使用小部件工厂的自定义模块在其依赖项列表中都有'jquery-ui'。
在我的模板中...
requirejs.config({
baseUrl: ATHLETE.siteConfig.jsBaseUrl,
paths: {
'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min',
'jquery-ui': '//ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min'
},
shim: {
"jquery-ui": ['jquery']
},
waitSeconds: 15
});
requirejs(['jquery'], function($) {
requirejs(['site'], function() {
requirejs(['mypage']);
});
});
请注意,我在 mypage.js 之前加载 site.js。他们有一些共享的依赖关系。在我的构建配置中,我从 mypage.js 中排除了 site.js,因此共享依赖项被编译到 site.js 而不是 mypage.js。因此,我需要在加载 mypage.js 之前完全加载 site.js,否则 require 可能会尝试单独加载这些共享依赖项。
这是我的一个示例自定义模块,它依赖于 jquery-ui。
define([
'jquery',
'jquery-ui'
],function($) {
$.widget('ui.viewAllSponsorsWidget', $.ui.dialog, {
options: {
autoOpen: false,
dialogClass: 'view-all-sponsor-dialog-wrap',
draggable: false,
modal: true,
resizable: false,
width: 370,
height: 400
}
});
});
错误 $.widget is not defined 是由这个和我的类似自定义模块的第 5 行引起的。同样,它确实不一致且难以重现。通常情况下,即使我清除了缓存,我也不会收到错误消息。谁能想到在 jquery-ui 完全加载之前执行第 5 行的方法?
2013 年 8 月 16 日更新
我已经能够更多地追踪这一点。我创建了一个依赖于 jquery 和 jquery-ui 的简单模块。
define([
'jquery',
'jquery-ui'
],function($) {
console.log('$.widget is defined? ' + Boolean($.widget));
console.log('jQuery.widget is defined? ' + Boolean(jQuery.widget));
});
其输出如下:
LOG: $.widget is defined? false
LOG: jQuery.widget is defined? true
所以不知何故,全局 jQuery 对象定义了小部件,但 requirejs 提供给我的副本没有。