code spell checker 不检查变量名是设计使然,它仅基于 textmate scope 识别注释、字符串等自然语言内容,不解析 ast;变量名需用 eslint-plugin-spellcheck 配合 eslint ast 才能检测。

Code Spell Checker 插件装完不标红,基本不是插件问题,而是它根本没在当前文件里跑起来——它只检查注释、字符串、Markdown 这类自然语言内容,对 useState、recieveData 这种变量名完全静默,这是设计如此,不是 bug。
Code Spell Checker 为什么对变量名“无感”
它不解析 AST,也不懂 JavaScript 语法,只是靠 VSCode 的语法高亮(TextMate scope)识别哪些文本属于注释或字符串。一旦遇到 const recieveData = useData();,整行都被当作代码逻辑层处理,直接跳过。即使你把 cSpell.checkIdentifiers 手动设为 true,它也只是粗暴地把驼峰名当单词切分(比如 recieveData → recieve + Data),但 recieve 不在词典里,也不会报错——因为插件默认把未知标识符当专有名词忽略。
常见错误现象:
-
console.log("helo world")没标红 → 当前文件语言模式不是javascriptreact或typescript -
// handels the input静默 →cSpell.language没包含"en",或右下角没显示en图标 -
{"title": "Recieve confirmation"}不检查 →cSpell.enabledLanguageIds里没加json
怎么确认 Code Spell Checker 真正在工作
别信“已安装”,要看右下角状态栏有没有 Spell 图标或语言标识(如 en)。没有就等于没激活。
实操建议:
- 打开一个
.js文件,按Ctrl+Shift+P→ 输入Change Language Mode→ 明确选JavaScript React(不是JavaScript) - 检查设置里
cSpell.enabledLanguageIds是否包含你实际用的语言 ID:["javascript", "javascriptreact", "typescript", "typescriptreact", "json", "markdown"] - 临时在文件顶部加一行
// spell-checker: disable,保存后再删掉——如果这时突然开始标红,说明之前被全局禁用了 - 运行命令
Spell Checker: Toggle强制开关一次,有时能触发重载
中文注释总被标红?配置没对齐
Code Spell Checker 对中文没有真正拼写概念,它只是把一串中文当做一个“英文单词”去查词典。所以 用户名 被标红,不是因为它拼错了,而是词典里没这个词。
要让它“看起来有效”,必须三者同时满足:
-
cSpell.language设为["en", "zh-CN"](zh效果差,zh-CN才能更好切分简体复合词) -
cSpell.allowCompoundWords设为true(否则useStore会被拆成两个误报) - 装官方扩展
cspell-dict-chinese(第三方“Chinese Spell Checker”无效)
即便如此,它也只解决字面匹配,不判断语义:“接收”写成“接受”不会报警,因为两者都是词典里的合法词。
想拦住 useStaet 这类错误?换工具链
变量名拼写错误必须靠静态分析,不是拼写检查器的职责范围。唯一靠谱的方案是 eslint-plugin-spellcheck,它基于 ESLint 的 AST 解析,能精准扫描 Identifier 节点。
关键配置点:
- 必须启用
identifiers: true,否则变量名照旧静默 -
comments: false和strings: false要关掉,避免和 Code Spell Checker 冲突 - 大型项目开启后 ESLint 检查明显变慢,建议只在保存时运行(
eslint.run: onSave),别用onType - 中文变量名(如
用户列表)不会被识别,也不建议这么命名;插件默认词典是英文,skipWords得手动加["api", "ui", "http"]这类缩写
最常被忽略的一点:这个插件单独安装没用,必须配合 eslint 和 @typescript-eslint/parser(TS 项目)一起工作,否则规则根本不加载。











