RequireJS随机加载错误的文件名与AMD模块
RequireJS randomly loads wrong filename with AMD modules
我有我的配置(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
- knockout-2.2.0
- jquery-1.8.3.min.js
- 视图/add-report-wizard-model-parameter.js
- 视图/add-report-wizard-model-step.js
- knockout.mapping-latest.js
一个不工作的请求有一个序列,例如:
- require.js
- 视图/add-report.js
- main.js
- 视图/add-report-wizard-model.js
- knockout.js
- jquery.js
- 视图/add-report-wizard-model-step.js
- 视图/add-report-wizard-model-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加载之后应用的非确定性加载顺序),并且knockout和jquery(都具有内置的AMD支持)都被请求错误的文件名。我观察到在add-report和knockout和jquery文件名之前请求require的其他序列仍然是错误的。我在请求之间做的唯一一件事就是刷新浏览器(我还会注意到,一旦它工作了,它就会继续工作,一旦它坏了,它就会一直坏下去)。我试过从配置中删除urlArgs
,仍然观察到同样的问题。在这个特定的页面上,使用jquery。没有使用Tokeninput。从配置文件中删除它似乎也没有任何效果。
编辑:按要求,摘自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 {
// <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
脚本之前调用(如果我理解正确,在哪里是你的配置)。
所以你都需要从main.js
文件加载。您可以使用config deps
选项来加载一些文件。或者您也可以将它们都包含在内联中,但这就违背了目的。
这是我现在正在工作的(谢谢Simon)。
tl;dr version:在
的globalrequire
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:
<head>
...
<script src="/Scripts/main.js" type="text/javascript"></script>
</head>
<body>
...
<script src="/Scripts/require.js" data-main="Views/add-report.js"></script>
- 如何将多个 AMD 模块捆绑在一个文件中
- AMD 模块中的动态导出
- 使用 Babel 将 ES6 模块转换为 ES5 AMD 模块,无法按预期工作
- JavaFX+Javascript:如何将Java对象注入AMD模块
- Javascript应用程序作为具有外部依赖关系的AMD模块
- 如何将预编译的hogan.js模板封装到AMD模块中
- 当混合node和amd模块时,requirejs()返回undefined
- 如何创建一个结构化为AMD模块的可重用库
- 我可以在网络工作者中加载AMD模块吗
- 如何从TypeScript编译中现有的AMD js类继承到AMD模块
- 使用磁带/ES6 单元测试测试 AMD 模块
- 如何将 AMD 模块从单例转换为实例
- 为什么串联的 RequireJS AMD 模块需要一个加载器
- 如何从道场层加载 AMD 模块
- 从前台检索后台页面的 AMD 模块
- 配置需要 js 才能在 javascript 中加载 AMD 模块
- 如何使用 tsc 从打字稿生成 amd 模块
- 如何使用jspm/system.js正确加载本地AMD模块
- Davis.js作为AMD模块
- RequireJS-在require流和内联中加载AMD模块