dojoConfig 中的 CacheBust 中断路径

CacheBust in dojoConfig breaks paths

我有同样的问题someone reported a year ago on ESRI forum:查询字符串出现在文件名之前,就在最后一个斜线之后,像这样:

http://js.arcgis.com/3.13/esri/images/symbol/sfs/?1430314495556diagonalcross.png

对我来说是一样的,除了我的 cacheBust 不会破坏 .png 图像,但 manifest.json 文件(但不会 config.json)。似乎某处是支持 extensions/filenames 的开关,默认使用 "add query string after the last slash" 规则。在文件名后添加查询字符串没有帮助 - dojo 在不应该的地方添加了另一个查询字符串。

如果这真的是白名单不合理造成的,我需要找到并更改它。我检查了 Web AppBuilder(1.4 版),没有发现 cacheBust。另一个可能的罪魁祸首是 ArcGIS JavaScript API(在我的例子中是 3.15)——它在第 11 行的混淆 init.js 中包含对 cacheBust 的引用,但我没有设法跟踪查询字符串放置到 URL 的位置。 Dojo 本身 (1.10) 中的错误似乎不太可能,但似乎仍有可能。

有什么解决办法吗?使用 API 的下载代码是可以的。如果不是,谁能帮我定位到代码中的正确位置,或者反驳说问题出在那里?

我下载了API,稍微看了一下,发现没有限制性白名单。 querystring 分配得太早了,分配给了稍后添加文件名的基础URL。所以解决方案是找到添加的文件名在哪里,并使这个过程能够识别查询字符串。

所以我找到了 manifest.json 的分配位置(在 Web AppBuilder 中,文件 WidgetManager)并将其更改为处理查询字符串:

if (widgetJson.folderUrl.indexOf("?") > -1) {
    url = widgetJson.folderUrl.substr(0, widgetJson.folderUrl.indexOf("?")) + 'manifest.json' + widgetJson.folderUrl.substr(widgetJson.folderUrl.indexOf("?"));
} else {
    //this is how it looked before
    url = widgetJson.folderUrl + 'manifest.json';
}

代码可能稍微优雅一些​​,但它确实有效。 cacheBust 有一些其他文件出现乱码,但此算法有效。

我检查了另一个答案中提到的代码:

if (widgetJson.folderUrl.indexOf("?") > -1) {
    url = widgetJson.folderUrl.substr(0, widgetJson.folderUrl.indexOf("?")) + 'manifest.json' + widgetJson.folderUrl.substr(widgetJson.folderUrl.indexOf("?"));
} else {
    //this is how it looked before
    url = widgetJson.folderUrl + 'manifest.json';
}

我不推荐这种方法。我正在使用 v2.3。

确定要使用的 url 的代码在产品的 3d 和 2d 部分不同。此代码仅修复 manifest.json 文件的 url 问题。它没有解决图标文件(或其他可能的文件类型)的相同问题。

此外,当您更改 Web AppBuilder 应用程序代码时,它会被复制到您创建的每个新应用程序中。相反,如果您已经创建了一个应用程序,则必须再次进行更改,每个现有应用程序一次。出现的每个新文件类型问题都会导致每个 Web 应用程序构建器产品安装和每个使用它构建的应用程序的修复。 Esri 的每次新升级都可能需要重新进行完全相同的更改。

我建议在 Esri 修复底层代码问题之前不要将 CacheBust 设置为 true,而不是尝试修补它。