Javascript 跨多个模块的单一依赖关系-r.js“;下面的模块共享相同的URL“;
我已经在一个多页面的web应用程序中实现了requirejs,它工作得很好,但现在我尝试使用r.js创建一个包含“所有”模块的文件,除了任何第三方库和框架,如jquery等 分解的构建文件(build.js)如下所示:Javascript 跨多个模块的单一依赖关系-r.js“;下面的模块共享相同的URL“;,javascript,requirejs,r.js,Javascript,Requirejs,R.js,我已经在一个多页面的web应用程序中实现了requirejs,它工作得很好,但现在我尝试使用r.js创建一个包含“所有”模块的文件,除了任何第三方库和框架,如jquery等 分解的构建文件(build.js)如下所示: ({ baseUrl: "../", out: "main-v0.1.js", //"charts-v0.1.js", include: [ "bi/jquery/jquery.ui.autocomplete", "bi/jquery/jquery.ui.
({
baseUrl: "../",
out: "main-v0.1.js", //"charts-v0.1.js",
include: [
"bi/jquery/jquery.ui.autocomplete",
"bi/jquery/jquery.ui.combobox",
"bi/ui/investmentselector"
],
wrap: true,
exclude: [
'jquery', 'jqueryui', 'jcanvas', 'jqtools', 'prettyphoto', 'cssSandpaper', 'knockout', 'datatables', 'handlebars'
],
preserveLicenseComments: false,
optimize: "none", // "uglify", "uglify2"
paths: {
handlebars : 'lib/handlebars',
/*hb runtime : 'lib/handlebars.runtime',*/
jquery : 'lib/jquery-1.9.1',
jqueryui : 'lib/jquery.ui/jquery-ui-1.10.3.min',
jcanvas : 'lib/jcanvas.min',
jqtools : 'lib/jquery.tools/jquery.tools.min',
prettyphoto : 'lib/jquery/jquery.prettyphoto-3.1.5.min',
BI : 'bi/BI',
sliderconnect : 'bi/charts/slider-connect',
cssSandpaper : 'lib/csssandpaper/cssSandpaper',
csstransform : 'bi/enhance/csstransform',
knockout : 'lib/knockout-2.2.1',
datatables : 'lib/jquery/jquery.dataTables',
// jquery ui widgets
uicombobox : 'bi/jquery/jquery.ui.combobox',
uiautocomplete : 'bi/jquery/jquery.ui.autocomplete'
}
})
jquery.ui.autocomplete.js和jquery.ui.combobox.js文件是定制的jqueryui小部件,周围没有任何define()包装。
模块investmentselector.js(分解)如下所示
define(['jquery',
'bi/templates/investmentselector.js',
'bi/jquery/datatables/investmentselector.js',
'lib/JSLinq/JSLINQ.js',
'uicombobox', 'uiautocomplete'], function ($, tmp, datatables, jsLinq, uicombobox, uiautocomplete) {
'use strict';
var methods = {
// ... code
};
return methods;
});
$.widget("bi.bicombobox", {
_create: function () {
// ...code
},
_destroy: function () { }
});
当我运行r.js来构建名为“main-v0.1.js”的单个文件时,我得到的是
Tracing dependencies for: D:/Files/Trunk/BestInvest.Select.Website/js/build/main
-v0.1.js
Error: Error: Module loading did not complete for: bi/ui/investmentselector, uic
ombobox, uiautocomplete
The following modules share the same URL. This could be a misconfiguration if th
at URL only has one anonymous module in it:
D:/Files/Trunk/BestInvest.Select.Website/js/bi/jquery/jquery.ui.autocomplete.js:
uiautocomplete, bi/jquery/jquery.ui.autocomplete
D:/Files/Trunk/BestInvest.Select.Website/js/bi/jquery/jquery.ui.combobox.js: uic
ombobox, bi/jquery/jquery.ui.combobox
at Function.build.checkForErrors (D:\Files\Trunk\BestInvest.Select.Website\j
s\build\r.js:27237:19)
你知道发生了什么事吗
仅供参考小部件代码(再次分解)如下所示
define(['jquery',
'bi/templates/investmentselector.js',
'bi/jquery/datatables/investmentselector.js',
'lib/JSLinq/JSLINQ.js',
'uicombobox', 'uiautocomplete'], function ($, tmp, datatables, jsLinq, uicombobox, uiautocomplete) {
'use strict';
var methods = {
// ... code
};
return methods;
});
$.widget("bi.bicombobox", {
_create: function () {
// ...code
},
_destroy: function () { }
});
而且
$.widget("bi.biautocomplete", {
_create: function () {
// ...code
},
_destroy: function () { }
});
这方面的任何帮助都将是巨大的,
谢谢 您的
包含
选项使用模块的完整路径,而不是使用您在路径
中建立的缩写名称。使用路径中的名称:
include: [
"uicombobox",
"uiautocomplete",
"bi/ui/investmentselector"
]
我没有看到为最后一个定义的另一个名称,所以我保留了它的原样。通常,您不希望在路径
中包含类似foo的内容:“path/to/foo”
,有时在引用依赖项中的模块时使用foo
。您总是希望在任何地方使用foo
。在这里,r.js
查看uicombobox
(举一个例子),并通过路径
解析其路径。它在include
中看到“bi/jquery/jquery.ui.combobox”
,只需添加.js
即可解决此问题,并指向与第一个案例相同的文件。然后它意识到它有两个模块指向同一个文件,并且无法处理该文件,因为最终该文件只需要与一个模块关联
我还注意到,您的
define
调用使用.js
扩展名列出了一些依赖项。这与不指定扩展名的推荐做法背道而驰。有时扩展,有时不扩展,可能会导致像我上面解释的那样的问题。太好了,从某种程度上说,这是我应该学会的,但如果有第二双眼睛总是很好的。谢谢你的回答。我们确实有其他几个开发人员(后端)在JS世界里搞得一团糟,因此必须教给他们你刚才提到的东西。再次感谢,Quinton非常有用:在我的例子中:路径:{APIRester:'app/commons/api requester'},在requirejs模块中,我调用路径值('app/commons/api requester'),而不是使用别名APIRester。当一个js amd文件中有多个“类”时,也会发生这种情况。js模块编译器读取不同的内部模块,但它们都指向相同的url。