不解析带有JS扩展的RequireJS路径

不解析带有JS扩展的RequireJS路径,requirejs,js-amd,wijmo,Requirejs,Js Amd,Wijmo,我使用的库(非常自私,IMHO)假设baseUrl将指向公司的CDN: baseUrl: "[http protocol slash slash]cdn.wijmo.com/amd-js/" 起初,我以为我会将上述Url的内容复制到我自己的文件夹(例如/scripts/wijmo/amd js),但这不起作用,因为wijmo的好人在他们的amd define语句中硬编码了路径引用,例如: define(["./wijmo.widget"], function () { ... }); 以上所

我使用的库(非常自私,IMHO)假设baseUrl将指向公司的CDN:

baseUrl: "[http protocol slash slash]cdn.wijmo.com/amd-js/"
起初,我以为我会将上述Url的内容复制到我自己的文件夹(例如/scripts/wijmo/amd js),但这不起作用,因为wijmo的好人在他们的amd define语句中硬编码了路径引用,例如:

define(["./wijmo.widget"], function () { ... });
以上所述(如果我正确理解的话)的意思是,如果您有任何其他非Wijmo AMD模块,那么您必须:

(a) 将它们放在amd js路径下,也许放在名为“myScripts”的子文件夹中 (b) 对您自己的AMD使用硬编码的RequireJS路径引用,如下所示:

paths: {
  "myAMD_1": "http://www.example.com/scripts/myScripts/myAMD_1",
  "myAMD_2": "/scripts/myScripts/myAMD_2.js"
}
(a) 可以,但这意味着baseUrl不能指向Wijmo CDN,因为我没有访问Wijmo CDN站点的权限,所以我必须将在amd js下发布的文件移动到我自己的服务器

(b) 这是一种工作,我的问题是:如果我使用语法myAMD_1,那么一切都很好。但这不允许我在使用localhost的本地开发机器上进行测试。(我不想检测运行在哪台服务器上并自定义路径值……我希望在发布到http服务器之前和之后路径保持不变。)

现在,根据RequireJS文档:

有时您确实希望直接引用脚本,但不符合查找脚本的“baseUrl+路径”规则。如果模块ID具有以下特征之一,则该ID将不会通过“baseUrl+路径”配置传递,而是被视为与文档相关的常规URL: *以“.js”结尾。 *以“/”开头。 *包含URL协议,如“http:”或“https:”

当我试图用.js结束(终止)我的路径引用(如上面的AMD_2所示)时,RequireJS找不到我的AMD,因为它最终会寻找myAMD_2.js.js(注意两个.js后缀)。因此,看起来RequireJS不再遵守文档中所说的路径解析算法。由于.js后缀不能正常工作,我无法轻松修复对我自己的AMD的引用,因为我不确定它们将发布到哪个服务器名称或物理路径结构——我真的希望使用相对路径

最后,我不想更改Wijmo的AMD模块,不仅因为它们有几十个,还因为每次它们发布Wijmo更新时,我都需要重新应用我的定制


>如果我的BaseURL必须指向一个硬编码的WiMMO路径,那么我如何使用我自己的AMD而不将它们放在WijMo路径下的子文件夹中,而不需要对我自己的AMD在哪里发布任何固定的路径或URL假设?

< P>我可以建议在这里考虑两种方法——它们都有一些缺点,但是可以工作。 第一种方法是为每个需要加载的Wijmo模块提供路径。这是可行的,但您在问题描述中已经提到了这种方法的明显缺点:Wijmo有许多需要引用的模块,将来跨更新维护模块列表可能会有问题

如果您可以接受这些缺点,那么以下是RequireJS配置的外观:

require.config({
路径:{
“wijmo.wijgrid”:”http://cdn.wijmo.com/amd-js/wijmo.wijgrid',
“wijmo.widget”:”http://cdn.wijmo.com/amd-js/wijmo.widget',
“wijmo.wijutil”:”http://cdn.wijmo.com/amd-js/wijmo.wijutil',
//…在此列出所有相关的Wijmo模块
}
});
require(['wijmo.wijgrid'],function(){/*…*/});
第二种方法是最初配置RequireJS
baseUrl
,以加载Wijmo模块。然后,一旦Wijmo模块加载完毕,重新配置RequireJS以能够加载本地应用程序模块。这种方法的缺点是,所有Wijmo模块都需要预先加载,因此您无法在自己的模块中根据需要使用Wijmo模块。这一缺点需要与在第一种方法中列出所有Wijmo模块的显式路径的缺点相平衡

例如:

require.config({
baseUrl:'http://cdn.wijmo.com/amd-js',
路径:{
//…根据Wijmo文档列出最小模块,如Jquery和Globalize
}
});
require(['wijmo.wijgrid'],function(){
require.config({
baseUrl:'。'
});
require(['main'],function()){
/* ... */
});
});

谢谢,但我不知道在将baseUrl切换到另一个值之前如何“加载Wijmo模块”…给出的第二个示例演示了如何做到这一点。它做了一个
require(['wijmo.wijgrid'],…)
,然后在require的回调函数中(一旦wijmo模块成功加载就会调用该函数),它会在需要本地应用程序模块之前将
baseUrl
重置为另一个值。好的,明白了。我认为您提供了一个很好的想法,即在加载Wijmo模块后更改baseUrl。即使它们是“预加载”的,但最终的Wijmo占用空间仍然比为整个Wijmo集合加载脚本要小(如果不使用RequireJS,情况就是这样)。我当然希望Wijmo的人修复他们的amd,因为我们不应该为了在我们的企业应用程序中使用Wijmo amd和其他(非Wijmo)amd而进行创造性的思考。