vscode保存后未自动格式化,根本原因是prettier未绑定至javascript语言:需在.vscode/settings.json中配置"[javascript]": {"editor.formatonsave": true, "editor.defaultformatter": "esbenp.prettier-vscode"},并确保项目已安装prettier包且配置文件语法正确。

VSCode保存后没自动格式化,先确认Prettier是否绑定到JavaScript语言
VSCode默认用内置的vscode.typescript-language-features处理.js文件,装了esbenp.prettier-vscode插件也不会自动接管。右下角状态栏点语言模式,如果显示“JavaScript”但旁边不是Prettier,说明没绑上。
必须在.vscode/settings.json里写明语言专属配置:
{
"[javascript]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
-
editor.defaultFormatter值必须是"esbenp.prettier-vscode",写成"prettier-vscode"或"prettier"都无效 -
editor.formatOnSave不能只放在全局设置里,它只对语言块生效 - 项目根目录必须已安装
prettier(npm install --save-dev prettier),否则插件会静默失败,控制台报Failed to load module 'prettier'
ESLint和Prettier共存时,修复顺序错乱的根本原因
保存时缩进变了但分号没加、或var没转成const,大概率是两者在抢同一触发点:editor.formatOnSave让Prettier无脑重排,覆盖了ESLint的语义修复。
正确分工是:ESLint负责规则检查+可修复逻辑(如变量声明、解构、空格等),Prettier只做纯格式(引号、换行、括号位置)。
- 关闭
editor.formatOnSave(在[javascript]块里删掉或设为false) - 启用
editor.codeActionsOnSave:{"source.fixAll.eslint": true }——这是ESLint自动修复的唯一有效开关(eslint.autoFixOnSave已废弃) - 开启
eslint.format.enable:true,让ESLint在有可修复规则时接管格式化请求 - 在
.eslintrc.cjs中集成Prettier:"extends": ["eslint:recommended", "plugin:prettier/recommended"],并确保已安装eslint-plugin-prettier和eslint-config-prettier
Node.js项目特有的配置陷阱:.prettierrc和.eslintrc.cjs的模块系统不匹配
Node.js项目若设了"type": "module"(即用ESM),而你写了.prettierrc.cjs却用export default,或写了.eslintrc.cjs却用import语法,ESLint/Prettier会直接加载失败,且不报错、不提示。
- CommonJS项目(
"type": "commonjs"或未声明):用.prettierrc.cjs+module.exports = {...};.eslintrc.cjs同理 - ESM项目(
"type": "module"):用.prettierrc.js+export default {...};eslint.config.js(ESLint v9+推荐)也必须用export default [...] -
.prettierignore至少包含node_modules/和dist/,否则保存时格式化整个node_modules会导致VSCode卡死
多根工作区下ESLint不生效,不是插件问题而是路径没对齐
打开一个含多个子项目的VSCode工作区(multi-root workspace),改完packages/utils/index.js,ESLint警告不出现——因为VS Code的ESLint插件默认只监听“当前打开文件所在文件夹”,不会跨子文件夹找.eslintrc.cjs。
- 每个子包(如
packages/cli、packages/core)必须各自有独立的.eslintrc.cjs或eslint.config.js - 不能只在根目录放一份配置,然后指望所有子包继承——ESLint不支持跨文件夹继承
- 如果子包没配
.eslintrc.cjs,插件会静默 fallback 到默认规则,既不报错也不提示缺失 - 运行
npx eslint packages/utils/index.js验证是否能跑通,比看VSCode界面更可靠
真正麻烦的从来不是装几个插件,而是每一步执行主体是否明确:VSCode只是调度器,node_modules/.bin/eslint和node_modules/.bin/prettier才是干活的人。只要路径、模块系统、语言绑定、配置作用域这四点有一处没对齐,整条链就断了。











