DevToolBox免费
博客

Prettier 完全指南:统一代码格式化的最佳实践

20 min read作者 DevToolBox Team

Prettier 是 JavaScript、TypeScript、HTML、CSS、JSON、Markdown 等语言中使用最广泛的固执己见的代码格式化工具。它通过解析代码并按自己的规则重新输出来强制一致的代码风格,消除了代码审查中关于格式的争论。Prettier 每周 npm 下载量超过 5000 万次,已成为现代开发工具链的重要组成部分。本指南涵盖从基本设置和配置到 ESLint 集成、编辑器插件、预提交钩子、CI/CD 强制执行、自定义插件等高级主题。

TL;DR

Prettier 是一个支持 20 多种语言的固执己见的代码格式化工具。通过 .prettierrc 配置 printWidth、tabWidth、singleQuote 和 trailingComma 等选项。使用 eslint-config-prettier 与 ESLint 集成,使用 lint-staged 和 husky 设置预提交钩子,并在 CI/CD 中强制格式化。Prettier 故意限制配置选项以结束风格争论。

Key Takeaways
  • Prettier 通过将代码解析为 AST 并重新输出来格式化代码,无论原始格式如何,都能保证一致的输出。
  • .prettierrc 文件支持 JSON、YAML、TOML、JS 和 TS 格式,提供 printWidth(80)、tabWidth(2)、singleQuote 和 trailingComma 等选项。
  • 使用 eslint-config-prettier 禁用与 Prettier 冲突的 ESLint 格式化规则,让 ESLint 只处理代码质量。
  • 使用 husky 和 lint-staged 的预提交钩子确保每次提交在进入仓库前都已格式化。
  • CI/CD 管道应运行 prettier --check 来捕获未格式化的代码,而不修改文件。
  • Prettier 插件扩展了语言支持,包括 Tailwind CSS 类排序、SQL、PHP、Java、XML、TOML 等。

什么是 Prettier,为什么要使用它?

Prettier 是一个固执己见的代码格式化工具,它移除所有原始样式并确保所有输出代码符合一致的风格。与报告问题让你修复的 Linter 不同,Prettier 接收你的代码,将其解析为抽象语法树(AST),然后根据其格式化规则从头重新输出。

Prettier 的关键洞察是:争论代码格式是浪费时间。通过采用配置选项最少的固执己见的格式化工具,团队消除了代码审查中的风格争论,将精力集中在逻辑、架构和设计决策上。

Prettier 不同于传统格式化工具,因为它在做格式化决策时考虑整个程序结构。它理解行长度预算,会将长行拆分为多行,同时尊重语言特定的语法规则。

安装和设置 Prettier

Prettier 可以作为项目依赖安装或全局使用。推荐做法是在每个项目中作为 devDependency 安装,以确保所有团队成员使用相同版本。

# Install Prettier as a dev dependency
npm install --save-dev prettier

# Or with yarn
yarn add --dev prettier

# Or with pnpm
pnpm add --save-dev prettier

# Or with bun
bun add --dev prettier

安装后,你可以从命令行运行 Prettier。最常用的命令是就地格式化文件、检查文件是否已格式化,以及格式化特定文件类型。

# Format all files in the current directory
npx prettier --write .

# Check if files are formatted (no changes made)
npx prettier --check .

# Format specific file types
npx prettier --write "src/**/*.{ts,tsx,js,jsx}"
npx prettier --write "**/*.{css,scss,less}"
npx prettier --write "**/*.{json,md,yaml,yml}"

# Format a single file
npx prettier --write src/app.tsx

# Output formatted code to stdout (no file changes)
npx prettier src/app.tsx

使用 .prettierrc 配置

Prettier 设计为以最少的配置工作。不过它提供了一组可自定义的选项来匹配团队偏好。配置可以在多种文件格式中指定:.prettierrc(JSON 或 YAML)、.prettierrc.json、.prettierrc.yml、.prettierrc.toml、.prettierrc.js 或 package.json 中的 prettier 键。

以下是最常用的 Prettier 选项及其默认值。大多数团队只需要更改其中 3 到 5 个选项。

// .prettierrc (JSON format - most common)
{
  "printWidth": 100,
  "tabWidth": 2,
  "useTabs": false,
  "semi": true,
  "singleQuote": true,
  "trailingComma": "all",
  "bracketSpacing": true,
  "arrowParens": "always",
  "endOfLine": "lf"
}
# .prettierrc (YAML format)
printWidth: 100
tabWidth: 2
useTabs: false
semi: true
singleQuote: true
trailingComma: all
bracketSpacing: true
arrowParens: always
endOfLine: lf
// prettier.config.mjs (ES module format)
/** @type {import("prettier").Config} */
const config = {
  printWidth: 100,
  tabWidth: 2,
  singleQuote: true,
  trailingComma: "all",
  arrowParens: "always",
  plugins: ["prettier-plugin-tailwindcss"],
};

export default config;

完整选项参考

选项默认值描述
printWidth80打印器尝试换行的行长度。不是硬限制。
tabWidth2每个缩进级别的空格数。
useTabsfalse使用制表符而非空格缩进。
semitrue在语句末尾添加分号。
singleQuotefalse使用单引号代替双引号。
trailingComma"all"在 ES5+ 有效的地方添加尾逗号。
bracketSpacingtrue对象字面量括号之间的空格:{ foo: bar }。
arrowParens"always"箭头函数单个参数的括号:(x) => x。
endOfLine"lf"行尾风格:lf、crlf、cr 或 auto。
jsxSingleQuotefalse在 JSX 属性中使用单引号。
bracketSameLinefalse将多行 JSX 元素的 > 放在最后一行。
proseWrap"preserve"如何换行 Markdown 文本:always、never 或 preserve。

使用 .prettierignore 忽略文件

.prettierignore 文件与 .gitignore 工作方式完全相同。它告诉 Prettier 跳过哪些文件和目录。默认情况下,Prettier 忽略 node_modules 中的文件。你还应该忽略构建输出、生成的文件和其他工具管理的文件。

# .prettierignore

# Build output
dist/
build/
.next/
out/

# Dependencies
node_modules/

# Lock files
package-lock.json
yarn.lock
pnpm-lock.yaml

# Generated files
*.min.js
*.min.css
*.generated.*
coverage/

# Environment files
.env
.env.*

# Public assets
public/
static/

你也可以使用特殊注释忽略文件内的特定行或块。这对于必须保持特定格式的代码很有用。

// prettier-ignore - ignores the next node
const matrix = [
  // prettier-ignore
  [1, 0, 0,
   0, 1, 0,
   0, 0, 1],
];

/* In HTML: */
<!-- prettier-ignore -->
<div   class="custom-alignment"   data-value="keep"  >
  Content here
</div>

/* In CSS: */
/* prettier-ignore */
.my-class    { color:   red; }

/* In Markdown: */
<!-- prettier-ignore-start -->
| Column 1    | Column 2    | Column 3    |
| ----------- | ----------- | ----------- |
| Aligned     | Content     | Here        |
<!-- prettier-ignore-end -->

与 ESLint 集成

Prettier 和 ESLint 服务于不同目的。ESLint 捕获代码质量问题,而 Prettier 处理格式化。挑战在于 ESLint 也有格式化规则可能与 Prettier 冲突。解决方案是 eslint-config-prettier,它禁用所有与 Prettier 冲突的 ESLint 规则。

2026 年推荐的设置使用 ESLint 扁平配置配合 eslint-config-prettier,确保 ESLint 处理代码质量而 Prettier 处理格式化。

# Install eslint-config-prettier
npm install --save-dev eslint-config-prettier
// eslint.config.js - ESLint + Prettier (flat config)
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import prettierConfig from "eslint-config-prettier";

export default [
  js.configs.recommended,
  ...tseslint.configs.recommended,

  // Custom code quality rules
  {
    rules: {
      "no-unused-vars": "warn",
      "prefer-const": "error",
      "no-console": ["error", { allow: ["warn", "error"] }],
    },
  },

  // MUST be last: disables formatting rules that conflict with Prettier
  prettierConfig,
];

以前有些团队使用 eslint-plugin-prettier 将 Prettier 作为 ESLint 规则运行。现在不推荐这种方式,因为它更慢且产生嘈杂的输出。推荐将 ESLint 和 Prettier 作为独立工具运行。

// package.json - Run ESLint and Prettier as separate scripts
{
  "scripts": {
    "lint": "eslint src/",
    "lint:fix": "eslint --fix src/",
    "format": "prettier --write .",
    "format:check": "prettier --check .",
    "check": "npm run lint && npm run format:check"
  }
}

编辑器集成

Prettier 与所有主流代码编辑器集成。保存时格式化是最高效的工作流程:每次保存文件时,Prettier 自动格式化它。

VS Code

Prettier VS Code 扩展拥有超过 4000 万次安装。从 VS Code 扩展市场安装并配置保存时格式化。

// .vscode/settings.json
{
  // Set Prettier as the default formatter
  "editor.defaultFormatter": "esbenp.prettier-vscode",

  // Format on save
  "editor.formatOnSave": true,

  // Per-language formatter overrides
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[css]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[markdown]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  }
}

JetBrains IDE(WebStorm、IntelliJ)

JetBrains IDE 内置 Prettier 支持。在设置 > 语言和框架 > JavaScript > Prettier 中启用,勾选保存时和重新格式化时复选框。

// JetBrains Prettier settings path:
// Settings > Languages & Frameworks > JavaScript > Prettier
//
// Configuration:
// - Prettier package: ~/project/node_modules/prettier
// - Run for files: **/*.{js,ts,jsx,tsx,css,scss,json,md,yaml,yml,html}
// - [x] On Save
// - [x] On Reformat Code (Ctrl+Alt+L / Cmd+Opt+L)

Vim / Neovim

使用 neoformat 插件或内置 formatprg 选项来集成 Prettier。

-- Neovim with conform.nvim (recommended)
-- ~/.config/nvim/lua/plugins/formatting.lua
return {
  "stevearc/conform.nvim",
  opts = {
    formatters_by_ft = {
      javascript = { "prettier" },
      typescript = { "prettier" },
      typescriptreact = { "prettier" },
      css = { "prettier" },
      html = { "prettier" },
      json = { "prettier" },
      yaml = { "prettier" },
      markdown = { "prettier" },
    },
    format_on_save = {
      timeout_ms = 3000,
      lsp_fallback = true,
    },
  },
}

使用 Husky 和 lint-staged 的预提交钩子

编辑器集成在开发过程中捕获大多数格式问题,但预提交钩子提供安全网。它们确保仓库中的每次提交都正确格式化。标准方式使用 husky 处理 Git 钩子,lint-staged 仅在暂存文件上运行 Prettier。

# Step 1: Install husky and lint-staged
npm install --save-dev husky lint-staged

# Step 2: Initialize husky
npx husky init

# Step 3: Update the pre-commit hook
echo "npx lint-staged" > .husky/pre-commit
// package.json - lint-staged configuration
{
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "prettier --write",
      "eslint --fix"
    ],
    "*.{css,scss,less}": [
      "prettier --write"
    ],
    "*.{json,md,yaml,yml,html}": [
      "prettier --write"
    ]
  }
}

此设置在每个匹配模式的暂存文件上运行 Prettier。如果 Prettier 更改了文件,lint-staged 自动将更改添加到提交中。

CI/CD 管道集成

虽然预提交钩子在本地捕获大多数格式问题,CI/CD 提供最终的强制层。prettier --check 命令验证所有文件是否已格式化,而不修改它们。

# .github/workflows/format-check.yml
name: Format Check

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  format:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm

      - run: npm ci

      - name: Check formatting
        run: npx prettier --check .

      - name: Run ESLint
        run: npx eslint src/

在 CI 中运行 Prettier 确保即使开发者跳过预提交钩子(使用 git commit --no-verify),格式化要求仍在代码合并前强制执行。

# GitLab CI - .gitlab-ci.yml
format-check:
  stage: test
  image: node:22
  cache:
    paths:
      - node_modules/
  script:
    - npm ci
    - npx prettier --check .
    - npx eslint src/

Prettier 插件

Prettier 的插件系统扩展了语言支持和功能。插件可以添加新语言、修改现有格式化行为或添加全新功能。最受欢迎的社区插件包括 Tailwind CSS 类排序、SQL 格式化和 PHP 格式化。

# Install popular Prettier plugins

# Tailwind CSS - sorts Tailwind classes automatically
npm install --save-dev prettier-plugin-tailwindcss

# Sort imports
npm install --save-dev @trivago/prettier-plugin-sort-imports

# PHP formatting
npm install --save-dev @prettier/plugin-php

# XML formatting
npm install --save-dev @prettier/plugin-xml

# SQL formatting
npm install --save-dev prettier-plugin-sql

插件作为 npm 包安装,在 .prettierrc 文件中使用 plugins 数组配置。

// .prettierrc - with plugins configured
{
  "printWidth": 100,
  "singleQuote": true,
  "trailingComma": "all",
  "plugins": [
    "prettier-plugin-tailwindcss",
    "@trivago/prettier-plugin-sort-imports"
  ],
  "importOrder": [
    "^react",
    "^next",
    "<THIRD_PARTY_MODULES>",
    "^@/(.*)$",
    "^[./]"
  ],
  "importOrderSeparation": true,
  "importOrderSortSpecifiers": true
}

固执己见的格式化哲学

Prettier 故意提供极少的配置选项。这不是限制,而是核心设计决策。Prettier 团队观察到更多选项导致更多争论、更多不一致,以及更多时间花在配置而非编写代码上。

当团队采用 Prettier 时,他们同意接受其决策。初始适应期很短:大多数开发者几天后就不再注意格式化。好处是永久的:不再讨论制表符还是空格、括号放在哪里。

  • 更少的选项意味着更少的配置时间和更多的编码时间。
  • 项目中所有文件的一致格式化,无论谁编写。
  • 代码审查中没有格式讨论,可以专注于逻辑和架构。
  • 新团队成员可以立即开始编码,无需学习风格指南。
  • 多个项目使用相同的最小 Prettier 配置时的跨项目一致性。

按文件和按语言覆盖

Prettier 允许使用 .prettierrc 中的 overrides 字段为特定文件或文件类型应用不同的配置选项。这在项目不同部分需要不同格式化规则时很有用。

// .prettierrc - with per-file overrides
{
  "printWidth": 80,
  "singleQuote": true,
  "trailingComma": "all",
  "overrides": [
    {
      "files": "*.html",
      "options": {
        "printWidth": 120
      }
    },
    {
      "files": "*.md",
      "options": {
        "proseWrap": "always",
        "printWidth": 80
      }
    },
    {
      "files": ["*.json", "*.jsonc"],
      "options": {
        "tabWidth": 4
      }
    },
    {
      "files": "*.css",
      "options": {
        "singleQuote": false
      }
    }
  ]
}

Prettier 与其他格式化工具对比

了解 Prettier 与其他格式化工具的对比有助于为项目选择合适的工具。

功能PrettierBiomedprint
速度快(JavaScript)非常快(Rust)非常快(Rust)
语言支持20+(含插件)JS/TS/JSON/CSSJS/TS/JSON/Markdown
插件生态丰富较少
配置最少(固执己见)更多选项更多选项
编辑器支持优秀良好良好
采用度行业标准快速增长小众

Prettier 在 2026 年仍是行业标准,因为其广泛的语言支持、插件生态和通用编辑器集成。Biome 对于只需 JS/TS 格式化且追求速度的团队是一个强有力的替代方案。

将项目迁移到 Prettier

在现有项目中采用 Prettier 需要一次性格式化提交,会涉及很多文件。推荐方式是在一次提交中格式化整个代码库,然后配置预提交钩子和 CI/CD。

# Step 1: Install Prettier
npm install --save-dev prettier

# Step 2: Create minimal config
echo '{ "singleQuote": true, "trailingComma": "all" }' > .prettierrc

# Step 3: Create .prettierignore
echo "dist/\nbuild/\nnode_modules/\npackage-lock.json" > .prettierignore

# Step 4: Format entire codebase
npx prettier --write .

# Step 5: Commit the formatting change
git add -A
git commit -m "style: format codebase with Prettier"

为了减少迁移提交对 git blame 的影响,使用 .git-blame-ignore-revs 文件配置 git 忽略格式化提交。

# .git-blame-ignore-revs
# Prettier initial formatting
abc123def456789...

# Tell git to use this file
git config blame.ignoreRevsFile .git-blame-ignore-revs

# GitHub automatically reads .git-blame-ignore-revs
# so the formatting commit is hidden in blame views

最佳实践

遵循以下建议从 Prettier 中获得最大价值。

  • 在每个项目中将 Prettier 作为 devDependency 安装,而非依赖全局安装。
  • 保持 .prettierrc 最小化。自定义的选项越少,越接近社区标准。
  • 在编辑器中使用保存时格式化,这是 Prettier 提供的最具影响力的工作流改进。
  • 使用 husky 和 lint-staged 设置预提交钩子作为安全网。
  • 在 CI/CD 管道中添加 prettier --check 作为最终的格式化强制层。
  • 使用 .prettierignore 跳过生成的文件、构建输出和第三方代码。
  • 迁移现有项目时,在一次提交中格式化所有内容并添加到 .git-blame-ignore-revs。
  • 将 Prettier 和 ESLint 作为独立工具运行,不要使用 eslint-plugin-prettier。
  • 在 package.json 中固定 Prettier 版本以避免意外的格式变更。
  • 使用 .prettierrc 中的 overrides 字段为需要不同格式规则的文件配置,而不是完全禁用 Prettier。

常见问题

什么是 Prettier,它做什么?

Prettier 是一个支持 JavaScript、TypeScript、CSS、HTML、JSON、Markdown 等语言的固执己见的代码格式化工具。它将代码解析为 AST 并以一致的格式重新输出,消除代码审查中的风格争论。

如何配置 Prettier?

在项目根目录创建 .prettierrc 文件。常用选项包括 printWidth(默认 80)、tabWidth(默认 2)、singleQuote(默认 false)、semi(默认 true)和 trailingComma(默认 "all")。

如何将 Prettier 与 ESLint 一起使用?

安装 eslint-config-prettier 并将其添加到 ESLint 配置的最后,以禁用所有冲突的格式规则。将 ESLint 和 Prettier 作为独立工具运行。

如何设置 Prettier 预提交钩子?

安装 husky 和 lint-staged。运行 npx husky init 创建 .husky 目录。添加运行 npx lint-staged 的预提交钩子。在 package.json 中配置 lint-staged。

如何在 CI/CD 中运行 Prettier?

在管道中添加 npx prettier --check . 命令。--check 标志验证格式而不修改文件,如果有文件未格式化则以非零退出码退出。

应该用 Prettier 忽略哪些文件?

创建 .prettierignore 文件,包含构建输出、依赖、生成文件、锁文件和第三方代码的模式。

Prettier 和 Biome 有什么区别?

Prettier 是基于 JavaScript 的格式化工具,支持 20+ 语言,是行业标准。Biome 是基于 Rust 的工具链,更快但支持的语言更少。

如何只格式化更改的文件?

使用 lint-staged 配合预提交钩子仅格式化暂存文件。手动格式化时可将 git diff 输出传递给 Prettier。

𝕏 Twitterin LinkedIn
这篇文章有帮助吗?

保持更新

获取每周开发技巧和新工具通知。

无垃圾邮件,随时退订。

试试这些相关工具

{ }JSON FormatterH↓HTML Minifier Online

相关文章

ESLint 9 完全指南:Flat Config、TypeScript 和现代 Linting (2026)

完整的 ESLint 指南,涵盖 Flat Config、规则、TypeScript-ESLint、React/Vue 插件、自定义规则、共享配置、IDE 集成、自动修复和从 .eslintrc 迁移。

Vitest 完全指南:现代 JavaScript/TypeScript 快速单元测试 (2026)

完整的 Vitest 指南,涵盖安装配置、测试语法、Mock、快照测试、代码覆盖率、Vue/React 组件测试、TypeScript 集成、Vitest UI 和从 Jest 迁移。

TypeScript 类型守卫:运行时类型检查完全指南

掌握 TypeScript 类型守卫:typeof、instanceof、in、自定义类型守卫和可辨识联合。