Skip to content

代码规范-ESLint

安装ESLint插件

  • 打开vscode

  • 进入扩展市场

  • 搜索ESLint

  • 点击安装

  • 添加到工作区

  • 这个时候 项目 根目录会多出来一个.vscode文件夹 里面有一个extensions.json文件
bash
{
  "recommendations": [
    "dbaeumer.vscode-eslint"
  ]
}
  • 新建一个文件 settings.json 这样 每个使用vscode的人 都会按照这个eslint来配置
bash

{
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit",
    "source.fixAll.stylelint": "explicit"
  },
  "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact", "vue"],
  "eslint.useFlatConfig": true,
  "eslint.workingDirectories": ["."],
  "stylelint.validate": ["css", "scss", "vue"],
  "[vue]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "prettier.singleQuote": true,
    "prettier.semi": false,
    "prettier.tabWidth": 2,
    "prettier.trailingComma": "all"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "prettier.singleQuote": true,
    "prettier.semi": false,
    "prettier.tabWidth": 2,
    "prettier.trailingComma": "all"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "prettier.singleQuote": true,
    "prettier.semi": false,
    "prettier.tabWidth": 2,
    "prettier.trailingComma": "all"
  },
  "[css]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "prettier.singleQuote": true,
    "prettier.semi": false,
    "prettier.tabWidth": 2,
    "prettier.trailingComma": "all"
  },
  "[scss]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "prettier.singleQuote": true,
    "prettier.semi": false,
    "prettier.tabWidth": 2,
    "prettier.trailingComma": "all"
  },
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "prettier.singleQuote": true,
    "prettier.semi": false,
    "prettier.tabWidth": 2,
    "prettier.trailingComma": "all"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "prettier.singleQuote": true,
    "prettier.semi": false,
    "prettier.tabWidth": 2,
    "prettier.trailingComma": "all"
  },
  "[markdown]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "prettier.singleQuote": true,
    "prettier.semi": false,
    "prettier.tabWidth": 2,
    "prettier.trailingComma": "all"
  },
  "prettier.requireConfig": true,
  "prettier.useEditorConfig": false,
  "editor.tabSize": 2,
  "editor.insertSpaces": true,
  "files.eol": "\n"
}
  • 注意

注意

在大多数情况下, .vscode/settings.json 不需要额外配置 ESLint 配置文件路径,因为 VSCode 的 ESLint 插件会自动读取项目根目录中的 .eslintrc.js 或其他格式的 ESLint 配置文件(如 .eslintrc.json、.eslintrc.yaml、.eslintrc 等)。

这个文件自己创建,自己编写就行。

项目安装ESLint

安装

bash
npx eslint --init

初始化

bash
 What do you want to lint? · javascript
 How would you like to use ESLint? · To check syntax and find problems
 What type of modules does your project use? · Javascript modules (import/export)
 Which framework does your project use? · vue
 Does your project use TypeScript? · No // 我这里没有使用ts你可以换成你自己的
 Where does your code run? · browser, node
 The config that you've selected requires the following dependencies:

eslint, @eslint/js, globals, eslint-plugin-vue
✔ Would you like to install them now?  Yes
✔ Which package manager do you want to use? · pnpm

生成eslint.config.ts文件

js
import js from '@eslint/js'
import tseslint from '@typescript-eslint/eslint-plugin'
import tsparser from '@typescript-eslint/parser'
import prettierConfig from 'eslint-config-prettier'
import vue from 'eslint-plugin-vue'
import { defineConfig } from 'eslint/config'
import vueParser from 'vue-eslint-parser'

export default defineConfig([
  // 基础 JavaScript 推荐配置
  js.configs.recommended,

  // Vue 3 推荐配置
  ...vue.configs['flat/recommended'],

  // 全局配置
  {
    files: ['**/*.{js,ts,tsx,vue}'],
    languageOptions: {
      ecmaVersion: 'latest',
      sourceType: 'module',
      globals: {
        // Node.js 全局变量
        process: 'readonly',
        Buffer: 'readonly',
        __dirname: 'readonly',
        __filename: 'readonly',
        // 浏览器全局变量
        window: 'readonly',
        document: 'readonly',
        console: 'readonly',
        alert: 'readonly',
        setTimeout: false,
        clearTimeout: false,
        setInterval: false,
        clearInterval: false,
      },
    },
    rules: {
      // 通用规则
      'no-console': 'off',
      'no-debugger': 'error',
      'no-unused-vars': 'off', // 由 TypeScript 插件处理
      'prefer-const': 'error',
      'no-var': 'error',
      // 代码风格
      indent: 'off', // 由 Prettier 处理缩进
      quotes: ['error', 'single'],
      semi: ['error', 'never'],
      // 空行规则 - 最多允许 1 个连续空行
      'no-multiple-empty-lines': ['error', { max: 1, maxEOF: 1, maxBOF: 0 }],
      'no-trailing-spaces': 'error',
      'eol-last': ['error', 'always'],
      'padded-blocks': ['error', 'never'],
      'comma-dangle': ['error', 'never'],
    },
  },

  // TypeScript 文件配置
  {
    files: ['**/*.{ts,tsx}'],
    languageOptions: {
      parser: tsparser,
      parserOptions: {
        ecmaVersion: 'latest',
        sourceType: 'module',
      },
    },
    plugins: {
      '@typescript-eslint': tseslint as any,
    },
    rules: {
      // TypeScript 特定规则
      '@typescript-eslint/no-unused-vars': 'error',
      '@typescript-eslint/no-explicit-any': 'off',
      '@typescript-eslint/explicit-function-return-type': 'off',
      '@typescript-eslint/explicit-module-boundary-types': 'off',
      'comma-dangle': ['error', 'never'],
    },
  },

  // Vue 文件配置
  {
    files: ['**/*.vue'],
    languageOptions: {
      parser: vueParser,
      parserOptions: {
        ecmaVersion: 'latest',
        sourceType: 'module',
        parser: tsparser,
        extraFileExtensions: ['.vue'],
      },
    },
    plugins: {
      vue,
      '@typescript-eslint': tseslint as any,
    },
    rules: {
      // Vue 特定规则
      'vue/no-v-html': 'off',
      'vue/multi-word-component-names': 'off',
      'vue/no-unused-vars': 'error',
      'vue/no-multiple-template-root': 'off',
      'vue/singleline-html-element-content-newline': 'off',
      'vue/max-attributes-per-line': 'off',
      'vue/html-self-closing': [
        'error',
        {
          html: {
            void: 'never',
            normal: 'always',
            component: 'always',
          },
          svg: 'always',
          math: 'always',
        },
      ],
      // TypeScript 规则在 Vue 文件中
      '@typescript-eslint/no-unused-vars': 'error',
      '@typescript-eslint/no-explicit-any': 'off',
      // 空行规则 - 最多允许 1 个连续空行
      'no-multiple-empty-lines': ['error', { max: 1, maxEOF: 1, maxBOF: 0 }],
      'no-trailing-spaces': 'error',
      'eol-last': ['error', 'always'],
      'padded-blocks': ['error', 'never'],
    },
  },

  // 忽略文件
  {
    ignores: [
      // 依赖
      'node_modules/**',
      '**/node_modules/**',
      // 构建产物
      '**/dist/**',
      // '**/build/**',
      '**/.vitepress/dist/**',
      '**/.vitepress/cache/**',
      '**/*.min.js',
      '**/*.min.css',
      // Turbo 缓存
      '**/.turbo/**',
      '.turbo/**',
      // 测试覆盖率
      'coverage/**',
      '**/coverage/**',
      // 编辑器
      '.vscode/**',
      '.idea/**',
      // 日志
      '**/*.log',
      // 锁文件
      'pnpm-lock.yaml',
      'package-lock.json',
      'yarn.lock',
      // Git
      '.git/**',
      // 临时文件
      '**/*.tmp',
      '.cache/**',
      '**/.cache/**',
    ],
  },

  // Prettier 配置 - 必须放在最后,用于关闭与 Prettier 冲突的规则
  prettierConfig,

  // 重新启用某些格式规则,让 ESLint 能够检测格式错误
  {
    files: ['**/*.{js,ts,tsx,vue}'],
    rules: {
      // 重新启用格式规则,即使 Prettier 会处理它们
      // 这样可以在编辑器中看到错误提示
      semi: ['error', 'never'],
      quotes: ['error', 'single'],
      'comma-dangle': ['error', 'always-multiline'],
      indent: 'off', // 由 Prettier 处理缩进
    },
  },
])

修改package.json

  • 新增加的lint检测
json
{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "lint:eslint": "eslint . --ext .js,.mjs,.cjs,.vue",
    "lint:eslintfix": "eslint . --ext .js,.mjs,.cjs,.vue --fix",
    "prepare": "husky install",
    "commit": "git-cz"
  }
}
  • 使用以下命令来检查和修复代码
bash

npm run lint:eslint
npm run lint:eslintfix"

提交代码的时候自动执行eslint检测并修复格式问题

  • 使用 Husky 添加一个 pre-commit 钩子:
bash

npx husky add .husky/pre-commit "npx lint-staged"
  • 执行上述命令后,会在 .husky/ 目录下生成一个 pre-commit 文件,内容如下:
bash
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged

然后测试一下

  • 修改一个文件放到缓存区.然后提交

  • 这样他就会报错 提交不成功,eslint 必须修改好了才可以

bash
npm run commit