我将我的配置(main.js)定义为:
require.config({
urlArgs: "bust=" + (new Date()).getTime(),
paths: {
jquery: 'jquery-1.8.3.min',
knockout: 'knockout-2.2.0',
komapping: 'knockout.mapping-latest',
token: 'jquery.tokeninput'
},
shim: {
'token': ['jquery']
}
});
编辑
main.js是共享配置。我有几个页面都使用相同的设置,并且我不需要在项目的各处修改版本特定的文件名。
/编辑
并在页面中包含为:
<script src="/AnswersDev/Scripts/require.js" data-main="/AnswersDev/Scripts/main"></script>
add-report.js包含为:
<script type="text/javascript">
require(['Views/add-report']);
</script>
编辑
这似乎可能是原因。内联脚本有时在main之前运行,因此未定义期望找到的别名,因此它只是在寻找.js。
/编辑
jquery.tokeninput是AFAIK,我正在使用的唯一非AMD模块。一个有效的请求导致以下请求顺序(Fiddler捕获):
require.js
main.js
视图/add-report.js
视图/add-report-wizard-model.js
淘汰赛2.2.0
jquery-1.8.3.min.js
视图/添加报告向导模型-parameter.js
视图/添加报告向导模型-step.js
Knockout.mapping-latest.js
无效的请求具有类似以下的序列:
require.js
视图/add-report.js
main.js
视图/add-report-wizard-model.js
基因敲除
jquery.js
视图/添加报告向导模型-step.js
视图/添加报告向导模型-parameter.js
Knockout.mapping-latest.js
add-report.js:
define(['jquery', 'knockout', 'Views/add-report-wizard-model'], function ($, ko, ViewModel) {
... snip ...
});
请注意,在非工作序列中,add-report.js在require.js(我希望在require.js加载后应用非确定性加载顺序)之前请求,并且剔除和jquery(都内置了AMD支持)要求使用错误的文件名。我观察到在添加报告之前需要require的其他序列,而敲除和jquery文件名仍然错误。我在两次请求之间所做的唯一一件事就是刷新浏览器(我还将注意到,一旦运行,它将趋向于保持工作状态,一旦崩溃,将趋于保持崩溃状态)。我尝试从配置中删除
urlArgs
,但仍然观察到同一问题。在此特定页面上,未使用jquery.tokeninput。从配置文件中删除它似乎也没有任何作用。此时,RequireJS对我来说是完全不可靠的,并且我当然不能在当前状态下将代码发布到生产环境中。考虑到似乎相当成功地使用RequireJS的人数,我只能假设问题出在我的代码中,但是我对可能出现的位置不知所措。
有人对我可能出错的地方有什么建议吗?谢谢。
编辑:根据要求,摘自strockout.mapping-latest.debug.js:
// Module systems magic dance.
if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
// CommonJS or Node: hard-coded dependency on "knockout"
factory(require("knockout"), exports);
} else if (typeof define === "function" && define["amd"]) {
// AMD anonymous module with hard-coded dependency on "knockout"
define(["knockout", "exports"], factory);
} else {
// <script> tag: use the global `ko` object, attaching a `mapping` property
factory(ko, ko.mapping = {});
}
最佳答案
当您这样请求文件时:
<script src="/AnswersDev/Scripts/require.js" data-main="/AnswersDev/Scripts/main"></script>
<script type="text/javascript">
require(['Views/add-report']);
</script>
很有可能在
main.js
脚本之前调用了内联require(如果我理解正确的话,您的配置在哪里)。因此,您都需要从
main.js
文件加载。您可以使用config deps
选项加载某些文件。或者,您也可以将它们全部内联,但是这样做会破坏目的。关于javascript - RequireJS使用AMD模块随机加载错误的文件名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14345222/