Skip to content
⚠️ This article was written in 2020. Some content may be outdated.

ESLint + Prettier 統一團隊程式碼規範

新專案程式碼風格五花八門,PR review 光討論格式就浪費大量時間。花了一天把 ESLint + Prettier + Git Hooks 全套配好,團隊效率直接提升。

為什麼不是隻用 ESLint

ESLint 關注程式碼質量(潛在 bug),Prettier 關注程式碼格式(風格統一)。兩者職責不同:

  • ESLint:no-unused-varsno-undefeqeqeq 這些是質量問題
  • Prettier:縮排、分號、引號、換行這些是格式問題

用 Prettier 管格式,ESLint 管質量,互不干擾。

安裝配置

bash
# 核心依賴
npm install -D eslint prettier
npm install -D eslint-config-prettier eslint-plugin-prettier

# Vue 專案額外需要
npm install -D eslint-plugin-vue @vue/eslint-config-typescript

# TypeScript 專案
npm install -D @typescript-eslint/parser @typescript-eslint/eslint-plugin

.eslintrc.js

javascript
module.exports = {
  root: true,
  env: {
    browser: true,
    node: true,
    es2020: true,
  },
  parserOptions: {
    parser: '@typescript-eslint/parser',
    ecmaVersion: 2020,
    sourceType: 'module',
  },
  extends: [
    'eslint:recommended',
    'plugin:vue/recommended',
    '@vue/typescript/recommended',
    'plugin:prettier/recommended', // 必須放最後
  ],
  rules: {
    // 程式碼質量
    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    '@typescript-eslint/no-explicit-any': 'warn',
    '@typescript-eslint/explicit-function-return-type': 'off',

    // Vue 規範
    'vue/component-name-in-template-casing': ['error', 'kebab-case'],
    'vue/no-v-html': 'warn',
    'vue/require-default-prop': 'error',
  },
};

.prettierrc

json
{
  "semi": true,
  "singleQuote": true,
  "trailingComma": "all",
  "printWidth": 100,
  "tabWidth": 2,
  "arrowParens": "always",
  "endOfLine": "lf",
  "vueIndentScriptAndStyle": false
}

Git Hooks 強制執行

bash
npm install -D husky lint-staged
json
// package.json
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,ts,vue}": [
      "eslint --fix",
      "git add"
    ],
    "*.{json,md,yml,css,scss}": [
      "prettier --write",
      "git add"
    ]
  }
}

VSCode 配置共享

json
// .vscode/settings.json
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "typescript",
    "vue"
  ],
  "files.eol": "\n"
}

加上 .vscode/extensions.json 推薦外掛:

json
{
  "recommendations": [
    "esbenp.prettier-vscode",
    "dbaeumer.vscode-eslint",
    "octref.vetur"
  ]
}

踩坑記錄

bash
# ESLint 和 Prettier 規則衝突
# 解決:eslint-config-prettier 會關掉所有和 Prettier 衝突的 ESLint 規則
# 確保 extends 裡 'plugin:prettier/recommended' 放最後

# 舊專案引入:一步步來
# 1. 先加配置,不自動修復
# 2. 團隊成員各自跑一次 fix
# 3. 確認沒問題後開啟 hooks

小結

  • ESLint 管程式碼質量,Prettier 管程式碼格式,各司其職
  • eslint-config-prettier 解決兩者規則衝突
  • husky + lint-staged 在提交時自動修復,保證主分支程式碼風格一致
  • VSCode 配置共享確保每個成員格式化結果一致
  • 舊專案漸進式引入,避免一次性改動太多導致衝突

MIT Licensed