vscode不原生支持自动插入末尾分号,需依赖pretterr格式化实现;常见失败原因包括未设prettier为默认格式化器、缺少配置文件、未启用formatonsave、语言模式错误或semi: true触发整行重排而非仅加;。

VSCode 本身不提供“自动插入末尾分号”的原生功能,所谓 Trailing Semicolon 实际是 Prettier 格式化输出的结果,不是实时补全,也不是语法修复。
为什么按 Ctrl+Shift+I 或保存后没加;?
常见静默失败不是代码写错了,而是 VSCode 没调用 Prettier:
- 右下角状态栏语言模式旁的格式化工具名不是
Prettier,而是Default Formatter或ESLint—— 点它手动选一次Prettier - 项目根目录没有
.prettierrc、prettier.config.js或package.json中的prettier字段,VSCode 就不会加载 Prettier 配置 -
"editor.formatOnSave": true没启用,或被工作区 settings.json 中的false覆盖 - 文件类型没被识别为 JS/TS:比如
.mjs文件需确认语言模式是JavaScript(按Ctrl+Shift+P→Change Language Mode),否则 Prettier 不生效
semi: true 是格式重写,不是“悄悄加一个分号”
Prettier 的 semi: true 会强制整行重排——包括缩进、换行、空格,不只是末尾插 ;。这意味着:
- 你写
const a = 1,保存后变成const a = 1;(没错) - 但你写
function foo(){return 1},保存后可能变成function foo() { return 1; }(括号空格、花括号换行全被改了) - 箭头函数单表达式体如
x => x + 1不会硬加;,因为语法上不需要,Prettier 尊重 ASI 规则 - 如果已有分号但位置不对(比如
let b = 2 ;中间有空格),它会清理成let b = 2;
别用 ESLint 的 semi: always 自动修复
ESLint 的 "semi": ["error", "always"] 默认不自动插入缺失分号,只报错。即使配了 eslint.autoFixOnSave,它对缺失分号的修复能力极弱,尤其在 return 后换行、对象字面量、模板字符串等场景常漏掉或误修。
真正能稳定“保存即补;”的只有 Prettier。如果你同时启用了 ESLint 和 Prettier 的格式化,VSCode 可能随机执行其中一个——建议在 settings.json 中禁用 ESLint 的格式化:
"eslint.format.enable": false
保留 ESLint 做校验,把格式化全交给 Prettier。
快捷键补;适合手写阶段,但别和 Prettier 冲突
如果你习惯边写边按 Ctrl+; 补分号并换行,可用 multi-command 插件配置:
{
"key": "ctrl+;",
"command": "runCommands",
"args": {
"commands": [
"cursorEnd",
{ "command": "editor.action.insertSnippet", "args": { "snippet": ";\n$0" } }
]
},
"when": "editorTextFocus && editorLangId == 'javascript'"
}
注意:这个操作和 Prettier 无关,也不受其配置影响;但如果之后又保存,Prettier 会重排整行,可能覆盖你刚加的空格或换行。 所以建议二选一:要么全程用 Prettier + formatOnSave,要么纯用手动快捷键,别混用。











