优化HTTP / 2的RequireJS:修改散列文件在这里是否重要?

时间:2016-05-08 19:11:58

标签: caching hash requirejs r.js

我正在尝试首先针对HTTP / 2和SPDY优化RequireJS项目,其次针对HTTP / 1.x。我没有将我的所有RequireJS模块连接成一个大文件,而是攻击r.js来重新保存本来作为单独文件连接的模块。这对于新协议会更好,因为每个文件都将单独缓存,并且对一个文件的更改不会使所有其他文件的缓存无效。对于旧协议,我将在额外的HTTP请求中支付罚金,但我至少可以通过将修订哈希附加到我的文件来避免后续轮请求(即" module.js&#34 ;变成" module.89abcdef.js")并在它们上设置一个长max-age,所以我想这样做。

r.js将名称添加到以前匿名的模块中。这意味着文件" module.js"有了这个定义:

define(function () { ... })

成为这个:

define("module.js", function () { ... })

我想要这个,因为我将通过<script>元素加载我的一些模块(以防止RequireJS HTTP请求成为依赖解析的瓶颈;我可以改为利用r.js的拓扑排序生成<script>个元素,浏览器可以在解析它们时立即加载它们。但是,我还计划动态加载一些模块(即,通过RequireJS的<script>元素的程序化插入)。这意味着RequireJS可能会在某个时候通过URL请求模块。

以下是我遇到的问题:我正在生成一个RequireJS map配置对象来映射我的模块&#39;原始模块ID为其修订版散列的模块ID,因此当RequireJS动态加载模块时,它会请求修订版的散列文件名。但它加载的模块,现在由于r.js而被命名为模块,它具有模块的未修订名称,因为我不会修改文件,直到我缩小它们之后,我只在r.js生成后才这样做(因此r.js不知道修改)。

所以文件&#34; module.89abcdef.js&#34;包含模块:

define("module.js", function () { ... })

当这些命名模块执行时,define将注册一个名称错误的模块。当其他模块需要&#34; module.js&#34;时,该名称将映射到&#34; module.89abcdef.js&#34; (感谢map配置),但由于具有onload属性的<script> src事件后实际上未定义具有该名称的模块&#34; module.89abcdef.js&#34;被解雇后,他们收到的模块是undefined

忠实于新文件名,文件&#34; module.89abcdef.js&#34;应该改为包含以下定义:

define("module.89abcdef.js", function () { ... })

所以,我相信我的问题的解决方案是用修改后的名称替换r.js生成的文件中模块的未预知名称。但是,这意味着文件的哈希现在无效。 我的问题:在这种情况下,文件的哈希无效是否重要?

我认为源代码中的模块名称不可能忠实于文件名,因为如果模块名称有哈希,那么哈希就是哈希文件名将不同,因此模块名称将成为新的哈希值,依次递归。

我担心可能会出现这样的情况:不忠实的哈希会导致文件仍然被缓存,即使它实际上已经改变了,但我想不出一个。似乎将文件的原始内容的相同哈希附加到文件的名称和模块的名称应始终生成唯一文件。

(我冗长的解释是试图消除某些&#34;解决方法&#34;类型的答案。如果我没有动态加载模块,那么我就不需要使用{{1}并且我不会有文件名与模块名称不匹配;但我会动态加载模块,因此解决方法不起作用。我也相信如果我不需要修改文件我只是在更新的协议上为客户提供服务[我可以使用ETag,因为没有额外的开销来进行比较],但我确实为旧客户提供服务,因此解决方法也不起作用。最后,我不想在修改文件后运行r.js,因为我只想在缩小文件后进行修改,以防缩小将两个源映射到同一输出,在这种情况下,我可以避免不必要的缓存失效。)

0 个答案:

没有答案