VS Code 默认不检查拼写,需安装 Code Spell Checker 扩展;它默认检查注释、字符串和 Markdown,支持中英文及自定义词典;通过 .cspell.json 可用正则精准过滤误报,且不与 ESLint/Prettier 冲突。

VS Code 默认不检查拼写,必须手动启用扩展
VS Code 本身不内置拼写检查功能,直接打开一个 README.md 或 .py 文件时,即使单词写成 recieve 也不会标红。这不是配置问题,是功能缺失——得靠第三方扩展补上。
最稳定、维护活跃的是 Code Spell Checker(作者: Street Side Software)。安装后它默认只对注释、字符串、Markdown 文本生效,不会检查变量名或关键字(这是合理设计,否则 useState 会被当成错词)。
- 安装后无需重启,但建议关闭再重开当前工作区,避免缓存未加载字典
- 它自带英语词典,中文需额外配置:在设置中搜索
cSpell.language,填入en, zh(注意逗号后无空格) - 若项目含大量专有名词(如
NextAuth、VitePress),把它们加到工作区级的cSpell.words数组里,避免频繁右键“添加到用户词典”
如何让拼写检查覆盖 .ts 和 .js 中的字符串与注释
默认情况下,Code Spell Checker 对 TypeScript/JavaScript 的检查范围较保守,常漏掉 console.log("succes") 这类字符串里的错词。关键在语言模式绑定和语法范围控制。
- 确保
files.associations没有错误覆盖:比如不要把*.ts映射成plaintext,否则拼写检查直接失效 - 检查
cSpell.enabledLanguageIds设置,确认包含typescript、javascript、typescriptreact、javascriptreact - 若仍不检查字符串,打开命令面板(
Ctrl+Shift+P),运行Developer: Toggle Developer Tools,在 Console 里看是否有cSpell: no document selector match报错——这说明当前文件的语言 ID 不在启用列表中
误报太多?用 .cspell.json 精确控制检查边界
拼写检查容易把路径、URL、API 参数名(如 user_id)、环境变量(NODE_ENV)当错词标红。全局禁用不现实,推荐用项目级配置文件精准过滤。
在项目根目录建 .cspell.json,内容示例:
{
"version": "0.2",
"language": "en",
"words": ["vite", "zod", "prisma"],
"ignorePaths": ["dist/**", "node_modules/**", "**/*.min.js"],
"patterns": [
{"name": "env-vars", "pattern": "\\b[A-Z_]{3,}\\b"},
{"name": "urls", "pattern": "https?://[\\w./?=-]+"}
],
"ignoreRegExpList": ["env-vars", "urls"]
}
-
patterns+ignoreRegExpList是关键组合,比单纯用ignoreWords更灵活 - 正则匹配后,整行或整个匹配片段都不检查,所以
process.env.NODE_ENV里的NODE_ENV就不会被标红 - 注意
.cspell.json必须放在打开的文件夹根目录,且 VS Code 工作区需以该文件夹为根启动,否则不生效
和 ESLint / Prettier 冲突?别混用检查目标
拼写检查和代码质量工具职责不同:ESLint 管逻辑和风格(比如 if 后是否加括号),Code Spell Checker 只管自然语言文本。强行让 ESLint 去校验注释拼写,既慢又不可靠。
- 不要安装
eslint-plugin-spellcheck类插件——它依赖 Node.js 执行,检查延迟高,且无法识别上下文(比如把props当错词) - 如果用了 Prettier,确保它没格式化掉注释里的换行或缩进,否则可能破坏拼写检查的文本块识别
- 真正要警惕的是“假阳性修复”:比如自动把
auther改成author,结果变量名也跟着改了,导致author.name报undefined—— 拼写检查器从不修改代码,所有“自动修正”都来自其他插件,得关掉它们的 auto-fix on save
拼写检查最易被忽略的一点:它完全不感知 import 名称或类型定义。所以 import { useQuerty } from './hooks' 里的 Querty 永远不会被标红——那是 TypeScript 类型检查该管的事。










