我将我的配置(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/

10-12 12:41
查看更多