我是一个受虐狂,所以我决定改变我在项目中加载require.js的方式。我所做的就是从这里开始(使用Modernizr.load)......
<script type="text/javascript">
function requireJsConfig () {
requirejs.config({
'baseUrl': '{{ STATIC_URL }}js',
'paths': {
'jquery': 'libraries/jquery',
'backbone': 'libraries/backbone',
'underscore': 'libraries/underscore',
'jquery.cookie': 'libraries/jquery-cookie',
'tinymce': 'tinymce/tinymce.min',
'react' : 'libraries/react',
'history': 'history'
},
waitSeconds: 30,
shim: {
'jquery' : 'jquery',
'underscore' : {
exports: '_'
},
'backbone': {
deps: ['underscore', 'jquery'],
exports: 'Backbone'
},
'jquery.cookie': {
deps: ['jquery'],
exports: '$.cookie'
},
'tinymce': {
deps: ['jquery'],
exports: 'tinymce'
}
}
});
define('static_url', [], "{{ STATIC_URL }}");
window.static_url = "{{ STATIC_URL }}";
define('PUBNUB_SUBSCRIBE_KEY', [], "{{ PUBNUB_SUBSCRIBE_KEY }}");
require(["teacher"]);
};
Modernizr.load({
load: '{{ STATIC_URL }}js/require.js',
complete: function() {
requireJsConfig();
}
});
</script>
...到此(不使用Modernizr.load)......
<script type="text/javascript" src="{{ STATIC_URL }}js/require.js"></script>
<script type="text/javascript">
function requireJsConfig () {
requirejs.config({
'baseUrl': '{{ STATIC_URL }}js',
'paths': {
'jquery': 'libraries/jquery',
'backbone': 'libraries/backbone',
'underscore': 'libraries/underscore',
'jquery.cookie': 'libraries/jquery-cookie',
'tinymce': 'tinymce/tinymce.min',
'react' : 'libraries/react',
'history': 'history'
},
waitSeconds: 30,
shim: {
'jquery' : 'jquery',
'underscore' : {
exports: '_'
},
'backbone': {
deps: ['underscore', 'jquery'],
exports: 'Backbone'
},
'jquery.cookie': {
deps: ['jquery'],
exports: '$.cookie'
},
'tinymce': {
deps: ['jquery'],
exports: 'tinymce'
}
}
});
define('static_url', [], "{{ STATIC_URL }}");
window.static_url = "{{ STATIC_URL }}";
define('PUBNUB_SUBSCRIBE_KEY', [], "{{ PUBNUB_SUBSCRIBE_KEY }}");
require(["teacher"]);
};
requireJsConfig();
</script>
......现在我得到了这个:
未捕获错误:匿名的define()模块:函数不匹配 (){return r}
FWIW,这是发生错误的地方(在require.js中):
function intakeDefines() {
var args;
//Any defined modules in the global queue, intake them now.
takeGlobalQueue();
//Make sure any remaining defQueue items get properly processed.
while (defQueue.length) {
args = defQueue.shift();
if (args[0] === null) {
return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));
} else {
//args are id, deps, factory. Should be normalized by the
//define() function.
callGetModule(args);
}
}
}
顺便说一句,我已经确认these都没有申请。
为什么这个看似无害的变化导致核弹在我的项目中爆炸? (是的,实际的核弹引爆......似乎数以百万计的声音突然在恐怖中大声喊叫,并突然沉默......)
答案 0 :(得分:0)
你说&#34;这些都不适用&#34;但是除非你手动修改了下划线,否则certainly does。
答案 1 :(得分:0)
让我们看看我是否能比帕特里克更好地解释它......
shim
您不需要underscore
,因为它会检测它是否与AMD加载程序一起运行,如果是,则调用define
。 请勿将shim
用于呼叫define
的模块。
您还应该删除jQuery的shim
。除非您使用的是古老版本,否则它还会检测到它是使用AMD加载程序运行并调用define
。此外,shim
jquery: "jquery"
毫无意义。 (我能想到的最接近有意义的shim
是jquery: ["jquery"]
,这意味着“jquery
取决于jquery
”。)
至于它之前为什么会有效...当你使用shim
模块调用define
时,你会输入未定义的区域:有时它会起作用,有时它不起作用。
我不知道其他模块是否需要垫片,因为我不经常使用它们。如果我是你,我会检查他们是否致电define
。