首先在根目录创建一个 .eslintrc.js

module.exports = {
  parser: '',
  parserOptions: {},
  env: {},
  plugins: [],
  extends: [],
  rules: {}
}

上面这些是最常用的配置项,一个个说

  • parser

parser 是用来将 js 转化为 AST 树的,默认 parser 为 espree,但是只能处理js这些,并不能将vue 模板语法解析成对应的AST,所以需要用另外的 parser,vue3 我们使用的是 vue-eslint-parser

{
  parser: 'vue-eslint-parser'
}

问题来了,当我们用 ts 的时候,vue-eslint-parser 是没办法解析 script 中的内容的

  • parserOptions

对于上面说的问题,在 vue 项目中的配置,我们选择在 parserOptions 中再加个 parser 配置项,处理 typescript 我们选择用 @typescript-eslint/parser

{
    parserOptions: {
      parser: "@typescript-eslint/parser",
      ecmaVersion: 6,  // ES 版本
      sourceType: 'module', // 引入方式
    }
 }
  • env

直接使用 defineProps,defineEmits 会出现 undef 的错误,如果需要将这些指令暴露到全局环境,可以配置:

env: {
    'vue/setup-compiler-macros': true
}
  • plugins,extends,rules

这三个为什么要一起讲呢,作者之前在这块绕了很久,觉得有必要做下区分

eslint 本身是用来 lint js 的,有很多预设的标准(rule)

如 semi: 'error' 表明不要分号,会报错

但是问题在于,现在的框架越来越多,jsx,typescript,vue 这些非标准的 js 语法结构该怎么定义代码规范呢,eslint 提供了接口去自定义规则,ts对应的是 eslint-plugin-vue

{
  plugins: ['vue']
}

那么这个时候,plugin中定义的规则就可以拿出来用了

{
    rules: {
       'vue/no-dupe-v-else-if': 'error',  // template 中不能出现判定条件一样的 v-else-if
    }
}

那么很多公司都会出现一些好的规则集合,发布成包,就是 extend 配置,vue 官网也有很多:plugin:vue/base,plugin:vue/vue3-recommended...

配置下

{
    extends: ['plugin:vue/vue3-recommended']
}

总结下来:

plugin 使用来自定义规则的()
extends 是plugin中的规则集合
rules 是单个规则配置
plugin 命名方式为:eslint-plugin-myplugin,extends 命名方式为:eslint-config-myconfig
plugin经常会自带一些 extend,配置为 plugin:myplugin/...
vscode 集成
安装 vscode-eslint, vscode-prettier 插件,安装 prettier, eslint-config-prettier 包

eslint-config-prettier 是用来 eslint 与 prettier 规则冲突的
最终配置

module.exports = {
  parser: 'vue-eslint-parser',
  parserOptions: {
    parser: '@typescript-eslint/parser',
    ecmaVersion: 6,
    sourceType: 'module',
  },
  env: {
    'vue/setup-compiler-macros': true,
  },
  plugins: ['vue'],
  extends: ['plugin:vue/vue3-recommended', 'prettier'],
  rules: {
    'no-unused-vars': 'error',
    'vue/no-dupe-v-else-if': 'error',
    'vue/script-setup-uses-vars': 'off',
  },
}

标签: none

添加新评论