Skip to content

Prettier 格式化设置指南

Prettier 是现代前端开发中最受欢迎的代码格式化工具,能够确保团队代码风格的一致性。本指南涵盖完整的配置和集成方案。

🚀 快速开始

安装 Prettier

bash
# 安装 Prettier
npm install prettier -D

# 全局安装(可选)
npm install -g prettier

# 检查版本
prettier --version

基础使用

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

# 格式化整个目录
prettier --write src/

# 检查格式(不修改文件)
prettier --check src/

# 格式化特定类型文件
prettier --write "src/**/*.{js,jsx,ts,tsx,vue,css,scss,json,md}"

⚙️ 配置文件

.prettierrc 配置

json
{
  "semi": false,
  "singleQuote": true,
  "quoteProps": "as-needed",
  "trailingComma": "none",
  "bracketSpacing": true,
  "bracketSameLine": false,
  "arrowParens": "avoid",
  "printWidth": 80,
  "tabWidth": 2,
  "useTabs": false,
  "endOfLine": "lf",
  "embeddedLanguageFormatting": "auto"
}

JavaScript 配置文件

javascript
// prettier.config.js
module.exports = {
  // 基础配置
  semi: false,                    // 不使用分号
  singleQuote: true,             // 使用单引号
  quoteProps: 'as-needed',       // 仅在需要时给对象属性加引号
  trailingComma: 'none',         // 不使用尾随逗号
  bracketSpacing: true,          // 对象字面量的括号间加空格
  bracketSameLine: false,        // 多行JSX元素的>放在下一行
  arrowParens: 'avoid',          // 箭头函数参数只有一个时不加括号
  
  // 格式化设置
  printWidth: 80,                // 每行最大字符数
  tabWidth: 2,                   // 缩进空格数
  useTabs: false,                // 使用空格而不是tab
  endOfLine: 'lf',               // 换行符使用 lf
  
  // 嵌入式语言格式化
  embeddedLanguageFormatting: 'auto',
  
  // HTML 设置
  htmlWhitespaceSensitivity: 'css',
  
  // Vue 特定设置
  vueIndentScriptAndStyle: false,
  
  // 覆盖特定文件类型
  overrides: [
    {
      files: '*.json',
      options: {
        printWidth: 120,
        trailingComma: 'none'
      }
    },
    {
      files: '*.md',
      options: {
        printWidth: 100,
        proseWrap: 'always'
      }
    },
    {
      files: '*.vue',
      options: {
        singleQuote: true,
        semi: false
      }
    }
  ]
}

🎯 框架特定配置

Vue 3 项目配置

javascript
// prettier.config.js - Vue 3 项目
module.exports = {
  semi: false,
  singleQuote: true,
  trailingComma: 'none',
  bracketSpacing: true,
  arrowParens: 'avoid',
  printWidth: 100,
  tabWidth: 2,
  useTabs: false,
  endOfLine: 'lf',
  
  // Vue 特定配置
  vueIndentScriptAndStyle: false,
  
  overrides: [
    {
      files: '*.vue',
      options: {
        parser: 'vue',
        singleQuote: true,
        semi: false,
        printWidth: 100
      }
    },
    {
      files: '*.ts',
      options: {
        parser: 'typescript',
        semi: false,
        singleQuote: true
      }
    },
    {
      files: '*.scss',
      options: {
        parser: 'scss',
        singleQuote: true
      }
    }
  ]
}

React 18 项目配置

javascript
// prettier.config.js - React 18 项目
module.exports = {
  semi: true,
  singleQuote: true,
  trailingComma: 'es5',
  bracketSpacing: true,
  bracketSameLine: false,
  arrowParens: 'avoid',
  printWidth: 80,
  tabWidth: 2,
  useTabs: false,
  endOfLine: 'lf',
  
  // JSX 特定配置
  jsxSingleQuote: true,
  jsxBracketSameLine: false,
  
  overrides: [
    {
      files: '*.{js,jsx,ts,tsx}',
      options: {
        parser: 'typescript',
        semi: true,
        singleQuote: true,
        trailingComma: 'es5'
      }
    },
    {
      files: '*.json',
      options: {
        parser: 'json',
        trailingComma: 'none'
      }
    },
    {
      files: '*.css',
      options: {
        parser: 'css',
        singleQuote: false
      }
    }
  ]
}

TypeScript 项目配置

javascript
// prettier.config.js - TypeScript 项目
module.exports = {
  semi: true,
  singleQuote: true,
  trailingComma: 'all',
  bracketSpacing: true,
  arrowParens: 'avoid',
  printWidth: 100,
  tabWidth: 2,
  useTabs: false,
  endOfLine: 'lf',
  
  overrides: [
    {
      files: '*.{ts,tsx}',
      options: {
        parser: 'typescript',
        semi: true,
        singleQuote: true,
        trailingComma: 'all',
        printWidth: 100
      }
    },
    {
      files: '*.d.ts',
      options: {
        parser: 'typescript',
        printWidth: 120
      }
    }
  ]
}

🔧 编辑器集成

VS Code 集成

json
// .vscode/settings.json
{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": true,
  "editor.formatOnPaste": true,
  "editor.formatOnType": false,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true,
    "source.formatDocument": true
  },
  
  // 特定文件类型配置
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "[vue]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "[css]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "[scss]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "[markdown]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true,
    "editor.wordWrap": "on"
  },
  
  // Prettier 特定设置
  "prettier.requireConfig": true,
  "prettier.useEditorConfig": false,
  "prettier.resolveGlobalModules": true
}

WebStorm/IntelliJ 集成

javascript
// 在 WebStorm 中配置 Prettier
// File -> Settings -> Languages & Frameworks -> JavaScript -> Prettier
// 
// 配置项:
// - Prettier package: 选择项目中的 prettier 包
// - Run for files: {**/*,*}.{js,ts,jsx,tsx,vue,css,scss,json,md}
// - On code reformat: 勾选
// - On save: 勾选

🔗 工具集成

ESLint 集成

bash
# 安装 ESLint 和 Prettier 集成插件
npm install -D eslint-config-prettier eslint-plugin-prettier
javascript
// .eslintrc.js
module.exports = {
  extends: [
    'eslint:recommended',
    'prettier' // 必须放在最后,关闭与 Prettier 冲突的规则
  ],
  plugins: ['prettier'],
  rules: {
    'prettier/prettier': 'error' // 将 Prettier 规则作为 ESLint 规则
  }
}

Git Hooks 集成

json
// package.json
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx,vue}": [
      "prettier --write",
      "eslint --fix",
      "git add"
    ],
    "*.{css,scss,less}": [
      "prettier --write",
      "git add"
    ],
    "*.{json,md}": [
      "prettier --write",
      "git add"
    ]
  }
}

CI/CD 集成

yaml
# .github/workflows/format-check.yml
name: Format Check
on: [push, pull_request]

jobs:
  format-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      - name: Install dependencies
        run: npm ci
      - name: Check formatting
        run: npx prettier --check "src/**/*.{js,jsx,ts,tsx,vue,css,scss,json,md}"
      - name: Check if formatted
        run: |
          if ! git diff --quiet; then
            echo "Code is not formatted. Please run 'npm run format' and commit the changes."
            exit 1
          fi

📋 忽略文件配置

.prettierignore

bash
# 依赖和构建输出
node_modules/
dist/
build/
coverage/
.next/
.nuxt/
.vuepress/dist/

# 锁文件
package-lock.json
yarn.lock
pnpm-lock.yaml

# 日志文件
*.log

# 环境配置
.env
.env.*

# 编辑器配置
.vscode/
.idea/

# 操作系统文件
.DS_Store
Thumbs.db

# 特定文件
*.min.js
*.min.css
*.bundle.js

# 文档
CHANGELOG.md
LICENSE

# 配置文件(可选)
*.config.js

🎨 团队规范配置

严格模式配置

javascript
// prettier.config.js - 严格模式
module.exports = {
  // 强制统一的代码风格
  semi: true,
  singleQuote: true,
  trailingComma: 'all',
  bracketSpacing: true,
  bracketSameLine: false,
  arrowParens: 'always',
  printWidth: 80,
  tabWidth: 2,
  useTabs: false,
  endOfLine: 'lf',
  
  // 严格的换行和空格规则
  htmlWhitespaceSensitivity: 'strict',
  proseWrap: 'always',
  
  overrides: [
    {
      files: '*.{js,jsx,ts,tsx,vue}',
      options: {
        semi: true,
        singleQuote: true,
        trailingComma: 'all'
      }
    }
  ]
}

宽松模式配置

javascript
// prettier.config.js - 宽松模式
module.exports = {
  // 相对宽松的代码风格
  semi: false,
  singleQuote: true,
  trailingComma: 'es5',
  bracketSpacing: true,
  arrowParens: 'avoid',
  printWidth: 100,
  tabWidth: 2,
  useTabs: false,
  endOfLine: 'auto',
  
  // 宽松的换行规则
  htmlWhitespaceSensitivity: 'css',
  proseWrap: 'preserve'
}

📊 脚本配置

package.json 脚本

json
{
  "scripts": {
    "format": "prettier --write .",
    "format:check": "prettier --check .",
    "format:js": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"",
    "format:vue": "prettier --write \"src/**/*.vue\"",
    "format:css": "prettier --write \"src/**/*.{css,scss,less}\"",
    "format:json": "prettier --write \"**/*.json\"",
    "format:md": "prettier --write \"**/*.md\"",
    "lint:format": "eslint --fix . && prettier --write ."
  }
}

批量格式化脚本

bash
#!/bin/bash
# format-all.sh

echo "🎨 开始格式化代码..."

# 格式化 JavaScript/TypeScript 文件
echo "📝 格式化 JS/TS 文件..."
prettier --write "src/**/*.{js,jsx,ts,tsx}"

# 格式化 Vue 文件
echo "🖼️ 格式化 Vue 文件..."
prettier --write "src/**/*.vue"

# 格式化样式文件
echo "🎨 格式化样式文件..."
prettier --write "src/**/*.{css,scss,less}"

# 格式化配置文件
echo "⚙️ 格式化配置文件..."
prettier --write "*.{json,js,ts}"

# 格式化文档文件
echo "📚 格式化文档文件..."
prettier --write "**/*.md"

echo "✅ 代码格式化完成!"

💡 最佳实践

1. 团队协作

  • 统一配置文件并提交到版本控制
  • 在项目文档中说明格式化规范
  • 定期检查和更新配置

2. 性能优化

  • 使用 .prettierignore 排除不需要格式化的文件
  • 在 CI/CD 中只检查变更的文件
  • 合理配置编辑器自动格式化

3. 配置管理

  • 根据项目特点选择合适的配置
  • 考虑团队成员的习惯和偏好
  • 定期回顾和优化配置

4. 工具集成

  • 与 ESLint 配合使用
  • 集成到 Git Hooks 中
  • 配置编辑器自动格式化

5. 渐进式引入

  • 从基础配置开始
  • 逐步完善规则
  • 避免一次性改动过大

Prettier 的核心价值在于消除代码风格争议,让团队专注于业务逻辑。建议团队制定统一的格式化规范并严格执行。