团队代码格式乱到没法看,这6个工具跑完整个项目只用一行命令
去年接手一个从外包收回来的React项目,src目录下有300多个文件。打开第一个,缩进2个空格;打开第二个,4个空格;第三个直接Tab。有的用单引号,有的用双引号,有的行尾有分号,有的没有。Code Review的时候5个人盯着屏幕讨论的竟然不是逻辑,而是"这个花括号要不要换行"。那次review开了40分钟,真正跟功能相关的讨论不到10分钟。
问题不在于谁写错了,问题是人肉争论格式永远争不出结果。这件事就应该让工具干。下面这6个工具,每一个都能在命令行跑通,一个项目几百上千个文件,一行命令全搞定。
六个工具一句话定位

| Prettier | 前端格式化事实标准,生态最成熟 |
| Biome | Prettier的Rust替代品,速度快35倍,还带Lint |
| dprint | 速度之王,Prettier的10-100倍,多语言插件式 |
| clang-format | C/C++格式化首选,LLVM官方出品 |
| AStyle | C/C++/C#/Java老牌格式化,零依赖 |
| 在线工具 | 不装任何东西,粘贴就能用 |
一、Prettier,装完就不用再争论格式了
Prettier不是最快的,也不是最炫的,但它是用得最多的。前端项目里90%以上的团队格式化方案都有Prettier的影子。它的哲学是"opinionated"——不需要你纠结几个空格、花括号放哪行,Prettier直接替你决定好,你接受就行。创始人James Long在设计Prettier时的出发点很简单:代码风格的争论纯属浪费生命,与其开半小时会讨论用2个还是4个空格,不如让一个工具一刀切了,所有人都闭嘴写代码。
支持JavaScript、TypeScript、JSX、CSS、SCSS、HTML、JSON、GraphQL、Markdown、YAML等,基本覆盖前端所有文件类型。配置文件一个.prettierrc就能控制全局规则。常见的几个参数:printWidth控制每行最大字符数(默认80),tabWidth缩进宽度,singleQuote是否用单引号,semi是否加分号,trailingComma尾逗号策略。可调参数故意很少,因为Prettier的设计理念就是"少给你选择,多帮你决定"。
VS Code、WebStorm、Vim都有插件,保存时自动格式化。更关键的是和Git工作流的集成——配合Husky + lint-staged做pre-commit hook,提交代码前自动跑一遍格式化,只处理本次变更的文件,不会拖慢提交速度。如果只检查不改,用--check模式,格式不对的提交在CI里直接拦截。
Prettier 常用批量命令
# 格式化整个项目npx prettier --write .# 只格式化 src 目录下的 JS/TS 文件npx prettier --write "src/**/*.{js,ts,jsx,tsx}"# 排除 node_modules 和 distnpx prettier --write . --ignore-path .gitignore# 先检查哪些文件有问题,不实际修改npx prettier --check .# 指定配置文件npx prettier --write . --config .prettierrc.jsonPrettier的短板:慢。因为用JavaScript写的,10万行项目全量格式化约20秒,大项目CI跑一遍格式检查比较吃资源。不支持Python、Java等后端语言,跨栈团队需要另配工具。但换个角度看,正是因为JS写的,贡献门槛低,社区插件多,遇到任何奇怪的文件格式都能找到对应插件。
二、Biome,一个工具干Prettier + ESLint两个人的活
Biome用Rust写的,天生比JavaScript写的Prettier快。同一个10万行项目,Prettier格式化要20秒,ESLint全量检查要45秒,两者加起来65秒。Biome同时做格式化+Lint,只需要约1.8秒,快了35倍以上。而且一个npm包、一份配置文件搞定,不用再维护Prettier和ESLint两套配置。
10万行项目全量耗时实测对比
| Prettier(仅格式化) | 约20秒 |
| ESLint(全量Lint检查) | 约45秒 |
| Prettier + ESLint 组合 | 约65秒 |
| Biome(格式化 + Lint 同时跑) | 约1.8秒 |
这个速度差距是怎么来的?Prettier和ESLint用JavaScript跑在Node.js上,Biome用Rust编译成原生二进制。JS的JIT再快也比不过编译后的原生代码,尤其在做大量字符串解析和AST遍历时,Rust的优势被放大了几十倍。对开发者来说,最直观的感受就是:保存文件后Biome的格式化是瞬时的,Prettier偶尔会卡一下。
支持JS/TS/CSS/JSON/GraphQL/HTML,集中在Web技术栈。从Prettier+ESLint迁移时可以用biome migrate命令自动映射规则。Biome的配置也极简——一个biome.json文件,格式化规则和Lint规则都在里面。比如想用单引号、缩进2个空格、禁止console.log、强制用const替代let,全在一个文件里写完。
ESLint有300多个规则,Biome目前覆盖了约200多个。大部分日常高频规则(no-unused-vars、no-console、prefer-const等)都已经支持了,但一些冷门插件(比如eslint-plugin-import的高级路径检查)Biome还没有等价规则。团队迁移前建议先用biome check --apply跑一遍,看看哪些规则报告了"未实现",再决定要不要全切。
Biome 常用批量命令
# 格式化整个项目npx @biomejs/biome format --write .# 格式化 + Lint 一起跑(最常用)npx @biomejs/biome check --write .# 只检查不修改(适合CI环境)npx @biomejs/biome check .# 从 Prettier + ESLint 自动迁移配置npx @biomejs/biome migrate# 初始化新项目配置npx @biomejs/biome init三、dprint,比Biome还快,而且跨语言
dprint也是Rust写的,但架构和Biome不同——dprint是"平台+插件"模式,核心引擎只管调度,每个语言的格式化逻辑是独立插件。这种架构的好处是语言扩展非常灵活,想加一个新语言的支持,不需要改核心引擎,写一个插件就行。速度上比Prettier快10到100倍,10万行项目Biome要0.6秒,dprint可能在0.1到0.2秒之间,几乎无感知。
dprint 一个配置文件覆盖的语言
dprint真正出彩的是跨语言统一。一个全栈项目,前端是React+TypeScript,后端是Python FastAPI,数据库脚本是SQL,配置是YAML和TOML,CI是Dockerfile。用传统方案需要Prettier + Black + sqlfluff + dockerfilelint,四五个工具、四五份配置。dprint一个命令、一份dprint.json全部搞定,CI流水线里的格式检查步骤从5个缩减到1个。
dprint的短板也很实际:IDE集成主要靠社区插件,VS Code有第三方插件但不如Prettier的官方插件稳定;没有Lint功能,代码质量检查还得另配工具;GitHub只有3.5k stars,社区规模和生态比Prettier差了十几倍,遇到冷门问题可能翻半天找不到答案。
dprint 批量格式化
# 全局安装npm install -g dprint# 初始化配置(交互式选择需要哪些语言插件)dprint init# 格式化整个项目dprint fmt# 只检查不修改dprint check四、前端三巨头速览对比

| 对比维度 | Prettier | Biome | dprint |
|---|---|---|---|
| 语言 | JavaScript | Rust | Rust |
| 支持格式 | JS/TS/CSS/HTML/JSON/MD等 | JS/TS/CSS/JSON/GraphQL/HTML | TS/JS/Python/C#/SQL/MD/Docker等 |
| 10万行速度 | 约20秒 | 约0.6秒(35倍) | 约0.2秒(100倍) |
| Lint | 需配ESLint | 内置 | 无 |
| IDE集成 | 最全面 | VS Code / JetBrains | 社区插件 |
| GitHub Stars | 50k+ | 16k+ | 3.5k+ |
| 价格 | 免费开源 | 免费开源 | 免费开源 |
五、C/C++项目绕不开的clang-format和AStyle
前面三个工具主攻前端和全栈,C/C++团队得看这两个。clang-format是LLVM项目的一部分,C/C++格式化的行业标准。内置LLVM、Google、Chromium、Mozilla、WebKit五种预设风格,选一个最接近团队习惯的微调就行。几乎所有C++ IDE(CLion、VS Code、Visual Studio、Qt Creator)都内置或通过插件支持clang-format,配置好`.clang-format`文件往项目根目录一放,不同编辑器的同事保存时自动统一格式。
clang-format支持上百个配置项,从缩进宽度、指针符号对齐位置、花括号换行规则、include排序方式到宏定义的对齐,几乎所有细节都能调。团队里有人喜欢Linux风格、有人习惯Google风格,生成两份预设跑一遍看输出差异,少数服从多数,比口头争论高效得多。include排序功能尤其实用——把头文件按标准库、第三方库、项目内部库自动分组排序,几百个include再也不用人工整理。
AStyle(Artistic Style)1998年就发布了,比很多前端程序员年纪都大。它是一个独立可执行文件,不依赖任何运行时——Windows下下载一个exe放PATH里就能用,Linux下apt或yum直接装。支持C/C++/C#/Java,风格上支持ANSI、K&R、Linux、GNU、Java等多种预设。对老旧项目或者嵌入式开发环境(比如需要跑在MinGW或cygwin下的),AStyle的零依赖特性是clang-format比不了的。
clang-format 批量格式化命令
# Linux/Mac:递归格式化所有 C/C++ 文件find . -name "*.cpp" -o -name "*.h" | xargs clang-format -i# Windows PowerShellGet-ChildItem -Recurse -Include *.cpp,*.h | ForEach-Object { clang-format -i $_.FullName }# 生成配置文件(基于Google风格)clang-format -style=Google -dump-config > .clang-format# 只检查不修改(CI环境用)clang-format --dry-run --Werror src/*.cppAStyle 批量格式化命令
# Windows:递归格式化 src 目录下所有 .cpp 和 .hastyle --style=allman --indent=spaces=4 --recursive "src\*.cpp" "src\*.h"# Linux:格式化整个项目astyle --style=google -r "src/**/*.cpp" "src/**/*.h"# 使用参数文件(适合团队统一配置)astyle --options=project_style.txt -r "src\*.cpp"两者怎么选:新C/C++项目用clang-format,生态更好、IDE集成更深;老旧项目或C#/Java混编用AStyle,零依赖更省事;嵌入式开发(尤其Windows交叉编译环境)用AStyle,不需要装整个LLVM工具链。
| 对比 | clang-format | AStyle |
|---|---|---|
| 支持语言 | C/C++/ObjC | C/C++/C#/Java |
| 配置方式 | .clang-format 文件 | 命令行参数或文本文件 |
| IDE集成 | 几乎所有C++ IDE内置 | VS / VS Code / CLion(插件) |
| 依赖 | 需要LLVM/Clang | 零依赖,单文件 |
| 适合场景 | 新项目,需要IDE深度集成 | 老项目,嵌入式,C#/Java混编 |
六、不想装任何东西,在线工具直接粘贴
不是每个场景都需要装CLI工具。只想格式化一个JSON字符串、一段SQL查询、一段杂乱的HTML,打开网页粘贴进去点一下按钮就行。几个靠谱的在线工具:
| freecodeformat.com | 支持JSON/JS/HTML/CSS/SQL/XML/PHP/Java,语言覆盖最全,无广告 |
| kervin-selfdevelop.cn | 支持Java/C/C++/Python/SQL/XML,偏向后端语言 |
| tingyutools.com | 支持JS/HTML/CSS/XML/SQL,一键切换格式化/压缩 |
| devkittool.cn | 支持JS/HTML/CSS/Python,界面简洁速度快 |
在线工具的局限也明显:不支持批量处理,一次只能粘贴一个文件;隐私敏感的代码(密钥、内部业务逻辑)不适合往网页上贴;不支持自定义规则,格式化结果是预设的没法调。但作为应急工具或者偶尔用一下的场景,打开浏览器就能用,比装CLI快多了。
七、工具装好了,怎么让团队所有人真的用起来
工具选好了,最难的不是安装,是让团队每个人真的在用。新人忘了装插件、赶进度直接push没格式化的代码、配置版本不一致导致A机器格式化的结果和B机器不一样……这些才是实际问题,比选哪个工具难解决得多。
最有效的方案是三道防线:第一道是编辑器保存时自动格式化(VS Code settings.json里配"editor.formatOnSave": true),让开发者在写代码时就自动格式化了。第二道是pre-commit hook(Husky + lint-staged),提交前自动跑格式化,只处理本次变更的文件,不拖慢提交速度。第三道是CI/CD流水线,在PR/MR检查阶段跑--check模式,格式不对的直接打回。
三道防线配置示例(以Prettier为例)
第一道:编辑器保存自动格式化
// .vscode/settings.json{ "editor.formatOnSave": true, "editor.defaultFormatter": "esbenp.prettier-vscode" }第二道:pre-commit hook
npx husky add .husky/pre-commit "npx lint-staged"// package.json 中配置"lint-staged": { "*.{js,ts,jsx,tsx}": "prettier --write" }第三道:CI检查
# .github/workflows/format-check.yml- run: npx prettier --check .三道防线的逻辑是:第一道靠自觉,成本最低但不可靠(有人用Vim没装插件);第二道靠强制,在提交时拦截,但不能阻止跳过hook(git commit --no-verify);第三道是最后保险,CI上跑不过的PR不能合并,这是任何人都绕不过去的。
还有一个容易被忽略的细节:配置文件必须进Git。`.prettierrc`、`biome.json`、`.clang-format`这些配置文件一定要提交到仓库。见过好几次,A同事本地有个全局Prettier配置,B同事没有,两个人在不同机器上格式化同一段代码结果不一样,merge的时候凭空多了几十个文件冲突。如果团队已经在用nvm或asdf管理Node版本,可以再加一个.nvmrc锁定Prettier/Biome的版本,避免CI上的版本和本地不一致。
最后说一个实际的选择建议。纯前端团队,刚起步或者不想折腾,Prettier完全够用。项目大了、CI每次跑格式检查等几十秒受不了,换成Biome。全栈团队,JS+Python+C#混着写,dprint一个配置管所有语言最省事。C/C++新项目直接clang-format,老项目或嵌入式用AStyle。
回到开头那个300个文件的React项目,我们用Prettier跑了一行命令,12秒,所有文件缩进统一、引号统一、分号统一。下一次Code Review,40分钟里有35分钟在讨论业务逻辑。格式这种事,花10分钟配好工具,比花40分钟开会争论值太多了。说到底,格式化工具的价值不是让代码变好看——是让团队停止争论格式,把时间花在真正值钱的地方。
