在NGINX(代理)和Node/Express堆栈中处理主动缓存和URL指纹的推荐技术是什么?
谷歌在其最佳实践指南中建议"使用指纹来动态启用缓存",这正是我想要实现的。
我已经研究了很多不同的指纹识别方法,但我很难理解在什么情况下,这些方法实际上会生成新的指纹,以及最好坐在开发管道的哪个部分。我之前曾假设,如果文件上的"上次修改"发生更改,那么服务器将生成另一个指纹,但现在似乎还不是这样。(除非我配置错误)
以下是几种不同的方法:
运行时指纹
- 指套
- 静态资产
构建指纹
- 资产架
- 节点版本资源
CI指纹
- 咕哝指纹
- grunt资产版本控制
因此,我希望有人能回答几个问题:
-
指纹识别是ETag的一项要求吗?还是跨浏览器支持存在太多漏洞?
-
资产应该放在CDN上,所以这个问题在很大程度上是由CDN提供商解决的吗(如果是,你如何在没有手动参与的情况下更新参考资料)?
-
如何在没有手动清除缓存的情况下生成新指纹?
-
关于这种指纹识别在开发人员管道中的位置,有什么建议?我想避免依赖Grunt.js
我觉得我错过了一些显而易见的东西,所以如果你能回答其中一个问题,我将不胜感激。
指纹和Etags是减少加载时间的独立功能。
如果浏览器已经缓存了资产并且资产没有更改,Etag可以避免重新发送资产。但是,浏览器仍然需要单独的HTTP往返来发送"如果不匹配"并返回"304未修改"。
加速HTTP往返的最好方法是避免进行一次。当网站的第二个页面使用与第一个页面相同的资产,并且这些资产具有远期缓存过期标头时,那么在第一次请求这些资产时,甚至不需要为这些资产进行一次往返。
指纹是一种根据每个资产的内容为其提供唯一名称的技术。然后,当资产(如CSS捆绑包)中的一个比特发生更改时,其名称也会发生更改,因此浏览器将获取更新的资产。而且,由于指纹识别使用内容的加密哈希,只要资产相同,在多个服务器上计算的唯一名称就相同。任何地方的缓存(CDN、ISP、网络设备或网络浏览器)都可以保存每个资产的副本,但由于HTML引用了每个资产的唯一名称,因此只有该资产的正确版本才能从缓存中提供。
每个浏览器都支持Etag和指纹识别。
-
指纹不是必需的,它是一种优化。如果您正在使用Stylus、Browserify和AngularTemplateCaches等已经需要构建步骤的技术,那么添加指纹是免费的。
-
您的HTML页面将具有类似
/aboutus
的名称,而不是使用指纹识别获得的/aboutus-sfghjs3646dhs73shwsbby3
。您链接的所有解决方案都支持Javascript、CSS和图像的指纹识别,以及一种将指纹名称动态替换为HTML的方法。因此,HTML将引用/css-hs6hd73ydhs7d7shsh7w
,直到您更改CSS中的一个字节,然后它们将引用/css-37r7dhsh373hd73
(一个不同的文件)。 -
指纹只需要在修改文件时生成,通常应该在服务器重新启动或构建时生成。
-
我推荐Asset Rack,它支持多种资产类型,可以从RAM中提供指纹资产或将其推送到CDN。每次启动Express时,它都会生成所有指纹。