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 会自动删除已有缓存文件。