使用NGINX+Express的URL指纹/主动缓存



在NGINX(代理)和Node/Express堆栈中处理主动缓存和URL指纹的推荐技术是什么?

谷歌在其最佳实践指南中建议"使用指纹来动态启用缓存",这正是我想要实现的。

我已经研究了很多不同的指纹识别方法,但我很难理解在什么情况下,这些方法实际上会生成新的指纹,以及最好坐在开发管道的哪个部分。我之前曾假设,如果文件上的"上次修改"发生更改,那么服务器将生成另一个指纹,但现在似乎还不是这样。(除非我配置错误)

以下是几种不同的方法:

运行时指纹

  • 指套
  • 静态资产

构建指纹

  • 资产架
  • 节点版本资源

CI指纹

  • 咕哝指纹
  • grunt资产版本控制

因此,我希望有人能回答几个问题:

  1. 指纹识别是ETag的一项要求吗?还是跨浏览器支持存在太多漏洞?

  2. 资产应该放在CDN上,所以这个问题在很大程度上是由CDN提供商解决的吗(如果是,你如何在没有手动参与的情况下更新参考资料)?

  3. 如何在没有手动清除缓存的情况下生成新指纹?

  4. 关于这种指纹识别在开发人员管道中的位置,有什么建议?我想避免依赖Grunt.js

我觉得我错过了一些显而易见的东西,所以如果你能回答其中一个问题,我将不胜感激。

指纹和Etags是减少加载时间的独立功能。

如果浏览器已经缓存了资产并且资产没有更改,Etag可以避免重新发送资产。但是,浏览器仍然需要单独的HTTP往返来发送"如果不匹配"并返回"304未修改"。

加速HTTP往返的最好方法是避免进行一次。当网站的第二个页面使用与第一个页面相同的资产,并且这些资产具有远期缓存过期标头时,那么在第一次请求这些资产时,甚至不需要为这些资产进行一次往返。

指纹是一种根据每个资产的内容为其提供唯一名称的技术。然后,当资产(如CSS捆绑包)中的一个比特发生更改时,其名称也会发生更改,因此浏览器将获取更新的资产。而且,由于指纹识别使用内容的加密哈希,只要资产相同,在多个服务器上计算的唯一名称就相同。任何地方的缓存(CDN、ISP、网络设备或网络浏览器)都可以保存每个资产的副本,但由于HTML引用了每个资产的唯一名称,因此只有该资产的正确版本才能从缓存中提供。

每个浏览器都支持Etag和指纹识别。

  1. 指纹不是必需的,它是一种优化。如果您正在使用Stylus、Browserify和AngularTemplateCaches等已经需要构建步骤的技术,那么添加指纹是免费的。

  2. 您的HTML页面将具有类似/aboutus的名称,而不是使用指纹识别获得的/aboutus-sfghjs3646dhs73shwsbby3。您链接的所有解决方案都支持Javascript、CSS和图像的指纹识别,以及一种将指纹名称动态替换为HTML的方法。因此,HTML将引用/css-hs6hd73ydhs7d7shsh7w,直到您更改CSS中的一个字节,然后它们将引用/css-37r7dhsh373hd73(一个不同的文件)。

  3. 指纹只需要在修改文件时生成,通常应该在服务器重新启动或构建时生成。

  4. 我推荐Asset Rack,它支持多种资产类型,可以从RAM中提供指纹资产或将其推送到CDN。每次启动Express时,它都会生成所有指纹。

最新更新