【问题标题】:Scripts Dependencies Using RequireJS Shim使用 RequireJS Shim 脚本依赖
【发布时间】:2013-08-17 10:22:15
【问题描述】:

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

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

已编辑 - 添加了更多代码 sn-ps)

ma​​in-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 only 我收到 'jQuery' is undefined(那里是大写的 Q)或 '$' is undefined 错误来自jquery.browser.min.js 文件。

我认为deps 表示 jquery 将在 jquery.browser 文件之前加载,但显然情况并非总是如此。我尝试关注this answer 并添加exports: "$.fn.browser",但没有成功。

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

我做错了什么?

【问题讨论】:

    标签: javascript requirejs


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,但不幸的是它没有帮助,我仍然收到这些错误(在 IE 上,并非总是如此)。我正在编辑我的问题以提供更多详细信息。
    【解决方案2】:

    您似乎在 moduls/utils.js 中缺少 jquery 依赖项,请尝试:

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

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

    jquery: {
      exports: "$"
    },
    

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

    【讨论】:

    • 我还是遇到了同样的问题……不知道哪里出了问题。
    【解决方案3】:

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

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

    data-main Entry Point Documentation.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      相关资源
      最近更新 更多