3

我正在从 jQuery 1.8 升级到 1.9,并且由于 jQuery.browser() 被删除,我将使用jQuery Browser Plugin

我的 requirejs 配置文件(使用 data-main="" 加载)看起来有点像这样:

(已编辑- 添加了更多代码片段)

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);
    }
);

模块/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

我认为depsjquery 将在 jquery.browser 文件之前加载的方式,但显然情况并非总是如此。我尝试遵循这个答案并添加exports: "$.fn.browser"但没有成功。

运行优化版本(使用 r.js 缩小 + uglify)时,我没有遇到过。

我究竟做错了什么?

4

3 回答 3

2

您需要确保在回调$中作为参数引用。require像这样:

require(['myController', 'jquery'], function (controller, $) {
        $(controller.start);
    }
);

这确保了 jQuery 可以使用。这有点奇怪,因为无论如何它都会在全局范围内公开自己,因此有时无论如何它都会起作用,但正确的方法是明确要求它并在回调中使用它作为参数。

于 2013-08-15T10:52:31.470 回答
0

看起来您在moduls/utils.js中缺少 jquery 依赖项,请尝试:

define(['jquery', 'browserPlugin'], function ($) {
  return {
    browser: $.browser
  };
});

而且,为了安全起见,将 jquery 添加到您的 shim 中:

jquery: {
  exports: "$"
},

顺便说一句,为什么不在代码中使用 $.browser 并使用 shim 配置加载 jquery 插件?

于 2013-08-20T16:04:04.270 回答
0

我遇到了同样的问题,其中的脚本data-main是异步加载的,这意味着它可能会在它定义的脚本之后加载。

require.config解决方案是在脚本之后加载另一个require.js脚本。

数据主入口点文档

于 2014-01-21T10:49:56.097 回答