Javascript强制文件缓存

Javascript force file caching

本文关键字:缓存 文件 Javascript      更新时间:2023-09-26

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

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

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

写一个库
  • HTML5本地存储(如果可用)/manifest
  • 与java的回退如果它是可用的
  • 与silverlight的回退如果它可用。

我对这个很感兴趣,最好是用JavaScript。

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


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

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

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

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

该字段通常沿着

一行指定

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

公众

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

私人

全部或部分响应消息是为单个用户准备的,绝对不能被共享缓存缓存。这允许原点服务器声明指定的部件的响应只针对一个用户,并且是无效的对其他用户请求的响应。私有(非共享)缓存可以缓存响应。注意:private这个词的用法只控制在哪里响应可能被缓存,并且不能确保的隐私消息内容。

no - cache

如果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/
同时,请注意,如果您希望为用户提供离线内容,则主要适用于应用程序缓存的使用。

在我看来,你重新发明轮子。你应该利用CloudFlare这样的代理来为你处理静态资产的缓存,而不是试图在浏览器的内置缓存之上创建第二个缓存。

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