使用RequireJS Shim编写脚本依赖项

时间:2013-08-15 08:41:39

标签: javascript requirejs

我正在从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)我还没遇到过。

我做错了什么?

3 个答案:

答案 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的另一个脚本。

data-main Entry Point Documentation