Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RequireJS随机加载AMD模块的错误文件名_Javascript_Jquery_Knockout.js_Requirejs_Amd - Fatal编程技术网

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

Javascript RequireJS随机加载AMD模块的错误文件名,javascript,jquery,knockout.js,requirejs,amd,Javascript,Jquery,Knockout.js,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'

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

并包含在页面中,作为:

<script src="/AnswersDev/Scripts/require.js" data-main="/AnswersDev/Scripts/main"></script>
请注意,在非工作序列中,add-report.js在require.js之前被请求(我希望加载require.js之后应用非确定性加载顺序),而knockout和jquery(都内置了AMD支持)都被请求使用错误的文件名。我观察到在添加报告之前请求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 {
    // <script> tag: use the global `ko` object, attaching a `mapping` property
    factory(ko, ko.mapping = {});
}
//模块系统魔术舞。
if(typeof require==“函数”&&typeof导出==“对象”&&typeof模块==“对象”){
//CommonJS或节点:硬编码依赖于“淘汰”
工厂(要求(“淘汰”)、出口;
}else if(typeof define==“函数”&&define[“amd”]){
//AMD匿名模块,硬编码依赖于“敲除”
定义([“淘汰”、“导出”],工厂);
}否则{
//标记:使用全局'ko'对象,附加'mapping'属性
工厂(ko,ko.mapping={});
}

当您请求这样的文件时:

<script src="/AnswersDev/Scripts/require.js" data-main="/AnswersDev/Scripts/main"></script>
<script type="text/javascript">
    require(['Views/add-report']);
</script>

需要(['Views/addreport']);
内联require很可能在
main.js
脚本之前被调用(如果我理解正确,您的配置在哪里)


因此,您都需要从
main.js
文件加载。您可以使用config
deps
选项加载一些文件。或者您也可以将它们全部包含在内联中,但这无法达到目的。

这就是我现在所做的工作(谢谢Simon)

tl;dr版本:在中的全局
require
var中创建配置,然后像往常一样包括特定于页面的模块/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']
    }
};
添加报告:

<head>
    ...
    <script src="/Scripts/main.js" type="text/javascript"></script>
</head>
<body>
    ...
    <script src="/Scripts/require.js" data-main="Views/add-report.js"></script>

...
...

我已经用knockout.mapping中的摘录更新了这个问题。我的理解是,
knockout
的硬编码依赖性可以通过在config main.js中定义别名来处理。js是我的“全局”配置(即,所有页面都需要相同的配置)。我想集中定义它,这样当我升级jQuery或knockout时,就不需要在文件名中找到引用特定版本的每个地方。我的理解是,
require
调用将解析引用,我猜它正在解析引用,但在获取别名之前(有时)。那么,如何创建所有引用单个公共配置的特定于页面的脚本呢?如果使用,它将设置配置,然后在
deps
选项中加载
main.js
。然后在
main.js
中,所有模块都会被引导。最后,。将此标记为答案,因为您确实从技术上回答了问题(我做错了什么)。我要指出的是,所提供的示例似乎假设我正在创建一个单页应用程序,但事实并非如此(我最终将创建一个单独的迷你SPA集合)。我添加了我的解决方案作为答案,这让我有了一个公共配置,可以在SPA之间共享,然后每个SPA都有自己的脚本和模型。
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']
    }
};
<head>
    ...
    <script src="/Scripts/main.js" type="text/javascript"></script>
</head>
<body>
    ...
    <script src="/Scripts/require.js" data-main="Views/add-report.js"></script>