RequireJS随机加载错误的文件名与AMD模块

我的配置(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是一个共享配置。 我有几个页面都使用相同的设置,我不想在我的项目中的所有地方修改特定于版本的文件名。 /编辑

并包含在页面中:

  

add-report.js包含在:

  require(['Views/add-report']);  

编辑似乎可能是原因。 内联脚本有时在main之前运行,因此没有定义它期望找到的别名,所以它只是寻找.js。 /编辑

jquery.tokeninput是AFAIK,我正在使用的唯一非AMD模块。 工作请求会产生以下请求序列(Fiddler捕获):

  1. require.js
  2. main.js
  3. 查看/插件report.js
  4. 查看/添加 – 报告 – 向导model.js
  5. 淘汰赛2.2.0
  6. jQuery的1.8.3.min.js
  7. 查看/添加报告精灵模型,parameter.js
  8. 查看/添加报告精灵模型,step.js
  9. knockout.mapping-latest.js

非工作请求具有如下序列:

  1. require.js
  2. 查看/插件report.js
  3. main.js
  4. 查看/添加 – 报告 – 向导model.js
  5. knockout.js
  6. 的jquery.js
  7. 查看/添加报告精灵模型,step.js
  8. 查看/添加报告精灵模型,parameter.js
  9. knockout.mapping-latest.js

附加report.js:

 define(['jquery', 'knockout', 'Views/add-report-wizard-model'], function ($, ko, ViewModel) { ... snip ... }); 

请注意,在非工作序列中, require.js 之前请求add-report.js(我希望加载require.js 之后应用非确定性加载顺序)以及knockout和jquery(两者都内置AMD支持)正在请求错误的文件名。 我已经观察到在add-report之前请求require的其他序列以及knockout和jquery文件名仍然是错误的。 我在请求之间做的唯一事情是刷新浏览器(我还会注意到,一旦它工作,它往往会继续工作,一旦它中断,它往往会被打破)。 我试过从配置中删除urlArgs并仍然观察到同样的问题。 在此特定页面上,不使用jquery.tokeninput。 从配置文件中删除它似乎也没有任何影响。

此时,RequireJS对我来说完全不可靠,我当然无法在当前状态下将代码发布到生产中。 考虑到似乎非常成功地使用RequireJS的人数,我只能假设问题出现在我的代码中,但我不知道可能在哪里。

任何人都有任何建议,我可能会出错? 谢谢。

编辑:根据要求,摘自knockout.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 { //  tag: use the global `ko` object, attaching a `mapping` property factory(ko, ko.mapping = {}); } 

当您请求这样的文件时:

   

有可能是在main.js脚本之前调用内联require(如果我理解正确,那么你的配置在哪里)。

所以你们都需要从main.js文件加载。 您可以使用config deps选项加​​载某些文件。 或者你也可以将它们全部包括在内,但这会破坏目的。

这就是我现在的工作(感谢Simon)。

tl; dr version:在中创建全局require var中的config,然后像往常一样包含特定于页面的模块/ require.js。

main.js:

 var require = { baseUrl: '/Scripts', paths: { jquery: 'jquery-1.8.3.min', knockout: 'knockout-2.2.0', komapping: 'knockout.mapping-latest', token: 'jquery.tokeninput' }, shim: { 'token': ['jquery'] } }; 

AddReport:

  ...    ...