必须同时关闭三处:设"javascript.format.enable": false和"typescript.format.enable": false;指定"[javascript]": {"editor.defaultformatter": "esbenp.prettier-vscode"};禁用editor.codeactionsonsave中的"source.organizeimports"和"source.fixall"。

VSCode 的 JavaScript/TypeScript 内置格式化工具(typescript-language-features)会和 Prettier、ESLint 等插件冲突,导致保存时引号乱换、分号反复增删、空行被意外清除——这不是插件坏了,而是内置格式化没关干净。
为什么关了 editor.formatOnSave 还在格式化?
因为 VS Code 的 JavaScript 和 TypeScript 语言服务自带格式化能力,它不走 editor.formatOnSave 开关,而是由独立配置项控制:
-
javascript.format.enable和typescript.format.enable默认为true,即使你禁用了全局保存格式化,它们仍会在你按Shift+Alt+F或触发代码操作(如重命名、提取变量)时悄悄介入 - 这类格式化行为不会出现在
Format Document With命令列表里,所以查“哪个格式器生效”时容易漏掉 - 它还会响应
editor.codeActionsOnSave中的"source.organizeImports"或"source.fixAll",进一步搅局
怎么彻底禁用 JS/TS 内置格式化,只留 Prettier?
必须同时关闭三处,缺一不可:
- 在
settings.json中设:"javascript.format.enable": false和"typescript.format.enable": false - 确认
"editor.defaultFormatter"已指定为你想用的插件,例如:"[javascript]": {"editor.defaultFormatter": "esbenp.prettier-vscode"} - 检查
editor.codeActionsOnSave是否误启用了内置动作,比如删掉或注释掉:"source.organizeImports"、"source.fixAll"(除非你明确需要 ESLint 的--fix)
禁用后发现某些功能失效了?先别急着开回来
常见“副作用”其实是混淆了功能归属:
- 自动补全、跳转定义、类型提示 → 来自 TypeScript 语言服务器,和
.format.enable无关,关了照样工作 - 组织 import 语句(
Organize Imports)→ 是source.organizeImports动作,不是格式化;若需保留,可单独配在editor.codeActionsOnSave里,但不要和prettier同时启用 - 保存时自动插入分号或引号 → 这是 Prettier 的规则,不是内置格式化干的;如果没了,说明
prettier没正确加载或.prettierrc缺失
Python、CSS 等其他语言也适用类似逻辑
每种语言的内置格式化开关名不同,不能一概而论:
- Python:关
python.formatting.provider(设为null或删掉该行),再指定black或autopep8为editor.defaultFormatter - CSS/SCSS:关
css.format.enable、scss.format.enable - JSON:关
json.format.enable,否则 Prettier 的 JSON 规则(如 trailing comma)可能被内置格式化覆盖
真正容易被忽略的是:这些 *.format.enable 配置项藏得深,不响应 formatOnSave,也不出现在常规设置搜索结果首页——必须手动加进 settings.json 才算真正关死。











