如何要求浏览器缓存文件以备将来使用

How to ask browser to cache files for future use

我有一个正在使用一些大型库的应用程序。加载了将近 200 个 js 和 css 个文件。事情就是这样。首先,它加载第一个 html 中列出的 30 个。比运行ning后的一些。他们触发加载自己需要的文件。在该库启动后,我 运行 一个回调启动其他库加载自己的文件。

所以在第一次加载网络中 activity 在开始下载 50 个其他文件之前几乎停止了几次。而且网站打开时间差不多20秒。但这主要是因为库加载之间存在较大差距。

因为我有所有 200 个文件的列表,有什么方法可以让浏览器开始下载所有这些文件,并且只在需要时才 运行。所以它会在一开始就下载所有这些库。

我的第一个方法是我认为也许我可以将文件列表添加到第一个 html 文件的 HTTP header。我查找了 https://en.wikipedia.org/wiki/List_of_HTTP_header_fields,但没有找到可以发送将用于此 html 文件的文件列表的文件。 google 也没有提供任何其他解决方案,至少我找不到它。

更新:

这些文件都在CDN,我无法更改资产的headers,我只能更改我的初始html文件headers。

第一位,如何将其缓存。这来自服务器。基本上,设置 ExpiresETagCache-Control 或一些组合来配置它应该停留多长时间。不管它是如何加载的,如果它有其中之一 headers,它就会一直存在。请注意,不能保证它会一直存在(尤其是在移动设备上,磁盘 space 更有价值),但大多数会。

至于pre-loading他们,可能就没有必要了。如果它们都加载并被缓存,那么后续的 运行 可能不必等待,你可能会很好。这样,它们将以正确的顺序加载,并且仅在您需要时 运行。

如果您仍然希望它们立即全部下拉并且您有它们的列表,您可以将它们分别添加为 <script> 标签。您可以将此列表呈现为脚本标签 server-side,或者拉取列表并使用一些 JavaScript 动态添加脚本标签。

如果这些脚本标签具有 load-time 依赖性(即 B 必须在 A 或 B 失败之前启动,等等),您需要确保它们的顺序正确。

如果它们具有 onload 功能,那么您必须以某种方式将其包装起来,以便它仅在您需要时触发。

如果您使用 apache,则需要在 .htaccess 中使用名为 mod_expires 的插件。

简而言之,浏览器会要求服务器获取文件,然后浏览器响应文件和过期时间。如果浏览器将再次获取相同的文件,它将决定文件是否足够旧以实际发出获取新文件的请求,否则它将使用缓存的版本。

要实现此功能,您的 .htaccess 应如下所示:

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 week”
ExpiresByType image/jpeg "access 1 week"
ExpiresByType image/gif "access 1 week"
ExpiresByType image/png "access 1 week"
ExpiresByType image/svg "access 1 week"
ExpiresByType image/svg+xml "access 1 week"
ExpiresByType text/css "access 1 hour"
ExpiresByType text/x-javascript "access 1 hour"
ExpiresByType text/javascript "access 1 hour"
ExpiresByType application/javascript "access 1 hour”
ExpiresByType application/x-javascript "access 1 hour”
ExpiresByType application/pdf "access 1 week"
ExpiresByType application/x-shockwave-flash "access 1 week"
ExpiresByType image/x-icon "access 1 week"
</IfModule>

上述规则,根据内容类型为 png、jpg、jpeg、javascript 等内容类型添加一小时或一周的有效期。

我找到的解决方案是预加载,它允许提前加载文件。

我必须将标签添加到我的 html 文件中:

<link rel="preload" href="https://example.com/style.css" as="style">
<link rel="preload" href="https://example.com/example.js" as="script">
<link rel="preload" href="https://example.com/example.woff2" as="font" type="font/woff2" crossorigin>

更多信息:https://developer.mozilla.org/en-US/docs/Web/HTML/Preloading_content

这里:https://www.smashingmagazine.com/2016/02/preload-what-is-it-good-for/

预加载浏览器支持https://caniuse.com/#feat=link-rel-preload

如果您想预先启动 SSL 连接,

Preconnect 可能也会有所帮助。