prettier 不支持仅格式化修改行,因 vs code 编辑器不向其传递 diff 信息,且 prettier-vscode 插件始终全文件处理;formatonsavemode: modificationsifavailable 几乎无效,推荐用 husky + lint-staged 提交前增量格式化。

Prettier 本身不支持“仅格式化修改行”——这是 VS Code 编辑器层面的行为限制,不是插件能绕开的逻辑。所谓“只格式化改动部分”,实际依赖的是编辑器是否向格式化工具传递了 diff 信息,而 Prettier CLI 和绝大多数语言服务(包括 esbenp.prettier-vscode)都不接收或处理这类增量输入。
为什么 formatOnSaveMode: modificationsIfAvailable 不起作用
VS Code 确实提供了 editor.formatOnSaveMode 配置项,设为 "modificationsIfAvailable" 后,理论上会尝试只格式化被修改的行。但实际生效需同时满足:
- 当前语言服务(如 TypeScript Server、Vue Language Features)必须主动提供修改范围(
TextDocumentContentChangeEvent),而多数服务只在重载/全量解析时上报,不保证每次保存都传 diff -
prettier-vscode插件未实现基于 AST 的局部重写逻辑,它始终调用prettier.format()全文件处理 - Git staged changes 场景下该模式完全无效;即使开启,也常 fallback 到全文件格式化
替代方案:用 Git hooks + prettier --write --ignore-unknown 增量执行
真要控制范围,得跳出编辑器,改用命令行驱动:
- 在
.husky/pre-commit中加:npx prettier --write --ignore-unknown $(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|vue|json|md)$') - 配合
lint-staged更稳妥:"*.js": ["prettier --write"],它会自动过滤出暂存区变更文件 - 注意:这不会影响 Ctrl+S 行为,但能确保提交前只动改动文件,避免污染历史代码风格
编辑器里最接近“局部效果”的折中做法
无法真正只改几行,但可减少干扰:
- 手动选中要格式化的代码块,按
Shift+Alt+F(Windows/Linux)或Shift+Option+F(macOS),Prettier 会仅处理选区 - 关闭
editor.formatOnSave,改用快捷键触发,避免旧文件被意外重排 - 若项目用 ESLint,禁用
eslint.autoFixOnSave,防止它和 Prettier 在同一保存动作中反复覆盖
真正的“局部格式化”需要语言服务深度集成(如 Rust 的 rust-analyzer 支持),目前 JavaScript/TypeScript 生态里没有稳定落地的方案。别在 settings.json 里反复折腾 formatOnSaveMode,它对 Prettier 几乎无效——优先接受全文件格式化,或转向提交前的自动化控制。











