EAS Hosting 部署中的缓存
编辑页面
了解 EAS Hosting 中缓存的工作方式。
For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.
API 路由中的缓存
API 路由可以返回 Cache-Control 指令,EAS Hosting 会根据缓存指令的值适当地缓存响应。
export async function GET(request) { return Response.json({ ... }, { headers: { 'Cache-Control': 'public, max-age=3600' }, }); }
响应中出现的 Cache-Control 指令将由 EAS Hosting 按照指定方式用于缓存响应。例如,如果 Response 指定了一个 max-age 为 1800 秒的缓存指令,那么在再次调用 API 路由之前,该响应将被缓存指定的时长。
有关 Cache-Control 指令的更多详情,请参阅 MDN 文档。
Cache-Control 指令
Cache-Control 标头既可以作为请求标头的一部分发送,也可以作为响应标头的一部分发送,并且它由以逗号分隔的一组设置组成。
当请求发送 Cache-Control 标头时,通常会发送一些指令,用于限制缓存响应可以如何被传递。如果它作为响应标头发送,它会向 EAS Hosting 指定响应将如何被缓存,以及通过重新调用 API 路由多久进行一次重新验证。
如果某个缓存指令接受参数,则该指令后面会跟一个等号和参数值,例如 max-age=3600。如果该指令不接受参数,则会在列表中不带值,例如 public。
如果传入多个缓存指令,则每个指令之间用逗号分隔,例如 public, max-age=3600。
可缓存性
若干响应指令决定缓存响应是否可以被缓存或返回给客户端:
public— 表示任何缓存(包括 EAS Hosting)都可以存储该响应。不指定它时,默认表示该响应不会在多个请求之间共享。private— 表示该响应仅供单个用户使用,并且只能由浏览器缓存。no-store或no-cache— 表示该响应绝不会被缓存或存储。
例如,指定 public, max-age=3600 表示 EAS Hosting 也被允许(此外还包括用户的浏览器)将响应存储 3600 秒。然而,private, max-age=3600 表示只有用户的浏览器可以将响应存储 3600 秒,而 EAS Hosting 不会缓存它。
对于没有设置 Authorization 标头,并且请求方法为 HEAD 或 GET 的请求,其响应会自动被视为可公开缓存。
为了区分浏览器和 EAS Hosting 可以缓存什么,可以使用 s-maxage 指令。例如,返回 s-maxage=3600 指令将允许 EAS Hosting 将响应缓存 3600 秒,而用户的浏览器则完全不会缓存它。
标头名称
如上所示,Cache-Control 标头同时被浏览器和 EAS Hosting 接受并理解。若要更细粒度地控制 EAS Hosting 的缓存,并使其与用户浏览器分开配置,你可以返回 CDN-Cache-Control 标头。使用此标头时,它会隐式地为你的指令添加 public,并强制 EAS Hosting 按照你的指令缓存响应。
export async function GET(request) { return Response.json({ ... }, { headers: { 'Cache-Control': 'no-store', // 浏览器不应存储该响应 'CDN-Cache-Control': 'max-age=3600', // EAS Hosting 应缓存 3600 秒 }, }); }
过期指令
max-age用于指定一个响应在被视为过期之前会被缓存多长时间s-maxage用于仅向 EAS Hosting 指明它应缓存响应多长时间no-cache等同于指定max-age为零immutable用于指示该响应可被无限期缓存,并且应尽可能长时间地缓存,且永远不会被视为过期。
此外,还可以使用两个较新的缓存控制指令来确定当响应的 max-age 指定时间已过后,过期响应可以被使用更长时间。
stale-while-revalidate为响应指定一个过期时间段。响应被视为过期后,它允许在指定时间范围内仍然将该响应返回给客户端,同时在后台重新验证请求。- 例如,
max-age=1800, stale-while-revalidate=3600表示该响应会缓存 1800 秒。1800 秒后,如果对该响应发起新请求,只要请求发生在 3600 秒内,就会返回该响应,但该请求也会在后台发送到你的 API 路由。
- 例如,
stale-if-error指定当底层 API 路由意外失败时,过期响应可被返回的时间段。这对于让 API 路由具备容错能力很有用,并且适用于你的 API 路由因运行时错误崩溃,或返回500、502、503或504响应状态时。- 例如,
max-age=1800, stale-if-error=3600表示该响应会缓存 1800 秒。1800 秒后,如果你的 API 路由返回错误,则会将过期缓存响应发送给客户端,而不是错误。
- 例如,
请求指令
Cache-Control 标头可以作为请求标头的一部分发送,并会影响 EAS Hosting 如何选择返回缓存响应。
only-if-cached仅在有缓存时才返回响应,否则会以504响应中止请求(并带有must-revalidate指令)no-store、no-cache或max-age=0将跳过缓存响应,并始终强制 EAS Hosting 忽略其请求缓存min-fresh会在缓存响应比指定值更旧时跳过该响应。例如,min-fresh=360会阻止在缓存超过 360 秒时返回缓存响应。
此外,max-stale 和 stale-if-error 可作为请求缓存指令的一部分发送,并限制缓存响应的过期时间。然而,请记住,这并不会覆盖请求被缓存的时长,因此这只能用于减少可接受的缓存响应过期程度。
max-stale指定客户端可接受的缓存响应的最大时间。例如,如果某个响应使用stale-while-revalidate=3600指令缓存,则请求可以指定max-stale=1800,以便只接受最大过期时间为 1800 秒的过期响应(处于其过期期间,而不是max-age期间)stale-if-error可用于自定义当 API 路由原本会返回错误时,接受过期响应的时间段。
对于这两个指令,如果服务器端响应的缓存时间比在响应的 max-age 之上指定的 max-stale 或 stale-if-error 时长更短,那么这些指令将不起作用。
请求方法
除了缓存 GET 和 HEAD 请求外,EAS Hosting 也支持缓存 POST 请求。
只要发送的 POST 请求的请求体小于 1MB,你的响应就可以指定带有 public 指令的 Cache-Control 标头,以将该请求标记为可缓存。
Expires 标头
EAS Hosting 也支持使用较旧的 Expires 标头进行缓存。
由于这不会将响应标记为可公开缓存,因此它通常仅用于未认证的 GET 响应。它可以指定一个 HTTP Date 值,直到响应被缓存。到达指定时间戳后,该响应将被视为过期。
Vary 标头
默认情况下:
GET或HEAD请求只按其 URL 缓存POST请求只按其 URL 和请求体缓存
不过,你可以使用 Vary 标头来指定请求应使用请求标头作为缓存键。例如,如果某个 API 路由响应 Vary: custom-header ,那么只有当请求的 custom-header 标头值与缓存请求的 custom-header 值匹配时,才会使用该缓存响应。
CORS 缓存
对于许多 Web 请求,浏览器会使用 OPTIONS 方法发起 CORS 请求,以确定某条路由的访问控制设置。
这些请求可以使用特殊的 Access-Control-Max-Age 标头进行缓存。例如,Access-Control-Max-Age: 3600 会将 OPTIONS 响应缓存 3600 秒,这同时适用于浏览器和 EAS Hosting 缓存。这可以防止浏览器发出过多请求,并防止你的 API 路由因 CORS 请求而被过于频繁地调用。
资源缓存
对于部署返回的任何资源,浏览器缓存将默认应用 3600 秒的缓存时间。为了提升性能,按部署划分的资源会在内部被无限期缓存。由于部署是不可变的,这不会影响你。
当你将新部署分配给某个别名时,EAS Hosting 会忽略其缓存的资源。例如,当你将新部署提升到生产环境时,缓存将被忽略,你的资源响应应会立即切换到新的部署。
计费与指标
EAS Hosting 按请求计费(按 100 万请求为单位)。然而,缓存请求仍然计入你的配额,即使这些请求被 EAS Hosting 缓存,你也仍会被收费。
指标不受缓存影响。缓存请求会像其他任何请求一样被记录,EAS 仪表板中的指标也会反映并体现缓存请求。