前端编程规约——EsLint配置

js
module.exports = {
  root: true,
  env: {
    node: true,
    browser: true
  },
  // 当规则冲突时,后面的会覆盖前面的
  extends: [
    'eslint:recommended',
    '@vue/prettier',
    'plugin:vue/vue3-recommended'
  ],
  parserOptions: {
    parser: 'babel-eslint'
  },
  rules: {
    // 当规则冲突时,此处定义的规则会覆盖继承的规则。
    'indent': ['warn', 2], // 缩进2字符
    'quotes': ['warn', 'single'], // 仅允许单引号
    'no-dupe-keys': 2, // 在创建对象字面量时不允许键重复 {a:1,a:1}
    'no-dupe-args': 2, // 函数参数不能重复
    'no-duplicate-case': 0, // switch中的case标签不能重复
    'no-func-assign': 2, // 禁止重复的函数声明
    'no-multiple-empty-lines': [1, { max: 2 }], // 空行最多不能超过2行
    'no-redeclare': 2, // 禁止重复声明变量
    'no-console': 'warn',
    'no-debugger': 'warn',
    'curly': ['error', 'all'], // 必须使用 if(){} 中的{}
    'default-case': 2, // switch语句最后必须有default
    'comma-spacing': [2, { before: false, after: true }], // 控制逗号前后的空格,前面没有,后面一个
    'comma-style': [2, 'last'], // 控制逗号在行尾出现
    'comma-dangle': [2, 'never'], // 数组和对象键值对最后一个逗号  never:不能带末尾的逗号 always:必须带末尾的逗号
    'no-spaced-func': 2, // 函数调用时 函数名与()之间不能有空格
    'no-sparse-arrays': 2, // 禁止稀疏数组, [1,,2]
    'no-undef-init': 2, // 变量初始化时不能直接给它赋值为undefined
    'no-unused-vars': 2, // 声明了变量但是没有使用检测
    'no-use-before-define': 2, // 未定义前不能使用
    'no-prototype-builtins': 0, // 防止Object.prototype直接从对象调用方法
    'no-async-promise-executor': 0, // 禁止使用异步函数作为 Promise executor
    'prettier/prettier': 'off',
    // 元素每行最多写几个属性
    'vue/max-attributes-per-line': ["error", {
      // 单行情况:3个
      "singleline": {
        "max": 3
      },
      // 多行情况: 1个
      "multiline": {
        "max": 1
      }
    }],
    'vue/singleline-html-element-content-newline': 'off',
    'vue/multi-word-component-names': 'warn', // 组件名应由多个单词组成
    'vue/html-self-closing': [
      'error',
      {
        // HTML void元素自关闭
        html: {
          void: 'always',
          normal: 'always',
          component: 'always'
        },
        svg: 'always',
        math: 'always'
      }
    ],
    // 不允许覆盖保留字
    'vue/no-reserved-keys': ['error', {
      'reserved': ['if', 'else', 'switch', 'case', 'break', 'return', 'then', 'catch', 'finally', 'for', 'white', 'continue', 'this', 'function', 'with', 'default', 'throw', 'delete', 'in', 'try', 'do', 'instranceof', 'typeof', 'const', 'let', 'var'],
      'groups': []
    }],
    'vue/no-shared-component-data': 'error', //强制data必须是一个带返回值的函数
    'vue/no-duplicate-attributes': 'error', //不允许重复的attributes
    'vue/no-template-key': 'error', // <template>不允许key属性
    'vue/no-dupe-keys': 'error', // 不允许重复的keys
    'vue/no-arrow-functions-in-watch': 'error', // 禁止在watch里使用箭头函数
    'vue/no-async-in-computed-properties': 'error', // 禁止在computed内使用异步方法
    'vue/no-mutating-props': 'warn', // 禁止从子组件对props中的变量直接赋值
    // vue文件内的选项排序
    "vue/order-in-components": ["error", {
      "order": [
        "name",
        "model",
        "components",
        ["directives", "filters"],
        ["props", "propsData"],
        ["provide", "inject"],
        "emits",
        "functional",
        "mixins",
        "data",
        "computed",
        "watch",
        "watchQuery",
        "beforeCreate",
        "setup",
        "created",
        "beforeMount",
        "mounted",
        "activated",
        "deactivated",
        "beforeUpdate",
        "updated",
        "beforeUnmount",
        "unmounted",
        "errorCaptured",
        "renderTracked",
        "renderTriggered",
        "methods",
        ["template", "render"],
        "renderError"
      ]
    }],
  }
};

文档

ESLint 英文文档

ESLint 中文文档

ESLint vue 官方插件文档