浏览器的缓存机制
- 强缓存:浏览器直接从本地缓存中读取资源,而无需与服务器通信
- 协商缓存则需要浏览器向服务器发送请求,询问资源是否有更新,如果没有更新,则返回304状态码,告诉浏览器可以从缓存中获取资源,如果有更新,则返回新的资源。需要注意的是,即使服务器返回带有Last-Modified或ETag头的响应,如果客户端缓存已经过期或者已被修改,那么浏览器也可能认为资源已经更改,并且会向服务器发出新的请求以获取最新版本的资源。在这种情况下,服务器将返回包含新内容的状态码200响应,而不是304状态码,因为服务器无法确定客户端缓存中的资源是否还有效。因此,在某些情况下,即使文件没有变化,刷新页面时浏览器也可能会返回状态码200
前端发包为何有缓存
前端发包通常会将代码打包成静态资源文件进行发布,这些文件可能包含了 CSS、JavaScript、图片等内容。为了提高页面加载速度和减少服务器负担,浏览器会对这些静态资源进行缓存,使得用户在下一次访问同一个网页时,可以直接从本地缓存中获取相应的资源文件,而不必再次向服务器发送请求获取资源,从而提高了页面加载速度和降低了网络流量消耗。
前端加了hash发包为何有缓存
即使前端打包生成的静态资源文件名带有 hash 值,浏览器仍然会对这些文件进行缓存。这是因为浏览器缓存是根据 URL 进行管理的,只要 URL 不变,浏览器就会认为是同一个资源,将其缓存下来。而在前端打包时加入 hash 值,则是为了保证每次文件内容更新后,文件名发生变化,从而避免浏览器缓存旧的文件而导致页面出错。此时浏览器会重新请求新的文件,但在新文件未过期之前,仍然会被缓存,提高了页面加载速度和降低了网络流量消耗。
缓存周期大概是多久
有效期是由服务器在响应头中通过设置 Cache-Control 和 Expires 等字段来控制的。如果服务器设置了 max-age=3600,表示新文件会被缓存 3600 秒(1小时),过期后浏览器会重新向服务器请求资源;如果同时设置了 Expires,那么浏览器会在到期时间之前再次向服务器发送请求判断是否有更新的资源可用。但是需要注意的是,实际的缓存时间还受到其他因素的影响,例如浏览器类型、用户配置、代理服务器等,因此不能完全依赖客户端的缓存策略来控制资源的更新。
max-age=3600 表示资源在客户端缓存中的最长有效期为 3600 秒(1小时),客户端在这个时间内再次请求该资源时会直接使用缓存,而不是向服务器发送请求。但实际情况下,由于浏览器、代理服务器等各种因素的影响,资源的缓存时间可能会比 max-age 短,也可能会比 max-age 长,因此你可能在十分钟左右就可以看到更新的资源了