【问题标题】:Javascript force file cachingJavascript强制文件缓存
【发布时间】:2015-08-21 18:14:27
【问题描述】:

我的网站每天有 20 万活跃用户

不久前我读了一篇关于强制 javascript 和 PHP 缓存文件的文章。我以前从来不需要缓存我的文件,但现在我正在处理大量传入和传出服务器的数据,我想在客户端本地存储一些数据。

我不知道是否有更好的方法可以做到这一点,但基本上,我正在考虑使用

  • HTML5 本地存储(如果可用)/manifest
  • 如果可用,则使用 java 的后备
  • 如果可用,则使用 silverlight 的后备。

我对此非常感兴趣,最好是 JavaScript。

我想知道如何使用 JavaScript 缓存文件


在任何人认为我在重新发明轮子之前

(例子) 我有几个 Javascript 文件,如果更新,浏览器将不会重新加载脚本,因为它已被缓存。通过版本控制,我可以管理用户何时需要重新加载缓存数据。

【问题讨论】:

  • 浏览器缓存 JavaScript 文件
  • 有时。但我想缓存的不仅仅是 JavaScript。
  • 隐约希望实现对所有数据的版本控制。
  • 缓存必须在服务器上完成。您应该缓存来自 JavaScript 而不是文件的请求。

标签: javascript html caching


【解决方案1】:

见caching in HTTP。基本上,对于每个请求,您都应该在响应中指定 cache-control 标头字段,指示何时有新内容可用。 cache-control头域的正式定义如下:

Cache-Control 通用头字段用于指定指令 所有缓存机制都必须遵守 请求/响应链。这些指令指定了旨在 防止缓存对请求产生不利影响或 回复。这些指令通常会覆盖默认缓存 算法。缓存指令是单向的,因为存在 请求中的指令并不意味着相同的指令是 在响应中给出。

该字段通常沿线指定

cache-control: private|public, max-age=[, no-cache].

公开

表示响应可以被任何缓存缓存,即使 它通常是不可缓存的或只能在非 共享缓存。 (另见授权,第 14.8 节,了解更多 详细信息。)

私人

表示响应消息的全部或部分 适用于单个用户,不得由共享用户缓存 缓存。这允许源服务器声明指定的部分 的响应仅适用于一个用户,并且不是有效的 响应其他用户的请求。私有(非共享)缓存可以 缓存响应。注意:这个词私有的用法只控制 响应可能被缓存的地方,并且无法确保响应的隐私 消息内容。

无缓存

如果 no-cache 指令没有指定字段名,那么 缓存不能使用响应来满足后续请求 没有与原始服务器成功重新验证。这允许一个 源服务器以防止缓存,即使是已被缓存的缓存 配置为向客户端请求返回陈旧的响应。如果 no-cache 指令确实指定了一个或多个字段名称,然后是一个缓存 可以使用响应来满足后续请求,但须遵守任何 缓存的其他限制。但是,指定的字段名称 不得在对后续请求的响应中发送 与源服务器成功重新验证。这允许原点 服务器以防止在响应中重复使用某些标头字段, 同时仍允许缓存其余响应。

例如,cache-control: private, max-age=86400, no-cache 指示客户端缓存响应并重复使用它,直到 86400 秒(24 小时)过去。但是,在这段时间过去之前,情况可能会发生变化。 no-cache 指令每次都会导致重新验证。就像浏览器每次都在询问我真的可以向您的用户展示缓存的内容吗?连同ETag 标头,您将能够在之前缓存的内容过期之前将重要更改推送给您的用户。

在重新验证期间,将响应中的 Etag 与先前在对同一资源的请求中提供的 Etag 进行比较。如果它们相同,则可以确保资源没有更改,因此缓存确实有效。否则,如果它们不同,则资源内容已更改,新内容将作为对用户的响应。

阅读有关 HTTP 缓存的更多信息:

  1. https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=en#validating-cached-responses-with-etags
  2. http://www.mobify.com/blog/beginners-guide-to-http-cache-headers/

同时,请注意Application Cache 的使用主要适用于您希望为用户提供离线内容的情况。

【讨论】:

    【解决方案2】:

    在我看来,您会重新发明轮子。与其尝试在浏览器的内置缓存之上创建第二个缓存,不如利用 CloudFlare 之类的代理来为您处理静态资产的缓存。

    对于缓存文件不更新的问题,强制重新请求资源的常用技术是添加一个包含文件最后修改时间的查询字符串参数(例如/js/script.js?1441538979),这通常会强制浏览器重新下载文件。

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 2015-03-29
      • 2012-08-08
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2011-07-02
      相关资源
      最近更新 更多