ESLint + Prettier 代碼規範統一指南

文章目錄

  • ESLint + Prettier 代碼規範統一指南
  • 代碼規範的重要性
  • 為什麼需要代碼規範?
  • 🎯 **核心價值**
  • 📊 **數據支撐**
  • ESLint 詳細介紹
  • 什麼是 ESLint?
  • 基礎安裝和配置
  • 1. 安裝 ESLint
  • 2. 初始化配置
  • 3. 基礎配置文件
  • 高級配置選項
  • 1. 自定義規則配置
  • 2. 插件使用
  • 3. 環境特定配置
  • Prettier 詳細介紹
  • 什麼是 Prettier?
  • 基礎安裝和配置
  • 1. 安裝 Prettier
  • 2. 基礎配置文件
  • 3. 忽略文件配置
  • 高級配置選項
  • 1. 文件類型特定配置
  • 2. 編輯器集成
  • ESLint + Prettier 集成配置
  • 解決衝突問題
  • 1. 安裝集成插件
  • 2. 配置 ESLint
  • 3. 統一配置文件
  • 工作流集成
  • 1. Package.json 腳本
  • 2. 自動化腳本
  • 團隊協作最佳實踐
  • Git Hooks 集成
  • 1. 使用 Husky
  • 2. 完整的 Git Hooks 配置
  • CI/CD 集成
  • 1. GitHub Actions 配置
  • 2. GitLab CI 配置
  • 編輯器配置統一
  • 1. EditorConfig
  • 2. VS Code 工作區配置
  • 不同項目類型配置方案
  • React 項目配置
  • 1. 依賴安裝
  • 2. ESLint 配置
  • 3. Prettier 配置
  • Vue 項目配置
  • 1. 依賴安裝
  • 2. ESLint 配置
  • TypeScript 項目配置
  • 1. 完整的 TypeScript 配置
  • Node.js 項目配置
  • 1. 服務端配置
  • 常見問題和解決方案
  • 問題 1:ESLint 和 Prettier 規則衝突
  • 問題 2:編輯器格式化不一致
  • 問題 3:Git Hooks 不生效
  • 問題 4:性能問題
  • 問題 5:TypeScript 項目配置問題
  • 故障排除清單
  • 🔍 **診斷步驟**
  • 🛠️ **常用調試命令**
  • 實際案例分享
  • 案例 1:大型電商項目代碼規範實施
  • 項目背景
  • 實施過程
  • 案例 2:開源組件庫規範化
  • 項目背景
  • 配置策略
  • 案例 3:微前端架構規範統一
  • 項目背景
  • 統一配置策略
  • 實施效果
  • 最佳實踐總結
  • 🎯 **實施建議**
  • 📊 **成功指標**
  • 總結
  • 核心要點回顧
  • 下一步行動

代碼規範的重要性

為什麼需要代碼規範?

在現代前端開發中,代碼規範不僅僅是"好看"的問題,它關係到:

🎯 核心價值
  1. 提高代碼質量
  • 減少潛在 bug
  • 提升代碼可讀性
  • 統一編碼風格
  1. 提升團隊效率
  • 降低代碼審查成本
  • 減少溝通成本
  • 提高開發效率
  1. 降低維護成本
  • 便於代碼重構
  • 易於新人上手
  • 減少技術債務
📊 數據支撐
統計數據顯示:
- 規範化的代碼可以減少 40% 的 bug 率
- 團隊協作效率提升 30%
- 代碼審查時間減少 50%

ESLint 詳細介紹

什麼是 ESLint?

ESLint 是一個開源的 JavaScript 代碼檢查工具,用於識別和報告代碼中的模式匹配問題。

基礎安裝和配置

1. 安裝 ESLint
# 全局安裝
npm install -g eslint

# 項目本地安裝(推薦)
npm install --save-dev eslint

# 使用 yarn
yarn add --dev eslint

# 使用 pnpm
pnpm add -D eslint
2. 初始化配置
# 交互式初始化
npx eslint --init

# 或者使用
npm init @eslint/config
3. 基礎配置文件

創建 .eslintrc.js 文件:

module.exports = {
  // 環境配置
  env: {
    browser: true,
    es2021: true,
    node: true,
    jest: true
  },
  
  // 繼承的配置
  extends: [
    'eslint:recommended',
    '@typescript-eslint/recommended'
  ],
  
  // 解析器配置
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
    ecmaFeatures: {
      jsx: true
    }
  },
  
  // 插件
  plugins: [
    '@typescript-eslint',
    'react',
    'react-hooks'
  ],
  
  // 自定義規則
  rules: {
    // 基礎規則
    'no-console': 'warn',
    'no-debugger': 'error',
    'no-unused-vars': 'error',
    
    // 代碼風格
    'indent': ['error', 2],
    'quotes': ['error', 'single'],
    'semi': ['error', 'always'],
    
    // React 相關
    'react/jsx-uses-react': 'error',
    'react/jsx-uses-vars': 'error',
    'react-hooks/rules-of-hooks': 'error',
    'react-hooks/exhaustive-deps': 'warn'
  },
  
  // 忽略配置
  ignorePatterns: [
    'dist/',
    'build/',
    'node_modules/',
    '*.min.js'
  ]
};

高級配置選項

1. 自定義規則配置
module.exports = {
  rules: {
    // 錯誤級別:off/0, warn/1, error/2
    
    // 變量相關
    'no-undef': 'error',
    'no-unused-vars': ['error', { 
      vars: 'all',
      args: 'after-used',
      ignoreRestSiblings: false 
    }],
    
    // 代碼質量
    'complexity': ['warn', 10],
    'max-depth': ['warn', 4],
    'max-lines': ['warn', 300],
    'max-params': ['warn', 4],
    
    // 最佳實踐
    'eqeqeq': ['error', 'always'],
    'no-eval': 'error',
    'no-implied-eval': 'error',
    'prefer-const': 'error',
    'no-var': 'error',
    
    // ES6+ 特性
    'arrow-spacing': 'error',
    'prefer-arrow-callback': 'error',
    'prefer-template': 'error'
  }
};
2. 插件使用
module.exports = {
  plugins: [
    // TypeScript 支持
    '@typescript-eslint',
    
    // React 支持
    'react',
    'react-hooks',
    
    // Vue 支持
    'vue',
    
    // 導入檢查
    'import',
    
    // JSX a11y
    'jsx-a11y',
    
    // 安全檢查
    'security'
  ],
  
  extends: [
    'plugin:@typescript-eslint/recommended',
    'plugin:react/recommended',
    'plugin:react-hooks/recommended',
    'plugin:import/recommended',
    'plugin:jsx-a11y/recommended',
    'plugin:security/recommended'
  ]
};
3. 環境特定配置
module.exports = {
  // 覆蓋配置
  overrides: [
    {
      // 測試文件配置
      files: ['**/*.test.js', '**/*.spec.js'],
      env: {
        jest: true
      },
      rules: {
        'no-console': 'off'
      }
    },
    {
      // TypeScript 文件配置
      files: ['**/*.ts', '**/*.tsx'],
      parser: '@typescript-eslint/parser',
      rules: {
        '@typescript-eslint/no-unused-vars': 'error',
        '@typescript-eslint/explicit-function-return-type': 'warn'
      }
    }
  ]
};

Prettier 詳細介紹

什麼是 Prettier?

Prettier 是一個代碼格式化工具,支持多種語言,能夠自動格式化代碼以保持一致的風格。

基礎安裝和配置

1. 安裝 Prettier
# 項目本地安裝
npm install --save-dev prettier

# 使用 yarn
yarn add --dev prettier

# 使用 pnpm
pnpm add -D prettier
2. 基礎配置文件

創建 .prettierrc.js 文件:

module.exports = {
  // 基礎配置
  printWidth: 80,           // 每行最大字符數
  tabWidth: 2,              // 縮進空格數
  useTabs: false,           // 使用空格而不是 tab
  semi: true,               // 語句末尾添加分號
  singleQuote: true,        // 使用單引號
  quoteProps: 'as-needed',  // 對象屬性引號
  
  // JSX 配置
  jsxSingleQuote: true,     // JSX 中使用單引號
  jsxBracketSameLine: false, // JSX 標籤閉合位置
  
  // 數組和對象
  trailingComma: 'es5',     // 尾隨逗號
  bracketSpacing: true,     // 對象字面量空格
  
  // 箭頭函數
  arrowParens: 'avoid',     // 箭頭函數參數括號
  
  // 其他
  endOfLine: 'lf',          // 換行符
  embeddedLanguageFormatting: 'auto', // 嵌入語言格式化
  
  // HTML 配置
  htmlWhitespaceSensitivity: 'css',
  
  // Vue 配置
  vueIndentScriptAndStyle: false
};
3. 忽略文件配置

創建 .prettierignore 文件:

# 依賴
node_modules/
package-lock.json
yarn.lock
pnpm-lock.yaml

# 構建產物
dist/
build/
coverage/

# 配置文件
.env
.env.local
.env.production

# 其他
*.min.js
*.min.css
public/

高級配置選項

1. 文件類型特定配置
module.exports = {
  // 全局配置
  printWidth: 80,
  tabWidth: 2,
  
  // 覆蓋配置
  overrides: [
    {
      files: '*.json',
      options: {
        tabWidth: 4
      }
    },
    {
      files: '*.md',
      options: {
        printWidth: 100,
        proseWrap: 'always'
      }
    },
    {
      files: '*.{css,scss,less}',
      options: {
        singleQuote: false
      }
    }
  ]
};
2. 編輯器集成

VS Code 配置 (.vscode/settings.json):

{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  }
}

WebStorm 配置

  1. 打開 Settings → Tools → File Watchers
  2. 添加 Prettier 文件監聽器
  3. 配置自動格式化

ESLint + Prettier 集成配置

解決衝突問題

ESLint 和 Prettier 在某些規則上可能存在衝突,需要正確配置來避免。

1. 安裝集成插件
# 安裝 eslint-config-prettier(禁用衝突規則)
npm install --save-dev eslint-config-prettier

# 安裝 eslint-plugin-prettier(將 Prettier 作為 ESLint 規則運行)
npm install --save-dev eslint-plugin-prettier
2. 配置 ESLint

更新 .eslintrc.js

module.exports = {
  extends: [
    'eslint:recommended',
    '@typescript-eslint/recommended',
    'plugin:react/recommended',
    'plugin:prettier/recommended', // 必須放在最後
  ],
  
  plugins: [
    '@typescript-eslint',
    'react',
    'prettier'
  ],
  
  rules: {
    // Prettier 相關
    'prettier/prettier': 'error',
    
    // 禁用與 Prettier 衝突的規則
    'indent': 'off',
    'quotes': 'off',
    'semi': 'off',
    'comma-dangle': 'off',
    'max-len': 'off',
    
    // 保留非格式化相關的規則
    'no-console': 'warn',
    'no-debugger': 'error',
    'no-unused-vars': 'error'
  }
};
3. 統一配置文件

創建 prettier-eslint 配置:

// .eslintrc.js
module.exports = {
  extends: [
    'eslint:recommended',
    'prettier' // 禁用所有與 Prettier 衝突的規則
  ],
  plugins: ['prettier'],
  rules: {
    'prettier/prettier': [
      'error',
      {
        printWidth: 80,
        tabWidth: 2,
        useTabs: false,
        semi: true,
        singleQuote: true,
        trailingComma: 'es5',
        bracketSpacing: true,
        arrowParens: 'avoid'
      }
    ]
  }
};

工作流集成

1. Package.json 腳本
{
  "scripts": {
    "lint": "eslint src --ext .js,.jsx,.ts,.tsx",
    "lint:fix": "eslint src --ext .js,.jsx,.ts,.tsx --fix",
    "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,json,css,md}\"",
    "format:check": "prettier --check \"src/**/*.{js,jsx,ts,tsx,json,css,md}\"",
    "code-check": "npm run lint && npm run format:check",
    "code-fix": "npm run lint:fix && npm run format"
  }
}
2. 自動化腳本

創建 scripts/code-quality.js

const { execSync } = require('child_process');
const chalk = require('chalk');

function runCommand(command, description) {
  console.log(chalk.blue(`🔍 ${description}...`));
  try {
    execSync(command, { stdio: 'inherit' });
    console.log(chalk.green(`✅ ${description} 完成`));
  } catch (error) {
    console.log(chalk.red(`❌ ${description} 失敗`));
    process.exit(1);
  }
}

// 代碼質量檢查流程
console.log(chalk.yellow('🚀 開始代碼質量檢查...'));

runCommand('npm run lint', 'ESLint 檢查');
runCommand('npm run format:check', 'Prettier 格式檢查');
runCommand('npm run test', '單元測試');

console.log(chalk.green('🎉 所有檢查通過!'));

團隊協作最佳實踐

Git Hooks 集成

1. 使用 Husky

安裝和配置:

# 安裝 husky
npm install --save-dev husky

# 安裝 lint-staged
npm install --save-dev lint-staged

# 初始化 husky
npx husky install

# 添加 pre-commit hook
npx husky add .husky/pre-commit "npx lint-staged"

配置 package.json

{
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "prettier --write",
      "git add"
    ],
    "*.{json,css,md}": [
      "prettier --write",
      "git add"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
    }
  }
}
2. 完整的 Git Hooks 配置

.husky/pre-commit

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

echo "🔍 Running pre-commit checks..."

# 運行 lint-staged
npx lint-staged

# 運行類型檢查
npm run type-check

# 運行測試
npm run test:staged

echo "✅ Pre-commit checks passed!"

.husky/commit-msg

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

# 提交信息規範檢查
npx commitlint --edit $1

CI/CD 集成

1. GitHub Actions 配置

創建 .github/workflows/code-quality.yml

name: Code Quality Check

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

jobs:
  code-quality:
    runs-on: ubuntu-latest
    
    strategy:
      matrix:
        node-version: [16.x, 18.x]
    
    steps:
    - name: Checkout code
      uses: actions/checkout@v3
    
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    
    - name: Install dependencies
      run: npm ci
    
    - name: Run ESLint
      run: npm run lint
    
    - name: Check Prettier formatting
      run: npm run format:check
    
    - name: Run type check
      run: npm run type-check
    
    - name: Run tests
      run: npm run test:coverage
    
    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v3
      with:
        file: ./coverage/lcov.info
2. GitLab CI 配置

創建 .gitlab-ci.yml

stages:
  - quality
  - test
  - build

variables:
  NODE_VERSION: "18"

cache:
  paths:
    - node_modules/

before_script:
  - npm ci

lint:
  stage: quality
  script:
    - npm run lint
  only:
    - merge_requests
    - main

format-check:
  stage: quality
  script:
    - npm run format:check
  only:
    - merge_requests
    - main

type-check:
  stage: quality
  script:
    - npm run type-check
  only:
    - merge_requests
    - main

test:
  stage: test
  script:
    - npm run test:coverage
  coverage: '/Lines\s*:\s*(\d+\.\d+)%/'
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml

編輯器配置統一

1. EditorConfig

創建 .editorconfig

# EditorConfig is awesome: https://EditorConfig.org

root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2

[*.{js,jsx,ts,tsx,vue}]
indent_size = 2

[*.{json,yml,yaml}]
indent_size = 2

[*.md]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab
2. VS Code 工作區配置

創建 .vscode/settings.json

{
  "editor.formatOnSave": true,
  "editor.formatOnPaste": true,
  "editor.formatOnType": false,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true,
    "source.organizeImports": true
  },
  
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "typescript",
    "typescriptreact",
    "vue"
  ],
  
  "typescript.preferences.importModuleSpecifier": "relative",
  "javascript.preferences.importModuleSpecifier": "relative",
  
  "files.associations": {
    "*.css": "css",
    "*.scss": "scss"
  },
  
  "emmet.includeLanguages": {
    "javascript": "javascriptreact",
    "typescript": "typescriptreact"
  }
}

創建 .vscode/extensions.json

{
  "recommendations": [
    "esbenp.prettier-vscode",
    "dbaeumer.vscode-eslint",
    "editorconfig.editorconfig",
    "bradlc.vscode-tailwindcss",
    "ms-vscode.vscode-typescript-next"
  ]
}

不同項目類型配置方案

React 項目配置

1. 依賴安裝
npm install --save-dev \
  eslint \
  prettier \
  @typescript-eslint/parser \
  @typescript-eslint/eslint-plugin \
  eslint-plugin-react \
  eslint-plugin-react-hooks \
  eslint-plugin-jsx-a11y \
  eslint-config-prettier \
  eslint-plugin-prettier
2. ESLint 配置

.eslintrc.js

module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true
  },
  
  extends: [
    'eslint:recommended',
    '@typescript-eslint/recommended',
    'plugin:react/recommended',
    'plugin:react-hooks/recommended',
    'plugin:jsx-a11y/recommended',
    'prettier'
  ],
  
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaFeatures: {
      jsx: true
    },
    ecmaVersion: 'latest',
    sourceType: 'module'
  },
  
  plugins: [
    'react',
    'react-hooks',
    '@typescript-eslint',
    'jsx-a11y',
    'prettier'
  ],
  
  rules: {
    'prettier/prettier': 'error',
    
    // React 相關
    'react/react-in-jsx-scope': 'off', // React 17+
    'react/prop-types': 'off', // 使用 TypeScript
    'react/jsx-props-no-spreading': 'warn',
    'react/jsx-key': 'error',
    
    // React Hooks
    'react-hooks/rules-of-hooks': 'error',
    'react-hooks/exhaustive-deps': 'warn',
    
    // TypeScript
    '@typescript-eslint/no-unused-vars': 'error',
    '@typescript-eslint/explicit-function-return-type': 'off',
    '@typescript-eslint/no-explicit-any': 'warn',
    
    // 可訪問性
    'jsx-a11y/anchor-is-valid': 'warn',
    'jsx-a11y/click-events-have-key-events': 'warn'
  },
  
  settings: {
    react: {
      version: 'detect'
    }
  }
};
3. Prettier 配置

.prettierrc.js

module.exports = {
  printWidth: 80,
  tabWidth: 2,
  useTabs: false,
  semi: true,
  singleQuote: true,
  quoteProps: 'as-needed',
  jsxSingleQuote: true,
  trailingComma: 'es5',
  bracketSpacing: true,
  jsxBracketSameLine: false,
  arrowParens: 'avoid',
  endOfLine: 'lf'
};

Vue 項目配置

1. 依賴安裝
npm install --save-dev \
  eslint \
  prettier \
  @typescript-eslint/parser \
  @typescript-eslint/eslint-plugin \
  eslint-plugin-vue \
  @vue/eslint-config-typescript \
  @vue/eslint-config-prettier \
  eslint-config-prettier \
  eslint-plugin-prettier
2. ESLint 配置

.eslintrc.js

module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true
  },
  
  extends: [
    'eslint:recommended',
    '@typescript-eslint/recommended',
    'plugin:vue/vue3-recommended',
    '@vue/typescript/recommended',
    'prettier'
  ],
  
  parser: 'vue-eslint-parser',
  parserOptions: {
    parser: '@typescript-eslint/parser',
    ecmaVersion: 'latest',
    sourceType: 'module'
  },
  
  plugins: [
    'vue',
    '@typescript-eslint',
    'prettier'
  ],
  
  rules: {
    'prettier/prettier': 'error',
    
    // Vue 相關
    'vue/multi-word-component-names': 'off',
    'vue/no-v-html': 'warn',
    'vue/require-default-prop': 'error',
    'vue/require-prop-types': 'error',
    'vue/component-name-in-template-casing': ['error', 'PascalCase'],
    
    // TypeScript
    '@typescript-eslint/no-unused-vars': 'error',
    '@typescript-eslint/explicit-function-return-type': 'off'
  }
};

TypeScript 項目配置

1. 完整的 TypeScript 配置

.eslintrc.js

module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true
  },
  
  extends: [
    'eslint:recommended',
    '@typescript-eslint/recommended',
    '@typescript-eslint/recommended-requiring-type-checking',
    'prettier'
  ],
  
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
    project: './tsconfig.json'
  },
  
  plugins: [
    '@typescript-eslint',
    'prettier'
  ],
  
  rules: {
    'prettier/prettier': 'error',
    
    // TypeScript 嚴格規則
    '@typescript-eslint/no-unused-vars': 'error',
    '@typescript-eslint/explicit-function-return-type': 'warn',
    '@typescript-eslint/no-explicit-any': 'error',
    '@typescript-eslint/no-unsafe-assignment': 'error',
    '@typescript-eslint/no-unsafe-call': 'error',
    '@typescript-eslint/no-unsafe-member-access': 'error',
    '@typescript-eslint/no-unsafe-return': 'error',
    
    // 命名規範
    '@typescript-eslint/naming-convention': [
      'error',
      {
        selector: 'interface',
        format: ['PascalCase'],
        prefix: ['I']
      },
      {
        selector: 'typeAlias',
        format: ['PascalCase']
      },
      {
        selector: 'enum',
        format: ['PascalCase']
      }
    ]
  }
};

Node.js 項目配置

1. 服務端配置

.eslintrc.js

module.exports = {
  env: {
    node: true,
    es2021: true
  },
  
  extends: [
    'eslint:recommended',
    '@typescript-eslint/recommended',
    'plugin:security/recommended',
    'prettier'
  ],
  
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module'
  },
  
  plugins: [
    '@typescript-eslint',
    'security',
    'prettier'
  ],
  
  rules: {
    'prettier/prettier': 'error',
    
    // Node.js 相關
    'no-console': 'off', // 服務端允許 console
    'no-process-exit': 'error',
    
    // 安全相關
    'security/detect-object-injection': 'warn',
    'security/detect-non-literal-fs-filename': 'warn',
    
    // TypeScript
    '@typescript-eslint/no-unused-vars': 'error',
    '@typescript-eslint/explicit-function-return-type': 'warn'
  }
};

常見問題和解決方案

問題 1:ESLint 和 Prettier 規則衝突

症狀

error  Delete `⏎` prettier/prettier
error  Expected indentation of 2 spaces but found 4 indent

解決方案

  1. 確保安裝了 eslint-config-prettier
  2. 在 ESLint 配置中正確使用:
module.exports = {
  extends: [
    'eslint:recommended',
    'prettier' // 必須放在最後
  ]
};

問題 2:編輯器格式化不一致

症狀:團隊成員保存文件時格式化結果不同

解決方案

  1. 統一編輯器配置:
// .vscode/settings.json
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "prettier.configPath": "./.prettierrc.js"
}
  1. 添加 EditorConfig:
# .editorconfig
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

問題 3:Git Hooks 不生效

症狀:提交代碼時沒有觸發代碼檢查

解決方案

  1. 檢查 Husky 安裝:
# 重新安裝 husky
npm uninstall husky
npm install --save-dev husky
npx husky install
  1. 檢查 hook 文件權限:
chmod +x .husky/pre-commit
  1. 驗證 hook 配置:
# 測試 pre-commit hook
npx husky run pre-commit

問題 4:性能問題

症狀:ESLint 檢查速度很慢

解決方案

  1. 使用緩存:
{
  "scripts": {
    "lint": "eslint --cache --cache-location .eslintcache src"
  }
}
  1. 忽略不必要的文件:
// .eslintrc.js
module.exports = {
  ignorePatterns: [
    'dist/',
    'build/',
    'node_modules/',
    '*.min.js',
    'coverage/'
  ]
};
  1. 使用並行處理:
npm install --save-dev eslint-parallel

問題 5:TypeScript 項目配置問題

症狀:TypeScript 文件 ESLint 檢查報錯

解決方案

  1. 確保正確的解析器配置:
module.exports = {
  parser: '@typescript-eslint/parser',
  parserOptions: {
    project: './tsconfig.json',
    tsconfigRootDir: __dirname
  }
};
  1. 檢查 tsconfig.json 包含路徑:
{
  "include": [
    "src/**/*",
    "tests/**/*"
  ]
}

故障排除清單

🔍 診斷步驟
  1. 檢查依賴版本
npm ls eslint prettier
  1. 驗證配置文件
npx eslint --print-config src/index.js
  1. 測試規則
npx eslint --no-eslintrc --config .eslintrc.js src/
  1. 檢查 Prettier 配置
npx prettier --check src/
🛠️ 常用調試命令
# 檢查 ESLint 配置
npx eslint --debug src/

# 檢查 Prettier 配置
npx prettier --check --debug-check src/

# 清除緩存
rm -rf .eslintcache
rm -rf node_modules/.cache

# 重新安裝依賴
rm -rf node_modules package-lock.json
npm install

實際案例分享

案例 1:大型電商項目代碼規範實施

項目背景
  • 團隊規模:15+ 前端開發者
  • 技術棧:React + TypeScript + Next.js
  • 代碼庫:50+ 組件,200+ 頁面
實施過程

第一階段:基礎配置

// .eslintrc.js - 初始配置
module.exports = {
  extends: [
    'eslint:recommended',
    '@typescript-eslint/recommended',
    'plugin:react/recommended',
    'plugin:react-hooks/recommended',
    'prettier'
  ],
  
  rules: {
    // 漸進式規則,從警告開始
    '@typescript-eslint/no-explicit-any': 'warn',
    'react/prop-types': 'off',
    'no-console': 'warn'
  }
};

第二階段:嚴格化規則

// 3個月後升級配置
module.exports = {
  extends: [
    'eslint:recommended',
    '@typescript-eslint/recommended',
    '@typescript-eslint/recommended-requiring-type-checking',
    'plugin:react/recommended',
    'plugin:react-hooks/recommended',
    'plugin:jsx-a11y/recommended',
    'prettier'
  ],
  
  rules: {
    // 升級為錯誤級別
    '@typescript-eslint/no-explicit-any': 'error',
    '@typescript-eslint/explicit-function-return-type': 'warn',
    'react/jsx-key': 'error',
    'jsx-a11y/alt-text': 'error'
  }
};

效果統計

  • 代碼審查時間減少 60%
  • Bug 率降低 45%
  • 新人上手時間縮短 40%

案例 2:開源組件庫規範化

項目背景
  • 項目類型:Vue 3 組件庫
  • 用户:1000+ 開發者
  • 組件數量:80+ 個組件
配置策略

嚴格的代碼質量要求

// .eslintrc.js
module.exports = {
  extends: [
    'eslint:recommended',
    '@typescript-eslint/recommended',
    'plugin:vue/vue3-recommended',
    '@vue/typescript/recommended',
    'prettier'
  ],
  
  rules: {
    // 組件庫特殊要求
    'vue/component-name-in-template-casing': ['error', 'PascalCase'],
    'vue/require-default-prop': 'error',
    'vue/require-prop-types': 'error',
    'vue/no-v-html': 'error', // 安全考慮
    
    // 文檔要求
    'jsdoc/require-description': 'error',
    'jsdoc/require-param': 'error',
    'jsdoc/require-returns': 'error'
  }
};

自動化文檔生成

{
  "scripts": {
    "docs:lint": "eslint docs --ext .js,.vue",
    "docs:format": "prettier --write docs/**/*.{js,vue,md}",
    "build:docs": "npm run docs:lint && npm run docs:format && vitepress build docs"
  }
}

案例 3:微前端架構規範統一

項目背景
  • 架構:微前端(qiankun)
  • 子應用:8個獨立應用
  • 技術棧:React、Vue、Angular 混合
統一配置策略

基礎配置包

// packages/eslint-config-micro-frontend/index.js
module.exports = {
  extends: [
    'eslint:recommended',
    'prettier'
  ],
  
  env: {
    browser: true,
    es2021: true
  },
  
  rules: {
    // 微前端特殊規則
    'no-undef': 'error', // 防止全局變量污染
    'no-implicit-globals': 'error',
    
    // 命名規範
    'camelcase': ['error', { 
      properties: 'never',
      ignoreGlobals: true 
    }]
  },
  
  overrides: [
    {
      files: ['**/*.react.{js,jsx,ts,tsx}'],
      extends: ['plugin:react/recommended']
    },
    {
      files: ['**/*.vue'],
      extends: ['plugin:vue/vue3-recommended']
    }
  ]
};

子應用配置

// 子應用 .eslintrc.js
module.exports = {
  extends: [
    '@company/eslint-config-micro-frontend',
    '@company/eslint-config-micro-frontend/react' // 或 vue
  ],
  
  rules: {
    // 子應用特定規則
  }
};
實施效果

量化指標

  • 配置統一率:100%
  • 代碼風格一致性:95%+
  • 跨應用代碼複用率:提升 30%

團隊反饋

  • 開發體驗顯著提升
  • 代碼審查效率提高
  • 新人培訓成本降低

最佳實踐總結

🎯 實施建議
  1. 漸進式推進
  • 從警告開始,逐步升級為錯誤
  • 先核心規則,再擴展規則
  • 給團隊適應時間
  1. 工具鏈集成
  • 編輯器插件統一
  • Git hooks 強制執行
  • CI/CD 流程集成
  1. 團隊培訓
  • 規範文檔編寫
  • 最佳實踐分享
  • 定期規範回顧
  1. 持續優化
  • 收集團隊反饋
  • 定期更新規則
  • 性能監控優化
📊 成功指標
  • 代碼質量:Bug 率下降 > 30%
  • 開發效率:代碼審查時間減少 > 50%
  • 團隊協作:代碼風格統一率 > 95%
  • 維護成本:重構時間減少 > 40%

總結

ESLint + Prettier 的組合為前端項目提供了強大的代碼質量保障。通過合理的配置和工作流集成,可以顯著提升團隊的開發效率和代碼質量。

核心要點回顧

  1. 正確處理衝突:使用 eslint-config-prettier 避免規則衝突
  2. 漸進式實施:從警告開始,逐步嚴格化規則
  3. 工具鏈集成:編輯器、Git hooks、CI/CD 全流程覆蓋
  4. 團隊協作:統一配置,規範文檔,持續優化

下一步行動

  1. 根據項目類型選擇合適的配置方案
  2. 設置 Git hooks 和 CI/CD 集成
  3. 團隊培訓和規範推廣
  4. 持續監控和優化

通過系統性的代碼規範實施,您的團隊將獲得更高的開發效率、更好的代碼質量和更愉快的協作體驗。