我正在从jQuery 1.8升级到1.9,并且由于jQuery.browser()已被删除,我将使用jQuery Browser Plugin。
我的requirejs配置文件(使用data-main =“”加载)看起来有点像这样:
(已编辑 - 添加了更多代码段)
主要-comp.js
require.config({
paths: {
jquery: 'libs/jquery/jquery1.9.1.min',
utils: 'modules/utils',
myController: "controllers/myController",
browserPlugin: 'libs/jquery/jquery.browser.min'
},
shim: {
browserPlugin: {
deps: ['jquery']
}
}
});
require(['myController', 'jquery'], function (controller, $) {
$(controller.start);
}
);
moduls / utils.js
define(['browserPlugin'], function () {
return {
browser: $.browser
};
});
myController.js
define(['utils'], function (utils) {
function start() {
console.log(utils.browser.msie)
}
return {
start: start
};
});
一切似乎都运作正常,但后来我在 IE浏览器中看到有时 我得到'jQuery' is undefined
(那里是大写Q)或{{来自'$' is undefined
文件的错误。
我认为jquery.browser.min.js
意味着jquery将在jquery.browser文件之前加载,但显然情况并非如此。我尝试关注this answer并添加deps
,但没有成功。
运行优化版本时(使用r.js缩小+ uglify)我还没遇到过。
我做错了什么?
答案 0 :(得分:2)
您需要确保在$
回调中引用require
作为参数。像这样:
require(['myController', 'jquery'], function (controller, $) {
$(controller.start);
}
);
这确保了jQuery可以使用。这有点奇怪,因为它无论如何都会全局暴露,所以它有时会工作,但正确的方法是明确要求它并在回调中作为参数使用它。
答案 1 :(得分:0)
看起来你在 moduls / utils.js 中缺少jquery依赖,请尝试:
define(['jquery', 'browserPlugin'], function ($) {
return {
browser: $.browser
};
});
而且,为了安全起见,将jquery添加到你的垫片中:
jquery: {
exports: "$"
},
顺便问一下,为什么不在代码中使用$ .browser并使用shim配置加载jquery插件?
答案 2 :(得分:0)
我遇到了同样的问题,data-main
中的脚本是异步加载的,这意味着它可以在之后加载加载它定义的脚本。
解决方案是在require.config
脚本后面加载require.js
的另一个脚本。