Code Spell Checker 卡顿主因是配置不当:默认扫描范围过大,需禁用标识符检查(cSpell.checkIdentifiers: false)、限定语言(如typescript/js/markdown)、排除node_modules等路径,并设置spellCheckDelayMs为400ms。

Code Spell Checker 默认启用后,如果打开大项目或频繁输入时出现卡顿、光标延迟、CPU 占用飙升,问题大概率出在它同步扫描了不该扫的路径、语言或标识符——这不是插件本身慢,而是配置没“收口”。
为什么拼写检查会拖慢 VSCode
Code Spell Checker 在每次文件内容变化时,默认会触发一次全范围词典匹配。当它被允许检查 node_modules、.d.ts 文件、HTML 标签名,甚至变量名(checkIdentifiers: true)时,实际要处理的文本量可能暴涨数倍。更隐蔽的问题是:某些正则忽略规则(如 ignoreRegExpList)写得不严谨,导致引擎反复回溯,CPU 占用直接冲到 30%+。
实测发现,一个中型 TypeScript 项目开启默认拼写检查后,Extension Host 进程内存从 120MB 涨到 480MB,输入延迟明显可感;关掉对标识符和非目标语言的检查后,回落至 160MB 左右。
-
cSpell.checkIdentifiers设为true(默认是false,但部分旧配置或工作区覆盖可能误开)→ 会逐个分析每个变量/函数名,极易误报且无意义 -
cSpell.enabledLanguageIds包含"html"或"css"→ 插件会尝试解析整个 HTML 结构文本,包括标签名、属性值、内联样式,效率极低 - 没配
ignorePaths→ 它会监听并检查node_modules/**下成千上万个文件,哪怕只是路过 - 用了
languageFilter但正则写错(比如漏了(?i))→ 规则失效,所有文件照常检查
只检查注释和字符串,禁用标识符扫描
拼写检查的目标应是自然语言内容,不是代码符号。变量名拼错是语义/逻辑问题,不是拼写问题;强行校验只会制造噪音和性能负担。
确认你的 settings.json(用户级或工作区级)里有这行:
"cSpell.checkIdentifiers": false
更进一步,加一行强制只作用于注释与字符串上下文:
"cSpell.stringsOnly": true
这两项叠加后,let recieveData = true; 中的 recieve 不再被标记(它属于 identifier),但 // This is a recieve handler 中的 recieve 仍会被捕获并提示修正。
注意:stringsOnly: true 会同时关闭对注释的检查,所以更推荐只用 checkIdentifiers: false,它保留注释+字符串,排除标识符,是平衡准确性和性能的最佳组合。
精准限定检查的语言和路径
别让插件“猜”哪些文件该扫。明确告诉它:只扫 typescript、javascript、markdown 这几类文件里的自然语言内容,并跳过所有构建产物和依赖目录。
在 settings.json 中配置:
"cSpell.enabledLanguageIds": ["typescript", "javascript", "markdown", "json"]
同时排除干扰路径:
"cSpell.ignorePaths": ["**/node_modules/**", "**/dist/**", "**/build/**", "**/*.d.ts"]
如果你用的是项目级 cspell.json,优先级更高,也支持更细粒度的 ignorePaths 和 words 白名单,适合多语言混合项目。
慎用 languageFilter:它基于文件路径正则过滤,容易写错且调试困难;enabledLanguageIds + ignorePaths 组合更直观、更可靠。
调低检查频率,避免边打字边扫描
默认情况下,Code Spell Checker 在每次文档变更后立刻触发检查。在你快速敲代码时,这会造成高频重计算。尤其当文件较大(>1000 行)或词典较多(中英+自定义)时,延迟更明显。
把检查延迟设为 300–500ms,让它等你停顿一下再干活:
"cSpell.spellCheckDelayMs": 400
这个值不是越小越好,也不是越大越好。低于 200ms 几乎没效果;高于 800ms 会导致修改后长时间看不到波浪线,失去实时性。400ms 是多数人手感最顺的平衡点。
另外,确保没意外开启 cSpell.diagnosticLevel 为 "hint" 或 "information" —— 这会让插件生成大量低优先级诊断信息,加重语言服务器负担;保持默认 "error" 或 "warning" 即可。
真正影响性能的从来不是“有没有拼写检查”,而是“它在检查什么、在哪检查、什么时候检查”。把路径、语言、上下文、时机这四件事收住,插件就从拖累变成静默助手——你几乎感觉不到它存在,但它一直在帮你守住注释和字符串的准确性底线。



















