在使用 Express 框架搭建 Node.js 服务时,对于静态资源的缓存策略应当如何配置与实现?
考察说明
考查对 Express 静态文件服务及 HTTP 缓存机制的掌握程度。
回答思路
- 【回答框架 1】Express 通过内置的 express.static 中间件提供静态文件服务,该中间件基于 serve-static 模块,默认会为响应的文件设置 Cache-Control 头,通常为 public, max-age=0,即默认不缓存或仅缓存较短时间。
- 【回答框架 2】若要开启强缓存,可配置 express.static 的 maxAge 选项,例如 maxAge: '7d' 表示缓存 7 天,此时响应头会包含 Cache-Control: public, max-age=604800,浏览器在有效期内直接读取本地缓存,减少请求。
- 【回答框架 3】对于版本更新问题,通常采用指纹策略,在文件名中加入哈希值或版本号,配合强缓存使用,当文件更新时,由于 URL 变化,浏览器会请求新文件。同时可结合 ETag 或 Last-Modified 进行协商缓存,使用 express.static 会默认生成 ETag,并支持 If-None-Match 请求头,当协商失败时返回 304。
- 【回答框架 4】配置示例:app.use('/static', express.static('public', { maxAge: '30d', immutable: true })),immutable 指示文件不可变,适合带指纹的资源。
- 【回答框架 5】实际方案中需要根据资源类型区分缓存策略,如 HTML 文件应短缓存或协商缓存,带指纹的静态资源用长缓存,并注意设置合理的 Cache-Control、ETag、Last-Modified,以及遵循缓存层次。
- 【关键点 1】express.static 默认设置 Cache-Control: public, max-age=0,通过 maxAge 配置强缓存时长。
- 【关键点 2】带指纹的静态资源可使用 maxAge 与 immutable 实现长缓存,更新时 URL 变化避免旧缓存。
- 【关键点 3】协商缓存由 ETag 和 Last-Modified 实现,express.static 自动生成 ETag,支持 304 响应。
- 【关键点 4】实际配置需区分 HTML、CSS/JS、图片等不同类型资源,采用不同缓存策略。
- 【易错点 1】仅设置 maxAge 而不处理资源更新会导致用户拿到旧文件,需配合指纹或版本号。
- 【易错点 2】对动态生成的 HTML 使用长强缓存可能造成页面不能及时更新。
- 【易错点 3】忽略 Vary 头可能导致代理缓存对登录状态等场景的错误复用。