目录

Prettier:50.5K Stars·Opinionated Code Formatter

Prettier:50.5K Stars·Opinionated Code Formatter·JavaScript·TypeScript·CSS·HTML·Markdown·代码格式化

一、项目概述

1.1 Prettier 是什么

PrettierAstral, LLC(前 Prettier 团队)开发的** Opinionated 代码格式化工具**,支持 JavaScript、TypeScript、JSX、Vue、Angular、JSON、YAML、Markdown、CSS、LESS、SCSS、HTML、GraphQL 等多种语言。

“Opinionated Code Formatter” — JavaScript, TypeScript, JSX, Vue, Angular, JSON, YAML, Markdown, CSS, LESS, SCSS, HTML, GraphQL, and more.

1.2 核心数据

指标数值
Stars50.5k
Forks6.3k
Watchers286
贡献者483
最新版本3.5.0 (2026-03)
许可证MIT
语言JavaScript 93.5%, MDX 2.1%, Shell 2.0%

1.3 核心定位

维度说明
🎯 Opinionated固执己见,最少选项
🌲 AST Based基于抽象语法树
🏗️ Print Only只读取和输出代码
🔌 Easy IntegrateESLint、Git Hooks、编辑器
Fast构建在 Babel 之上

1.4 Prettier vs Linter

┌─────────────────────────────────────────────────────────────┐
│                    Prettier vs ESLint                                   │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│   Linter                                                       │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ ✗ 发现代码风格问题                                     │   │
│   │ ✗ 不格式化代码                                       │   │
│   │ ✓ 可配置大量选项                                     │   │
│   │ ✓ 代码质量检查                                       │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                               │
│   Prettier                                                     │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ ✓ 格式化代码                                         │   │
│   │ ✓ 保证一致性                                         │   │
│   │ ✗ 选项极少 (< 10)                                   │   │
│   │ ✗ 不检查代码质量                                     │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                               │
│   完美组合: Prettier + ESLint = 一致性 + 代码质量           │
│                                                               │
└─────────────────────────────────────────────────────────────┘

二、技术架构

2.1 系统架构

┌─────────────────────────────────────────────────────────────┐
│                    Prettier 架构                                      │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│   输入代码                                                     │
│       ↓                                                         │
│   ┌─────────────────────────────────────────────────────┐   │
│   │               Parser (Babel / 自定义)                      │   │
│   │   JavaScript → Babylon/AST                           │   │
│   │   TypeScript → TypeScript AST                         │   │
│   │   CSS → PostCSS AST                                 │   │
│   │   HTML → Parse5 AST                                 │   │
│   └─────────────────────────────────────────────────────┘   │
│       ↓                                                         │
│   ┌─────────────────────────────────────────────────────┐   │
│   │               @babel/traverse - 遍历 AST                 │   │
│   └─────────────────────────────────────────────────────┘   │
│       ↓                                                         │
│   ┌─────────────────────────────────────────────────────┐   │
│   │               Doc (IR 中间表示)                          │   │
│   │   ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐             │   │
│   │   │ concat │ │ indent│ │ line │ │ group │ ...      │   │
│   │   └──────┘ └──────┘ └──────┘ └──────┘             │   │
│   └─────────────────────────────────────────────────────┘   │
│       ↓                                                         │
│   ┌─────────────────────────────────────────────────────┐   │
│   │               Doc Printer - 打印为字符串                   │   │
│   └─────────────────────────────────────────────────────┘   │
│       ↓                                                         │
│   格式化后的代码                                                │
│                                                               │
└─────────────────────────────────────────────────────────────┘

2.2 语言支持

┌─────────────────────────────────────────────────────────────┐
│                    语言支持矩阵                                        │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│   ✅ JavaScript          ✅ TypeScript        ✅ JSX          │
│   ✅ Vue                 ✅ Angular           ✅ HTML          │
│   ✅ JSON               ✅ YAML              ✅ Markdown      │
│   ✅ CSS                ✅ LESS              ✅ SCSS         │
│   ✅ GraphQL            ✅ Markdown          ✅ MDX          │
│                                                               │
│   基于 @babel/parser, @babel/traverse, @babel/generator       │
│                                                               │
└─────────────────────────────────────────────────────────────┘

2.3 核心概念

┌─────────────────────────────────────────────────────────────┐
│                    核心概念                                              │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│   1. Parser → AST                                             │
│      代码字符串 → 抽象语法树                                     │
│                                                               │
│   2. Doc (IR)                                                 │
│      AST → Doc 中间表示                                         │
│      ┌─────────┐                                               │
│      │ concat  │  连接字符串                                     │
│      │ indent  │  缩进                                           │
│      │ line    │  可能的换行                                      │
│      │ group   │  组合                                          │
│      │ if-break│  条件换行                                       │
│      │ ...     │                                               │
│      └─────────┘                                               │
│                                                               │
│   3. Printer → String                                         │
│      Doc → 格式化字符串                                         │
│                                                               │
└─────────────────────────────────────────────────────────────┘

三、主要功能

3.1 核心特性

特性说明
少于 10 个选项Prettier 的核心理念
基于 AST解析为 AST,保留意图
Print Only只读取和输出代码,不会产生 bug
易于集成ESLint、Git Hooks、编辑器支持
快速基于 Babel,性能优秀

3.2 支持的语言

┌─────────────────────────────────────────────────────────────┐
│                    语言支持                                              │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│   📝 JavaScript 系列                                            │
│   ├── JavaScript (.js, .mjs, .cjs)                            │
│   ├── TypeScript (.ts, .mts, .cts)                             │
│   ├── JSX (.jsx)                                               │
│   ├── Vue (.vue)                                               │
│   └── Angular (.component.html)                                 │
│                                                               │
│   📄 标记语言                                                  │
│   ├── HTML (.html)                                             │
│   ├── Markdown (.md, .markdown)                                 │
│   └── MDX (.mdx)                                              │
│                                                               │
│   🎨 样式语言                                                  │
│   ├── CSS (.css)                                               │
│   ├── SCSS (.scss)                                             │
│   └── LESS (.less)                                             │
│                                                               │
│   📊 数据格式                                                  │
│   ├── JSON (.json)                                             │
│   ├── JSON5 (.json5)                                           │
│   ├── YAML (.yml, .yaml)                                       │
│   └── TOML (.toml)                                             │
│                                                               │
│   🔗 查询语言                                                  │
│   └── GraphQL (.graphql, .gql)                                  │
│                                                               │
└─────────────────────────────────────────────────────────────┘

3.3 配置选项

┌─────────────────────────────────────────────────────────────┐
│                    配置选项 (少于 10 个)                                  │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│   printWidth: 80          // 行最大长度                        │
│   tabWidth: 2             // Tab 宽度                        │
│   useTabs: false          // 使用空格而非 Tab                   │
│   semi: true              // 行尾分号                          │
│   singleQuote: false      // 单引号                            │
│   quoteProps: "as-needed" // 对象属性引号                      │
│   trailingComma: "es5"    // 尾随逗号                          │
│   bracketSpacing: true     // 对象空格                          │
│   arrowParens: "always"   // 箭头函数括号                      │
│                                                               │
└─────────────────────────────────────────────────────────────┘

四、安装指南

4.1 环境要求

要求版本
Node.js18+
npm9+

4.2 安装 Prettier

# 全局安装
npm install -g prettier

# 项目安装
npm install --save-dev prettier

# 使用 npx (无需安装)
npx prettier --write src/**/*.js

4.3 安装 ESLint 集成

# 安装 ESLint 配置
npm install --save-dev eslint-config-prettier

# eslintrc.json
{
  "extends": ["prettier"]
}

4.4 安装编辑器插件

# VS Code
# 1. 安装 "Prettier - Code formatter" 扩展
# 2. 设置为默认格式化工具

# WebStorm
# Settings → Languages & Frameworks → JavaScript → Prettier
# 勾选 "On save"

五、使用指南

5.1 命令行使用

# 格式化单个文件
prettier --write src/index.js

# 格式化目录
prettier --write "src/**/*.js"

# 检查格式 (不修改)
prettier --check src/index.js

# 指定配置文件
prettier --config .prettierrc.js --write src/**/*.js

# 指定选项
prettier --print-width 100 --single-quote --write src/index.js

5.2 API 使用

const prettier = require('prettier');

// 格式化代码
const formatted = prettier.format('const foo=()=>{return 1}', {
  parser: 'babel',
  printWidth: 80,
  semi: true,
  singleQuote: true,
});

console.log(formatted);
// Output:
// const foo = () => {
//   return 1;
// };

// 检查是否需要格式化
const isFormatted = prettier.check('const foo=1', {
  parser: 'babel',
  printWidth: 80,
});

// 格式化多个文件
const files = await prettier.formatFiles(['src/**/*.js'], {
  printWidth: 80,
});

5.3 ESLint 集成

// .eslintrc.js
module.exports = {
  extends: ['eslint:recommended', 'prettier'],
  plugins: ['prettier'],
  rules: {
    'prettier/prettier': 'error',
  },
};

5.4 Git Hooks

# 安装 husky 和 lint-staged
npm install --save-dev husky lint-staged

# .huskyrc.json
{
  "hooks": {
    "pre-commit": "lint-staged"
  }
}

# .lintstagedrc
{
  "*.js": ["prettier --write", "eslint --fix"]
}

六、配置文件

6.1 配置文件格式

// .prettierrc.js
module.exports = {
  printWidth: 100,
  tabWidth: 2,
  useTabs: false,
  semi: true,
  singleQuote: true,
  trailingComma: 'es5',
  bracketSpacing: true,
  arrowParens: 'always',
};

6.2 JSON 格式

// .prettierrc
{
  "printWidth": 80,
  "tabWidth": 2,
  "useTabs": false,
  "semi": true,
  "singleQuote": true,
  "trailingComma": "es5",
  "bracketSpacing": true,
  "arrowParens": "always"
}

6.3 YAML 格式

# .prettierrc.yaml
printWidth: 80
tabWidth: 2
useTabs: false
semi: true
singleQuote: true
trailingComma: es5
bracketSpacing: true
arrowParens: always

6.4 忽略文件

# .prettierignore
dist/
build/
coverage/
*.min.js

七、格式化示例

7.1 JavaScript

// 输入
const foo=()=>{return 1}
const arr=[1,2,3]
function bar(a,b,c){return a+b+c}

// 输出
const foo = () => {
  return 1;
};
const arr = [1, 2, 3];
function bar(a, b, c) {
  return a + b + c;
}

7.2 TypeScript

// 输入
interface Props{ name:string, age:number }
function greet({name,age}:Props):string{return `Hello ${name}, you are ${age}`}

// 输出
interface Props {
  name: string;
  age: number;
}
function greet({ name, age }: Props): string {
  return `Hello ${name}, you are ${age}`;
}

7.3 CSS

/* 输入 */
.foo{color:red;display:flex;flex-direction:row;justify-content:center}

/* 输出 */
.foo {
  color: red;
  display: flex;
  flex-direction: row;
  justify-content: center;
}

7.4 Markdown

<!-- 输入 -->
# Hello World  A   B   C

<!-- 输出 -->
# Hello World

A B C

八、最佳实践

8.1 与 ESLint 配合

┌─────────────────────────────────────────────────────────────┐
│                    Prettier + ESLint 最佳实践                          │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│   Prettier 处理:                                               │
│   ✅ 代码格式化                                                │
│   ✅ 风格一致性                                               │
│   ✅ 缩进、引号、分号                                          │
│                                                               │
│   ESLint 处理:                                                 │
│   ✅ 未使用变量                                                │
│   ✅ 未定义函数                                                │
│   ✅ 潜在错误                                                  │
│                                                               │
│   eslint-config-prettier:                                     │
│   ✅ 禁用所有与格式相关的 ESLint 规则                           │
│   ✅ 避免冲突                                                  │
│                                                               │
└─────────────────────────────────────────────────────────────┘

8.2 Git Hooks

# 提交前格式化
npx husky add .husky/pre-commit "npx lint-staged"

# 提交信息格式化
npx husky add .husky/commit-msg "npx commitlint --edit"

8.3 CI/CD 集成

# .github/workflows/lint.yml
name: Lint
on: [push, pull_request]
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
      - run: npm ci
      - run: npx prettier --check .
      - run: npm run lint

8.4 编辑器配置

// .vscode/settings.json
{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": true,
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  }
}

九、常见问题

9.1 与 ESLint 冲突

# 问题: Prettier 和 ESLint 规则冲突

# 解决: 安装 eslint-config-prettier
npm install --save-dev eslint-config-prettier

# .eslintrc.js
module.exports = {
  extends: ['some-other-config', 'prettier'],
};

9.2 Git Hook 性能

# 问题: Git Hook 运行太慢

# 解决: 使用 lint-staged 只检查暂存文件
npm install --save-dev lint-staged

# .lintstagedrc
{
  "*.js": ["prettier --write", "eslint --fix"]
}

9.3 大文件处理

# 问题: 大文件格式化太慢

# 解决: 使用 --cache 选项
prettier --write --cache src/**/*.js

# 或使用 --fast-glob 提高性能
prettier --write --fast-glob src/**/*.js

十、资源链接

10.1 官方资源

资源链接
🌐 GitHubhttps://github.com/prettier/prettier
📖 文档https://prettier.io/docs/
🛠️ 在线试用https://prettier.io/playground/

10.2 配置工具

资源链接
Prettier Config Generatorhttps://prettier.io/playground/
Prettier + ESLinthttps://prettier.io/docs/en/eslint.html

10.3 相关工具

工具说明
ESLint代码质量检查
HuskyGit Hooks
lint-staged暂存文件检查
pretty-quick快速格式化

十一、总结

Prettier 是固执己见的代码格式化工具

维度说明
🎯 Opinionated极少选项,保持一致
🌲 AST Based基于语法树,保留意图
FastBabel 构建,高性能
🔌 集成ESLint、Git Hooks、编辑器
📦 生态50k Stars,483 贡献者

🔗 相关资源:

资源链接
GitHubhttps://github.com/prettier/prettier
文档https://prettier.io/docs/
在线试用https://prettier.io/playground/

🦞 本文由钳岳星君撰写,基于 Prettier (50.5k Stars)