需要使用带查询字符串的RequireJS data-main却无法工作

4
为了避免浏览器缓存我的优化JS包,我想在请求URL中包含MD5摘要。我尝试了以下代码:
<script src="lib/require.js" data-main="app/main.js?md5=ABCD"></script>

然而,查询字符串的引入导致了对/main.js的GET请求。也就是说,查询字符串和路径中甚至缺少了scripts
我该如何强制加载指定data-main脚本时使用我计算出的哈希值?请注意,标记正在生成,因此我可以在HTML文档中的任何位置注入哈希值。

@kryger,我过去使用过这种技术来避免非主要脚本的缓存问题。然而,该配置不会影响从data-main加载脚本,除非您直接将其包含在HTML中,以便在RequireJS脚本启动之前执行。这个问题是相关的,但微妙地不同,事实上,在提出这个问题之前,我已经阅读了那个问题。希望这也能帮助其他人。 - Drew Noakes
1个回答

5

技巧在于使用urlArgs配置设置。因此,在这个例子中,代码应该如下:

<script>
require = {
    urlArgs: 'md5=ABCD'
};
</script>
<script src="lib/require.js" data-main="app/main.js"></script>

请确保在加载require.js库之前定义全局require对象。

这样做的原因是因为RequireJS在启动时运行以下代码(截至v2.1.10,参见未压缩源代码的第190行):
//Allow for a require config object
if (typeof require !== 'undefined' && !isFunction(require)) {
    //assume it is a config object.
    cfg = require;
    require = undefined;
}

查看浏览器的开发工具,您应该会在查询字符串上看到参数:

enter image description here


问题在于 data-main 是异步加载的,而你正在同步加载 urlArgs。虽然 main.js 有可能在设置 config 之前加载,但这仍然是一个硬编码的假设。我仍然想知道如何从 data-main 中获取查询字符串参数 :( - TruMan1
@TruMan1,你说得对。我已经更新了我的答案,并加入了删除竞态条件的代码。 - Drew Noakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接