我正在使用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'
}
}
});
当我运行我的静态网站时,在控制台中会出现如下消息:
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
正如您所看到的,RequireJS忽略了我为CND提供URL并尝试在本地查找模块这一事实。
但是,有时RequireJS工作正常 - 它从URL加载模块。那边有一些彩票。值得一提的是,它只发生在我的远程开发服务器上 - 也就是我通过网络访问我的网站时。当我在本地运行我的网站时,RequireJS总是从CDN完全加载模块。奇怪,任何想法为什么会发生这种情况?
更新
这就是我开始申请的方式:
<script type="text/javascript" data-main="js/main" src="js/require.js"></script>
main.js(加载配置的地方)
define(['config', 'router'], function(Config, Router) {
var router = new Router();
Backbone.history.start();
});
答案 0 :(得分:7)
您的主要模块以此开头:
define(['config', 'router'], function(Config, Router) {
这告诉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();
});
});
上面的代码确保config
先于其他任何内容加载。
您的配置在以下方面也有误:
您必须始终将jQuery称为jquery
,因为jQuery(无论好坏)将其模块名称硬编码为jquery
所有较低的上限。我使用jQuery
代替jquery
进行测试,结果不稳定。
jQuery 2.0.3不需要垫片。拥有垫片只会让RequireJS感到困惑。