5月27日 22:00

Prettier 的缓存机制是怎么工作的?

核心回答

Prettier 从 2.7 版本开始支持 --cache,原理是对比缓存键决定是否跳过格式化。缓存键包括:Prettier 版本、格式化选项、Node.js 版本、文件内容或元数据。只要这些值没变,直接跳过该文件,大型项目可提速 10-20 倍。

bash
# 启用缓存 prettier . --write --cache # 指定缓存位置(默认在 node_modules/.cache/prettier/) prettier . --write --cache --cache-location .prettier-cache

两种缓存策略

Prettier 提供两种策略,关键区别在于判断"文件是否变化"的方式:

  • content(默认):对文件内容做哈希,准确但稍慢。CI 环境必须用这个,因为 git clone 会重置文件时间戳
  • metadata:比较文件的修改时间和大小,更快但在时间戳被改写的场景下可能误判
bash
# CI 环境 — 用 content 更稳 prettier . --write --cache --cache-strategy content # 本地开发 — metadata 足够快 prettier . --write --cache --cache-strategy metadata

缓存什么时候会失效

以下任一变化都会导致缓存失效:

  • Prettier 版本升级
  • .prettierrc.editorconfig 配置变更
  • CLI 传入的格式化选项改变
  • 文件内容/路径变化

注意:插件版本不在缓存键中,更新插件后需手动清缓存。

实际配置建议

json
{ "scripts": { "format": "prettier . --write --cache", "check": "prettier . --check --cache" } }

CI 中缓存 .prettier-cache 目录可进一步加速,Babel monorepo 实测从 29 秒降到 1.3 秒。

bash
# 清除缓存 rm -rf node_modules/.cache/prettier

追问:缓存为什么没有生效?

常见原因有三个:一是用了 metadata 策略但 git 操作重置了时间戳,改用 content;二是更新了 Prettier 插件但没清缓存;三是运行时没带 --cache 参数,Prettier 会自动删除已有缓存文件。

标签:Prettier