代码规范 - 配置 ESLint & Prettier

173 阅读9分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天

ESLint简单的来说就是检查你的JS代码写的格式是否规范的一个依赖。没有代码也能运行,有了它可以保证代码更加规范、风格统一。ESLint还支持插件,第三方框架会基于ESLint写出自己的代码检查插件。比如Vue对应eslint-plugin-vue

安装 ESLint

pnpm add eslint -D

如果是 yarn

yarn add eslint --dev

注意: 如果 eslint 安装报错:

可以尝试运行以下命令:

yarn config set ignore-engines true

运行成功后再次执行 eslint 安装命令

Visual Studio Code 编辑器使用 ESLint 配置需要下载插件 ESLint 。

ESLint 配置文件

配置 ESLint:根目录下创建:.eslintrc.js文件。

module.exports = {
  // ↓默认情况下,ESLint 会在所有父级目录里寻找配置文件,一直到根目录。如果你想要你所有项目都遵循一个特定的约定时,这将会很有用,但有时候会导致意想不到的结果。为了将 ESLint 限制到一个特定的项目,在你项目根目录下的 package.json 文件或者 .eslintrc.* 文件里的 eslintConfig 字段下设置 "root": true。ESLint 一旦发现配置文件中有 "root": true,它就会停止在父级目录中寻找。
  // ↓此项是用来告诉eslint找当前配置文件不能往父级查找
  root: true,
  // ↓指定你想启用的环境
  env: {
    browser: true,
    node: true,
    es2021: true
  },
  // ↓设置解析器
  parser: "",
  // ↓解析器选项
  parserOptions: {},
  // ↓扩展项
  extends: [],
  // ↓自定义规则配置
  rules: {},
};

这里也可以使用eslintinit来初始化生成.eslintrc.js文件。如果eslint --init 报错可以使用npx eslint --init

选择自己需要的配置即可,这里简单尝试还是感觉自己创建.eslintrc.js文件更方便自定义,也更清楚每一个引入库的用途。

npx eslint --init 生成的.eslintrc.js文件

module.exports = {
    "env": {
        "browser": true,
        "es2021": true
    },
    "extends": [
        "plugin:vue/vue3-essential",
        "standard-with-typescript"
    ],
    "overrides": [
    ],
    "parserOptions": {
        "ecmaVersion": "latest",
        "sourceType": "module"
    },
    "plugins": [
        "vue"
    ],
    "rules": {
    }
}

env 预定义的环境变量

作用:提供预定义的环境变量。

因为 node 或者浏览器中的全局变量很多,如果我们一个个声明会显得繁琐,因此就需要用到 env,这是对环境定义的一组全局变量的预设。

env: {
    browser: true,
    es2021: true,  // 添加所有 ECMAScript 2021 全局变量并自动将 ecmaVersion 解析器选项设置为 12
    node: true,
},

parser 指定要使用的解析器

作用:指定要使用的解析器。vue 项目我们指定为 vue-eslint-parse 即可(需要安装对应库后面具体解释)

parser: 'vue-eslint-parser',

parserOptions 解析器配置

作用:给解析器传入一些其他的配置参数

比如检查 ts 需要的@typescript-eslint/parser就可以在这里进行配置

parserOptions: {
  parser: '@typescript-eslint/parser',
  ecmaVersion: "latest",  // 支持的es版本
  sourceType: 'module',  // 代模块类型,默认为script,我们设置为module
},

extends 使用预设配置

作用:使用预设的 lint 包

如果要我们自己去设置各个规则未免会显得繁琐,所以可以直接使用业界的最佳实践作为基础规则

extends: [
  'plugin:vue/vue3-essential',
  'plugin:vue/vue3-recommended',
  'plugin:@typescript-eslint/recommended',
  'eslint:recommended',
  '@vue/typescript/recommended',
  '@vue/prettier'
],

plugins 增强 ESlint 功能

作用:增强 ESlint 功能

比如@typescript-eslint/eslint-plugin它就是用来给 eslint 提供一些额外的适用于 ts 语法的规则,插件名中的 eslint-plugin- 可以省略:

// eslint-plugin-vue @typescript-eslint/eslint-plugin eslint-plugin-prettier的缩写
 plugins: ["vue", "@typescript-eslint", "prettier"],

rules 自定义检查规则

作用:创建自定义规则。

规则定义值:

  • off 或 0 - 关闭规则
  • warn 或 1 - 开启规则, 使用警告 程序不会退出
  • error 或 2 - 开启规则, 使用错误 程序退出

虽然我们通过 extends 引入了行业内最佳实践的一些规则,但是每个团队还是有每个团队自己的开发习惯,官方默认的方案其中有一些规则不一定符合我们的要求,所以我们可以通过 rules 添加或者修改 extends 中继承的规则。

module.exports = {
  // ...
  rules: {
    // eslint 检查 .vue 文件是否为驼峰命名
    'vue/multi-word-component-names': [
      'error',
      {
        ignores: ['Index']
      }
    ],
    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
    // ↓是否允许使用any类型
    '@typescript-eslint/no-explicit-any': 'off',
    // ↓是否允许!后缀运算符进行非null断言
    '@typescript-eslint/no-non-null-assertion': 'off',
    // ↓是否允许使用@ts-注解
    '@typescript-eslint/ban-ts-comment': 'off'
  },
};

eslint 完整配置

先贴一下完整配置,依赖插件的用途及安装后面有具体说明。

module.exports = {
  root: true,
  env: {
    browser: true,
    es2021: true, // 添加所有 ECMAScript 2021 全局变量并自动将 ecmaVersion 解析器选项设置为 12
    node: true
  },
  extends: [
    'plugin:vue/vue3-essential',
    'plugin:vue/vue3-recommended',
    'plugin:@typescript-eslint/recommended',
    'eslint:recommended',
    '@vue/typescript/recommended',
    '@vue/prettier'
  ],
  parser: 'vue-eslint-parser',
  parserOptions: {
    ecmaVersion: 'latest', // 支持的es版本
    sourceType: 'module' // 代模块类型,默认为script,我们设置为module
  },
  plugins: ['vue', '@typescript-eslint', 'prettier'],
  rules: {
    // eslint 检查 .vue 文件是否为驼峰命名
    'vue/multi-word-component-names': [
      'error',
      {
        ignores: ['Index']
      }
    ],
    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
    // ↓是否允许使用any类型
    '@typescript-eslint/no-explicit-any': 'off',
    // ↓是否允许!后缀运算符进行非null断言
    '@typescript-eslint/no-non-null-assertion': 'off',
    // ↓是否允许使用@ts-注解
    '@typescript-eslint/ban-ts-comment': 'off'
  }
}

ESLint 忽略文件

根目录下创建:.eslintignore文件。

# eslint 忽略检查 (根据项目需要自行添加)
*.sh
node_modules
*.md
*.woff
*.ttf
.vscode
.idea
dist
/public
/docs
.husky
.local
/bin
Dockerfile

vue 解析插件

ESLint 是检查 JS 代码的检测工具,默认只能检测 JS 语法,那么它怎么去检查 Vue 语法的文件呢?要完成这件事,我们就需要安装vue官方开发的 ESLint 插件eslint-plugin-vue。这样ESLint就知道该怎么检查 vue 的文件了。

ESLint 会对我们的代码进行校验,而 parser 的作用是将我们写的代码转换为 ESTree,然后 ESLint 才会对 ESTree 进行校验(js 的 parser 是 ESLint‘出厂’自带的)。

vue-eslint-parser 文档上说是 vue 的模板解析器, 强调