ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VSCode代码格式化实战:从插件配置到团队规范的完整方案

VSCode代码格式化实战:从插件配置到团队规范的完整方案 先说一个非常真实的场景某个周五下午同事合进来一个 PRreview 页面显示 600 多行改动。点开一看一个字符逻辑都没变全是双引号被改成单引号、多余分号被删掉的痕迹。这还只是开始等我在本地把代码格式化回来下一个提交又把这些改动重新盖了一遍。那天之后我再也没有把 VSCode 代码格式化当成“按一下 ShiftAltF 就行”的小事。它背后其实是插件选型、配置策略、快捷键习惯和团队规范四件事的串联。这篇文章就围绕这套完整方案来讲内容包括我实际在项目里怎么装插件、怎么写 settings.json、怎么绑快捷键以及格式化器和 Lint 工具打架时怎么排查。适合那种刚接触 VSCode 没多久、按了格式化却不生效的人也适合已经用了一段时间但总被同事代码格式搞崩溃的开发者。如果你正想把项目里的格式统一起来可以直接把我给的配置拿去改。1. 先解决一个根本问题VSCode 的格式化任务到底由谁来干很多人以为 VSCode 天生就会格式化这说法对一半。VSCode 确实内置了一个格式化器但它只负责最基础的工作而且它对不同语言的“理解”程度差异很大。真正决定代码格式化效果的是那些注册到编辑器里的第三方格式化扩展。1.1 默认格式化器只是个“兜底选手”VSCode 内置的格式化器在 JS/TS 场景下本质是基于 TypeScript 服务实现的它能处理缩进、分号、括号这类基础排版但完全不知道你配置文件里定了多少字符换行也不知道单引号还是双引号这种代码风格偏好。我拿一个.ts文件试过里面有一行很长的对象数组内置格式化器最多帮你把缩进对齐却不会按照 printWidth 的约定把长行拆成更易读的多行结构。也就是说默认格式化器并不是“不好”而是它太“中性”。它不知道你的团队约定也不理解 Lint 规则。如果你在一个配置了 ESLint 的项目里直接依赖 VSCode 默认格式化最典型的结果是格式化完代码ESLint 依然报错一片因为在格式化和规则检查这里两套逻辑压根没有对齐。1.2 工具链的分工必须想清楚我早期踩过一个坑以为有了 VSCode 的格式化功能就可以不用装 PrettierESLint 里也写一堆quotes、semi、indent这类格式规则。结果就是修改代码时ESLint 说要单引号VSCode 格式化按自己的逻辑给你改成双引号然后保存后又触发 ESLint 报错整个项目一直在“拉锯战”里反复折腾。后来我把工具链拆成三层问题一下清爽了EditorConfig管最硬性的编码风格底线比如缩进是 2 空格还是 4 空格、换行是 LF 还是 CRLF、文件末尾是否保留换行。格式化器比如 Prettier管代码文本的排版包括引号、尾逗号、括号空格、最大换行宽度、Markdown 表格对齐等。Linter比如 ESLint管代码质量规则比如未使用变量、禁止var、限制函数复杂度。它也能做一些自动修复但那不等同于代码格式化。一句话总结排版的事交给格式化器质量的事交给 Linter两边不要混用。现在前端圈也有eslint-config-prettier这种工具专门用来关掉 ESLint 里和 Prettier 冲突的格式类规则就是为了明确这条分工线。1.3 按语言选择格式化插件不同语言的格式化方案差别很大我给自己的项目选型参考如下语言推荐扩展格式化能力JavaScript / TypeScriptPrettier ESLint 扩展Prettier 负责排版ESLint 负责质量PythonPython 扩展 Black FormatterBlack 负责格式isort 负责 import 排序JavaJava Extension Pack内置 Eclipse 格式化器也可接 Google Java FormatC / CC/C 扩展clang-formatGoGo 扩展gofmt / goimportsRustrust-analyzerrustfmtHTML / CSS / JSON / MarkdownPrettier统一由 Prettier 处理VueVolar Prettier模板脚本样式全交给 PrettierPHPPHP Intelephense基于 php-cs-fixer 的规则格式化我的原则是一个语言尽量只依赖一个主要格式化器而不是同时装两三个否则每次选择“Format Document With”时都会犹豫。与其把环境搭得花里胡哨不如把官方工具链跑顺。2. 插件安装与 settings.json 配置让格式化在保存那一刻自动发生格式化方案的第一步当然是先把对应扩展装好。这里我不打算列一个“最全插件清单”因为插件装多了只会让工具栏越来越卡真正核心的就那几个。2.1 扩展安装顺序和验证方法打开 VSCode按CtrlShiftX打开扩展面板按名称搜索安装。我建议在装完所有扩展后执行一次CtrlShiftP输入Developer: Reload Window重载窗口确保扩展真正被加载。装好之后先不要急着写代码创建一个test.js或者test.ts文件故意写成不规范的格式比如一行超过 100 个字符或者把对象写成一行。然后右键编辑器选择Format Document或者按ShiftAltF观察代码是否被 Prettier 风格格式化。如果按完没反应打开右下角的“选择语言模式”确认文件类型是 JavaScript 或 TypeScript。还有一种更直接的验证方式在编辑器里调出命令面板执行Format Document With...这时候会弹出可供选择的格式化器列表。如果我看到的只有Prettier说明扩展已经接管如果显示的还是内置格式化器那问题大概率出在默认格式化器的优先级配置上。2.2 settings.json 关键配置逐行拆解VSCode 的配置文件分为用户级和工作区级。用户级是全局生效工作区级是项目里.vscode/settings.json覆盖。我通常先改用户级再针对不同项目微调。打开配置文件的命令是CtrlShiftP输入Preferences: Open User Settings (JSON)。贴上我常用的配置骨架{ editor.formatOnSave: true, editor.defaultFormatter: esbenp.prettier-vscode, editor.formatOnPaste: false, editor.formatOnType: false, editor.codeActionsOnSave: { source.fixAll.eslint: true }, [python]: { editor.defaultFormatter: ms-python.python, editor.formatOnSave: true }, [javascript]: { editor.defaultFormatter: esbenp.prettier-vscode, editor.formatOnSave: true }, [json]: { editor.defaultFormatter: esbenp.prettier-vscode } }逐个说下我为什么这么配editor.formatOnSave保存文件时自动格式化。这是整个方案里最核心的一个开关开完之后你就不用手动按格式化快捷键了。editor.defaultFormatter全局默认格式化器指定为 Prettier。这里有一个很容易踩的坑如果全局设置成 Prettier但 Python 项目里没有给 Python 覆盖配置那保存时 VSCode 会尝试用 Prettier 格式化 Python 文件结果就是报错或格式完全不符合预期。所以我给不同语言设置了独立的defaultFormatter。editor.formatOnPaste默认关闭我也建议关掉。粘贴代码后马上按新规则格式化在多人协作时可能会把别人代码中的换行策略搞乱。editor.formatOnType边输入边格式化默认也是关闭。它会让光标跳动变得很飘特别是写 JSON 和 Markdown 时总感觉键盘还没抬起来格式就被改了。editor.codeActionsOnSave这里让 ESLint 在保存时执行自动修复。它和格式化是两回事可以同时存在。2.3 保存时格式化不生效的排查流程我收到过不少“我明明开了 formatOnSave怎么保存不动”的反馈。这类问题大概率不是 VSCode 坏了而是某些隐藏配置把优先级覆盖了。排查路径我整理成一套固定流程第一确认当前文件的Format Document With...里默认选项是什么。右键文件选择Format Document With...如果默认不是预期的 Prettier就点Configure Default Formatter重新选。第二查看工作区里有没有.vscode/settings.json。这个文件里的配置优先级高于用户级设置如果它里面有editor.formatOnSave: false那你用户级再怎么开都没用。第三打开输出面板。CtrlShiftP输入Output在下拉列表里选择Prettier或者ESLint然后手动触发一次格式化看输出日志里有没有报错。最常见的报错是 Prettier 找不到某个解析器比如格式化 TypeScript 时项目里没装typescript包。最后才考虑扩展冲突。比如同时装了多个格式化扩展且它们都声明支持 JavaScript那么 VSCode 必须依靠defaultFormatter做决定如果不写可能每次保存都会弹出“选择默认格式化器”的提示。3. 快捷键从默认的 ShiftAltF 到自定义键位的全套玩法插件和配置解决了“格式化怎么执行”的问题快捷键解决的是“我什么时候想主动触发”。大部分情况下保存时格式化已经能覆盖日常需求但总有那么几个场景必须手动来一下比方说接手一个老项目、临时改了一行代码但不想保存整个文件。3.1 VSCode 内置的格式化快捷键先梳理一下 VSCode 默认提供的格式化相关快捷键命令Windows / LinuxmacOS格式化整个文档ShiftAltFShiftOptionF格式化选中区域CtrlK CtrlFCmdK CtrlF保存文件CtrlSCmdS很多人会忽略右键菜单里的Format Document但它在只格式化单个文件、不触发保存流程时很好用。命令面板里还有两个入口Format Document With...和Format Selection With...前者可以临时切换格式化器适合切换工具链时做对比。3.2 在 keybindings.json 里自定义快捷键默认快捷键组合在有些键盘布局下并不顺手。我自己就在笔记本上把 “格式化文档”改成了CtrlAltL因为我的手指更容易够到左边的 Alt。打开快捷键设置的方式是CtrlK CtrlS点击右上角的文件图标进入keybindings.json。添加如下配置[ { key: ctrlaltl, command: editor.action.formatDocument, when: editorTextFocus !editorReadonly } ]when条件的作用是限制快捷键只在可编辑文件里生效避免在只读文件或无焦点状态下误触发。配置完成后保存快捷键立即生效不需要重启。要注意的是CtrlAltL在某些操作系统里可能被系统或者其他软件占用如果你设置完发现没反应先查一下CtrlK CtrlS界面右上角的“冲突”提醒。VSCode 会直接列出哪些命令占用了同一个组合键。3.3 绑定一个“格式化并保存”的组合键虽然开了formatOnSave之后保存就会格式化但我偶尔还是希望“无论设置如何都先格式化了再说”。在这种场景下可以绑定一个组合命令。VSCode 支持通过runCommands把多个命令串在一起较新版本{ key: ctrlalts, command: runCommands, args: { commands: [ editor.action.formatDocument, workbench.action.files.save ] } }这个组合键的实际体验就是按一下先格式化当前文档再触发保存。在不希望开启全局formatOnSave的项目里非常实用。老版本的 VSCode 不支持runCommands时也可以用宏类插件但我不太推荐为这一个功能引入额外依赖升级 VSCode 到最新稳定版即可。3.4 格式化选中区域的实战价值说实话日常开发里Format Selection格式化选中区域被很多人低估了。当团队刚从混乱格式遗留代码里迁移过来时最忌讳的操作就是ShiftAltF对整个文件格式化那会让 diff 变得巨大reviewer 根本没法看。正确做法是只选中你实际改过的那段代码然后执行Format Selection。这样格式化的影响范围被锁在改动区域内不会把别人写的代码格式也顺带改了。这也是我在老项目里最常用的操作之一虽然它快捷键比整文件多一点但 diff 干净不少。4. 保存格式化与代码检查会打架冲突、顺序和误格式化脚手架搭完了快捷键也顺手了很多人的 VSCode 旅程才刚开始因为他们会遇到插件打架。4.1 保存时格式化与 ESLint 修复谁先谁后如果你同时开启了editor.formatOnSave和editor.codeActionsOnSave需要意识到它们不是同一个动作。在我的项目里我让 Prettier 负责排版ESLint 负责那些能自动修复的质量问题。看似分工明确但保存时两个任务谁先执行在不同版本里表现并不完全一样。有一段时间我遇到过保存后 Prettier 刚把引号统一成双引号ESLint 立刻在quotes规则上报错因为规则里要求单引号。反过来也一样。最后我把调试重心从“研究执行顺序”换成了“消除职责重叠”在 ESLint 配置里引入eslint-config-prettier关掉那些和 Prettier 冲突的格式类规则代码里只保留质量规则。这样即使两个工具先后执行也不会互相推翻。如果想显式控制保存时执行的动作可以用新版 VSCode 的数组形式配置editor.codeActionsOnSave: [ source.fixAll.eslint ]但我的建议更简单格式相关的东西统一交给 PrettierESLint 不要管引号和缩进。4.2 单引号、尾逗号、缩进的“拉锯战”案例举个最常见的冲突例子。团队项目的.prettierrc里设置了singleQuote: true但 ESLint 配置沿用了一套老规则要求quotes: [error, double]。结果就是你手动格式化完保存时 ESLint 报错你用 ESLint 自动修复格式又变回双引号跟 Prettier 的预期相反。我的.prettierrc长这样{ printWidth: 100, tabWidth: 2, semi: true, singleQuote: true, trailingComma: all, arrowParens: always }配套的.eslintrc里核心规则则尽量少碰格式{ extends: [eslint:recommended, prettier], rules: { no-unused-vars: warn, no-console: warn } }关键的词是prettier这个 extends 配置它就是eslint-config-prettier负责把跟 Prettier 重叠的规则全部关掉。如果项目里没有它我建议第一时间加上。4.3 不同语言里那些容易翻车的格式坑Python用 Black 时默认行宽是 88 字符但很多人习惯 79 字符的 PEP8 标准。这个差异不能在 VSCode 设置里直接改需要给 Black 传配置参数。如果团队用 flake8建议统一 Black 的line-length和 flake8 的max-line-length。GoVSCode 里保存时默认会跑 gofmt 或者 goimports问题不大。但如果团队禁用自动导入需要在go.formatTool和go.formatOnSave之间做取舍。C/CC/C 扩展默认走 clang-format格式化规则完全取决于项目根目录有没有.clang-format文件。没有这个文件时代码一旦格式化就会出现“缩进风格听天由命”的情况。Vue历史上有段时间 Vetur 和 Prettier 同时干预.vue文件保存时 JS 部分被 Prettier 格式化模板部分却被 Vetur 的规则打回原形。现在用 Volar 配合 Prettier 后基本消停了。MarkdownPrettier 会对 Markdown 做表格对齐、文字自动换行。有些团队并不喜欢这种改动因为会导致 Markdown diff 变大。这时针对[markdown]语言单独关闭formatOnSave会舒服很多。4.4 误格式化别人的代码以及粘贴时的“惊喜”如果项目是遗留代码格式本来就乱最危险的操作就是全仓开启editor.formatOnSave。很可能你只是改了一行变量名保存后整个文件都变成新格式diff 瞬间膨胀。我处理这类项目的方式是在工作区.vscode/settings.json中关闭保存格式化只在自己想整理的文件里手动触发。同时把自动生成目录加入.prettierignore让 Prettier 根本不去碰它们。例如dist build coverage node_modules package-lock.json还有一个约定粘贴代码时VSCode 默认不会自动格式化但我见过不少人开了formatOnPaste后被“教育”过。粘贴一段外部代码瞬间变成 300 行 diff这比手动格式化更让人血压升高。所以我在协作项目里一律保持editor.formatOnPaste: false。5. 团队级统一从个人设置到仓库级配置的一整套收尾个人电脑上的 VSCode 配置再完美也没有办法保证组里每个人的编辑器行为一致。真正让代码格式化稳定的是把它沉淀到仓库里让每个克隆项目的人自动获得同一套规范。5.1 用 .editorconfig 管住基础编码底线EditorConfig 是一个被绝大多数编辑器支持的规范VSCode 侧需要安装一个叫EditorConfig for VS Code的扩展。它的好处是即使有人用 Sublime、IntelliJ 或其他编辑器打开项目只要支持 EditorConfig缩进和换行行为也能对齐。一个常见.editorconfig示例root true [*] charset utf-8 indent_style space indent_size 2 end_of_line lf insert_final_newline true trim_trailing_whitespace true [*.md] trim_trailing_whitespace false为什么这个文件很重要因为 Windows 和 macOS 的默认换行符不同。如果项目没有 EditorConfig一个成员在 Windows 上提交文件后整个文件可能从 LF 变成 CRLFGit 里全是一行行红色高亮和真正的代码修改混在一起非常痛苦。5.2 把 Prettier 的配置和忽略清单交到仓库Prettier 读取.prettierrc和.prettierignore这不需要 VSCode 参与。只要项目中存在.prettierrc任何新成员克隆后运行 Prettier结果都一致。下面是一份适合中小型前端项目的.prettierignoredist build node_modules public package-lock.json yarn.lock pnpm-lock.yaml模板、锁文件和自动生成文件都是不需要格式化的强行格式化只会让仓库抖动更频繁。5.3 项目里的 .vscode 目录和推荐扩展很多团队不知道.vscode是可以提交到 Git 仓库的。除了放编辑调试配置它还能放两个关键文件.vscode/extensions.json用来声明推荐扩展成员打开项目时 VSCode 会提示安装{ recommendations: [ esbenp.prettier-vscode, dbaeumer.vscode-eslint, EditorConfig.EditorConfig, ms-python.python ] }.vscode/settings.json用来保存项目级配置{ editor.formatOnSave: true, editor.defaultFormatter: esbenp.prettier-vscode, editor.codeActionsOnSave: { source.fixAll.eslint: true } }这种做法的最大意义是新成员第一次打开项目VSCode 会弹出“推荐安装扩展”的提示点一下全部安装保存文件时格式就已经和团队一致完全不需要看长文档。5.4 提交前的最后一道防线pre-commit 与 CI编辑器配置只是软约束真正可以拦住坏格式的是提交前钩子和 CI 检查。前端项目里我用husky lint-staged的方式只对暂存区里的文件执行格式化和 Lint 修复不做全局扫描{ husky: { hooks: { pre-commit: lint-staged } }, lint-staged: { *.{js,jsx,ts,tsx,json,css,md}: [ prettier --write, eslint --fix ] } }新版 husky 通常通过npx husky-init初始化然后编辑.husky/pre-commit文件原理一样的。对于 Python 项目用 pre-commit 框架配 Black 更常见repos: - repo: https://github.com/psf/black rev: 23.3.0 hooks: - id: blackCI 里也可以加上npx prettier --check .这一步不修改代码只检查保证不管谁合代码只要格式跑偏就会在流水线里被拦住。个人体验上这套配置跑过几个团队项目后最明显的感受是 code review 的注意力回来了。以前看 PR 时一半时间在处理引号、缩进、换行这些琐碎噪声现在打开 diff 基本都是业务逻辑变化。如果你还在被 VSCode 格式化不生效、格式化和 Lint 冲突、团队代码风格不统一这些问题困扰照着上面的链路一步步落实大概率能把这块的维护成本压到很低。最后再提一个容易被忽略的小技巧把.prettierrc和.editorconfig的修改当成代码一样 review格式规范的变更同样需要团队共识不然今天一个人改行宽明天一个项目换风格格式化方案自己先乱了。
返回列表