RequireJS错误地从URL加载脚本

use*_*733 3 javascript requirejs

我正在使用RequireJS来加载依赖项.这是我的配置的样子:

'use strict';

require.config({
    paths: {
        jQuery: 'http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min',
        underscore: 'http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min',
        backbone: 'http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.1.0/backbone-min'
    }
    shim: {
        jQuery: {
            exports: '$'
        },
        underscore: {
            exports: '_'
        },
        backbone: {
            deps: [
                'underscore',
                'jQuery'
            ],
            exports: 'Backbone'
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

当我运行我的静态网站时,在控制台中有如下消息:

GET http://*myhost*/js/backbone.js 404 (Not Found) require.js:1896
Uncaught Error: Script error for: backbone
http://requirejs.org/docs/errors.html#scripterror require.js:166
GET http://*myhost*/js/jQuery.js 404 (Not Found) require.js:1896
Uncaught Error: Script error for: jQuery
http://requirejs.org/docs/errors.html#scripterror require.js:166
GET http://*myhost*/js/underscore.js 404 (Not Found) require.js:1896
Uncaught Error: Script error for: underscore
http://requirejs.org/docs/errors.html#scripterror require.js:166
Uncaught ReferenceError: jQuery is not defined 
Run Code Online (Sandbox Code Playgroud)

如您所见,RequireJS忽略了我为CND提供URL并尝试在本地查找模块的事实.

但是,有时RequireJS工作正常 - 它从URL加载模块.那边有一些彩票.值得一提的是,它只发生在我的远程开发服务器上 - 也就是我通过网络访问我的网站时.当我在本地运行我的网站时,RequireJS总是从CDN完全加载模块.奇怪,任何想法为什么会发生这种情况?

UPDATE

这就是我启动应用程序的方式:

<script type="text/javascript" data-main="js/main" src="js/require.js"></script>
Run Code Online (Sandbox Code Playgroud)

main.js(加载配置的地方)

define(['config', 'router'], function(Config, Router) {
    var router = new Router();
    Backbone.history.start();
});
Run Code Online (Sandbox Code Playgroud)

Lou*_*uis 7

您的主要模块以此开头:

define(['config', 'router'], function(Config, Router) {
Run Code Online (Sandbox Code Playgroud)

这告诉RequireJS加载config,router但没有指定它们的加载顺序.如果router依赖于使用您在配置中列出的CDN的模块,并假设它config不属于router依赖项,那么您确实会出现间歇性加载失败.当config发生加载之前router一切都很好.如果config之后加载router,那么所有的地狱都会破裂.解决此问题的最简单方法是将配置移动到您的main.js文件中.您可以在require.config调用之前进行define调用,并且您显然不再列出config依赖项.

如果移动呼叫require.config对您不起作用,因为(例如)您需要config在多个页面之间共享,那么这也可以解决这个问题:

define(['config'], function () {
    require(['router'], function(Router) {
        var router = new Router();
        Backbone.history.start();
    });
});
Run Code Online (Sandbox Code Playgroud)

上面的代码确保config在其他任何内容之前加载.

您的配置在以下方面也是错误的:

  1. 你必须始终引用jQuery,jquery因为jQuery(无论好坏)将其模块名称硬编码为jquery所有较低的大写字母.我使用jQuery而不是运行测试jquery并获得不稳定的结果.

  2. jQuery 2.0.3不需要垫片.拥有垫片只会让RequireJS感到困惑.