前端项目规范最佳实践:Editorconfig、Eslint、Prettier

1,317 阅读6分钟

团队协作中,团队成员因为使用不同的IDE、相同的IDE不同的设置、代码风格不统一等原因导致项目代码混乱。为了能保持项目代码的统一,目前一种较流行的解决方案是EditorConfig + ESLint + prettier。

EditorConfig

介绍

顾名思义,这是一个编辑器配置插件,主要统一不同编辑器的代码风格的配置。举个例子:比如我们要控制一个多人维护的项目缩进统一用2个空格。那么每个人的IDE都是不同的,一种方法是几个人约定好各自配置自己的IDE,但是如果每个人又维护着多个项目,几个项目间就会相互影响。所以更好的办法是由项目本身来控制代码风格。也就是使用EditorConfig来控制。

用法

在一个文件夹下新建一个.editconfig文件,当用IDE打开一个文件时,EditorConfig插件会在打开文件的目录和其每一级父节点查找.editorconfig文件,直到找到一个配置了root = true的配置文件。

.editconfig配置文件:

root = true #不再向上查找.editorconfig

# *表示全部文件;可设置:[*.{js,py}][*.html]单独为不同的文件类型设置
# 主要就是以下6个配置
[*]
#编码
charset = utf-8 
#缩进方式
indent_style = space 
#缩进空格数
indent_size = 4
#换行符lf
end_of_line = lf
#是否删除行尾的空格
trim_trailing_whitespace = true
#是否在文件的最后插入一个空行
insert_final_newline = true

# markdown结尾空格不能删,不然完犊子了
[*.md]
trim_trailing_whitespace = false

VSCode需安装插件:EditorConfig for VS Code

ESLint

介绍

ESLint是一个在js代码检测工具,它的目的是保证代码规范的一致性和及时发现代码问题、提前避免错误发生。ESLint重点关注的是代码质量,检查代码风格并且会提示不符合风格规范的代码。除此之外ESLint也具有一部分代码格式化的功能。
比如ESLint可以检测出使用了未定义的变量、修改const变量等代码质量问题,也可以检测出单引号双引号、数组对象结尾是否有空格等风格问题。

用法

根目录下新建.eslintrc.js文件 文件内容示例:

module.exports = {
  root: true,
  env: {
    node: true
  },
  extends: ['eslint:recommended'],
  parserOptions: {
    parser: 'babel-eslint'
  }
};

VSCode需安装插件:ESLint

Prettier

介绍

Prettier是一个专注于格式化的工具。Prettier只关注格式化,并不具有lint检查语法等能力。它通过解析代码并匹配自己的一套规则,来强制执行一致的代码展示格式。

用法

根目录下新建.prettier.js文件 文件内容示例:

module.exports = {
  printWidth: 120, // 每行代码最大长度
  tabWidth: 2, //一个tab代表几个空格数,默认为80
  useTabs: false, //是否使用tab进行缩进,默认为false,表示用空格进行缩减
  semi: true, // 声明后带分号
  singleQuote: true, // 使用单引号
  jsxSingleQuote: true, // 使用单引号
  jsxBracketSameLine: true, // 启用jsx语法,> 放在末尾
  trailingComma: 'all',
};

VSCode需安装插件:Prettier - Code formatter

Prettier + EditorConfig组合

通过上述分析,其实Prettier和EditorConfig有几个配置项是一样的,如果能再同一处配置这几个配置项会更好一点。Prettier的最新版本通过解析 .editorconfig 文件来确定要使用的配置选项解决了此问题。 这些选项仅限于:

end_of_line
indent_style
indent_size/tab_width

这些配置选项将覆盖以下 Prettier 选项(如果未在 .prettierrc 中定义它们):

"endOfLine"
"useTabs"
"tabWidth"

以上配置项我们只要写在.editorconfig 文件中即可。

ESLint + Prettier组合

一般ESLint + Prettier搭配使用时必定会搭配以下两个包:eslint-config-prettiereslint-plugin-prettier

eslint-config-prettier

为了可以和 Prettier 一起使用 ESLint,办法就是 停用可能与 Prettier 冲突的所有 ESLint 规则(仅指代码格式规则)。eslint-config-prettier 包已经帮我们做了这件事。

eslint-plugin-prettier

eslint-config-prettier 包仅仅是关闭eslint关于格式化的规则,那么这时候就要分别使用eslint和prettier来检测与格式化文件,会非常的不方便和不够简洁。eslint-plugin-prettier包主要是把prettier的规则配置成为eslint的一种规则,会给出eslint提示,eslint fix时候会按照prettier的规则去格式化,这样以来只要执行eslint --fix就能同时利用eslint和prettier来修复文件了!

配置文件

module.exports = {
    root: true,
    env: {
        node: true,
    },
    extends: ['eslint:recommended', 'plugin:prettier/recommended'],
    parserOptions: {
        ecmaVersion: 6,
    },
    parser: 'babel-eslint',
};

配置其实很简单,只是在extends最后加入plugin:prettier/recommended,这玩意其实就是eslint-plugin-prettier/recommendedplugin: 其实就相当于 eslint-plugin-,搞不懂eslint整那么些个语法糖干啥),去看下eslint-plugin-prettier的源码,核心的其实就是下面这段:

{
  "extends": ["prettier"],
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error",
    "arrow-body-style": "off",
    "prefer-arrow-callback": "off"
  }
}

这样一看就清晰多了,extends里的prettier指的是用eslint-config-prettier里的rules配置项,plugins里的prettier是引用eslint-plugin-prettier插件。

Vue项目中ESLint和Prettier的实际运用

这里就以vue-cli3脚手架创建的项目为示范(这肯定是最佳实践了),选择ESLint和Prettier后会默认安装eslintprettier@vue/eslint-config-prettiereslint-plugin-prettiereslint-plugin-vue 这几个包,是不是非常熟悉?其实和我们上面的基本一样,区别就是多了个eslint-plugin-vue以及eslint-config-prettier变成了@vue/eslint-config-prettier

下面看一下默认的eslintrc.js文件

module.exports = {
  root: true,
  env: {
    node: true,
  },
  extends: ["plugin:vue/essential", "eslint:recommended", "@vue/prettier"],
  parserOptions: {
    parser: "babel-eslint",
  },
  rules: {
    "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
    "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
  },
};

主要关注extends这块,这里extends是一个数组。 第一个成员plugin:vue/essential表示的是:引入eslint-plugin-vue插件,并开启essential类别中的一系列规则,这个插件主要作用是使ESLint能识别.vue文件,并识别一些vue语法,比如v-for必须要有key,不能和v-if并存等。其实很好理解,就是为了让eslint识别vue代码。

第二个成员"eslint:recommended"表示的是:使用eslint内置的recommended配置;

第三个成员"@vue/prettier"表示的是:引入@vue/eslint-config-prettier插件,这个插件主要作用就是让ESLint按照prettier的规则去格式化代码; 可以看下@vue/eslint-config-prettier的源码:

module.exports = {
  plugins: ['prettier'],
  extends: [
    require.resolve('eslint-config-prettier'),
    require.resolve('eslint-config-prettier/vue')
  ],
  rules: {
    'prettier/prettier': 'warn'
  }
}

瞬间清楚了吧!

react项目的实践我就不写了,记得之前我用create-react-app创建的项目和上面vue-cli3创建的项目最终的原理大同小异,无非是react多了个jsx的插件,少了个vue的插件。

自动修复及格式化文件

上面说了这么多基本上已经搞懂这3个玩意是个啥怎么用了,但还差临门一脚,怎么去触发修复文件这个动作,其实很简单,使用eslint --fix命令即可,但实际中是不可能代码写的好好的来个这个命令。实际开发过程中一般有两种方式:在保存文件时或者用husky添加git hooks来强制处理。

  1. 在IDE中配置(VSCode为例)

在VSCode的.settings.json文件中添加如下配置:

// 保存时执行eslint --fix
"editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
},
// 编辑器默认格式使用prettier
"editor.defaultFormatter": "esbenp.prettier-vscode",
// 保存时格式化(调用默认格式化即prettier),这个配置主要处理一些eslint默认不处理的文件,如.css等
"editor.formatOnSave": true
  1. husky添加git hooks

通过git hooks来强制执行代码格式化,团队开发更推荐这种。
参考该篇