vscode文件差异对比卡顿主因是gitlens、eslint或prettier后台抢资源:gitlens默认全量扫描历史导致diff面板卡死,需禁用gitlens.advanced.caching.enabled;eslint误在diff视图触发ontype检查,应设eslint.run为onsave;prettier对大文件同步格式化会阻塞主线程,须关闭prettier.documentformattingprovider并限制作用范围。

VSCode 文件差异对比(Diff)卡顿,90% 是 GitLens、ESLint 或 Prettier 在后台抢资源,不是 Git 本身慢。
GitLens 默认全量扫描历史导致 diff 面板卡死
当你右键某个文件 → “Git: Compare with Previous Revision”,或点击 Source Control 面板里的修改文件进入 diff 视图时,如果界面卡住几秒甚至无响应,GitLens 很可能正在后台加载整个仓库的提交历史、符号引用和缓存数据。
-
gitlens.advanced.caching.enabled默认为true,会预加载大量元数据,尤其在大项目中极易拖垮 diff 响应 -
gitlens.codeLens.enabled和gitlens.hovers.enabled虽不直接参与 diff,但会持续监听文件变更,与 diff 触发逻辑竞争主线程 - 禁用方式:在项目根目录
.vscode/settings.json中添加:"gitlens.advanced.caching.enabled": false,<br>"gitlens.codeLens.enabled": false
,然后必须关闭并重新打开工作区(仅 Reload Window 不生效)
ESLint 在 diff 窗口里偷偷运行 onType 检查
VSCode 的 diff 编辑器(git:/ 协议打开的只读视图)本不该触发代码检查,但部分版本的 dbaeumer.vscode-eslint 会错误地将 diff 视图识别为可编辑文档,进而启动实时 lint。
- 现象:diff 窗口刚打开就出现“ESLint is running…”提示,CPU 升高,滚动变卡
- 根本原因:
eslint.run设为onType时,插件未正确过滤非工作区协议(如git:,diff:) - 修复配置:
"eslint.run": "onSave",<br>"eslint.validate": ["javascript", "typescript"]
,避免在 diff、merge 等只读上下文中激活 - 额外加固:加一行
"eslint.options": { "extensions": [".js", ".ts"] },防止它误扫 .md 或配置文件
Prettier 对二进制/大文件做同步格式化引发主线程阻塞
你点开一个 .png、.zip 或打包后的 bundle.js 查看 diff,VSCode 会用内置二进制 diff 渲染器;但如果 esbenp.prettier-vscode 被错误触发,它会尝试读取整个文件内容并同步解析——这在 >5MB 的文件上必然卡 UI。
- 常见诱因:
prettier.requireConfig为false,且prettier.documentFormattingProvider保持启用,导致插件对任意文件类型都注册格式化入口 - 安全做法:显式限制作用范围,例如
"prettier.documentFormattingProvider": false,<br>"prettier.enable": true,<br>"prettier.autoFormatOnSave": false
,再配合editor.defaultFormatter按语言设置 - 关键排除项:在
files.associations中把易混淆类型剔除,比如"files.associations": { "*.min.js": "plaintext", "*.log": "plaintext" }
diff 视图卡顿还可能是 language server 强制加载
某些语言服务器(如 rust-analyzer、volar)会在 diff 窗口打开时尝试初始化完整 AST,哪怕只是看一眼改动。这不是 bug,而是它们把 git: URI 当作了普通文件路径。
- 验证方法:打开开发者工具(
Help → Toggle Developer Tools),切到 Console,搜索Failed to resolve或Cannot open resource,常伴随file:///或git:/错误路径 - 缓解方案:在
settings.json中禁用对应语言服务的自动激活,例如"rust-analyzer.checkOnSave.command": "check",<br>"volar.trace.server": "off"
- 更彻底的做法:用
code --disable-extensions启动,确认 diff 是否流畅;若恢复,则说明是某语言插件在 diff 场景下行为失控
真正难排查的不是哪个插件报错,而是它在 diff 这种只读、临时、非工作区上下文中仍保持活跃状态——这类问题不会抛异常,只会让滚动延迟、高亮滞后、按钮点击无反馈。务必结合 Developer: Show Running Extensions 看 CPU 波动,再对照 code --status 输出确认具体插件的激活路径。











