一、ETag相关
ETag(Entity Tag)是 HTTP 1.1 协议中的一部分,用于确定浏览器缓存的一个资源在服务器上是否已经被修改。它是一个可以分配给特定版本和实例的资源的标识符,通常是一个哈希值。服务器可以在发送资源时,将该资源的 ETag 一起发送给客户端。然后客户端在再次请求该资源时,会将此 ETag 值一起发送给服务器,服务器根据 ETag 判断资源是否有变动。
ETag 的工作原理是这样的:
- 浏览器第一次请求一个资源(比如一个图片),服务器在返回这个资源的同时,也把这个资源的 ETag 值(通常是一个哈希值)在响应头中一并返回,浏览器收到资源后,会将这个资源及其 ETag 值缓存起来。
- 当浏览器再次请求这个资源时,会将之前保存的 ETag 值放在请求头中一并发送给服务器。服务器会比对请求头中的 ETag 值和服务器上该资源的当前 ETag 值是否一致,以此来判断资源是否有变动。
- 如果 ETag 没变,说明资源没有变动,服务器会返回 304 状态码,告诉浏览器直接使用本地缓存即可。如果 ETag 变了,说明资源已经被改动过,服务器会返回新的资源内容和新的 ETag 值。
使用 ETag 的方法如下:
- 在服务器端,可以在响应头中添加 ETag,例如
ETag: "12345"
。 - 在客户端,可以在请求头中添加 If-None-Match,例如
If-None-Match: "12345"
。
ETag 可以有效地节省带宽和服务器资源,因为当资源没有变化时,服务器可以不用返回资源内容,只需要返回一个 304 状态码即可。同时,ETag 也有助于防止同时写入("mid-air"写入)。这是当多个用户同时尝试更改同一资源时可能会发生的问题。通过将 ETag 值放入 If-Match 请求头中,可以让服务器只在 ETag 值匹配时才执行操作。如果 ETag 值不匹配,说明资源已经被其他用户更改,服务器可以返回 412(Precondition Failed)状态码,拒绝执行操作。
二、JS引用方式
type=Module和UMD(Universal Module Definition)是JavaScript模块加载方式的两种不同策略。它们的主要区别在于使用方式和兼容性。
当在