1.0 前言

日常开发过程,一个仓库期待的是一种代码风格,比如都是 4 个空格,都带分号,不准用 var 定义变量,那这个通过口头约定肯定是不靠谱的,所以我们希望在 vscode 里面写代码过程中不符合规范,能红色显示。在提交到仓库之前能自动格式化代码,校验代码风格是否符合规范,不符合不让提交,同时我们希望对 git commit 的 messge 做一些限制,比如 新增功能是 feat: xxxmesage,修改 bug 是 fix: xxxmessage,这样我们就能统一整个 看 message 就能知道是干什么的了,这些我们我们统一称为本地开发规范,今天我们通过一些第三方插件来实现统一本地开发规范。

2.0 Eslint

ESLint 是一个开源的 JavaScript 代码检查工具,由 Nicholas C. Zakas 于 2013 年 6 月创建。代码检查是一种静态的分析,常用于寻找有问题的模式或者代码,并且不依赖于具体的编码风格。对大多数编程语言来说都会有代码检查,一般来说编译程序会内置检查工具。— 维基百科

2.0.1 效果演示

从维基百科的定义我们可以看到 Eslint 主要是代码静态分析,检测代码是否符合风格,比如我配置了代码必须以分号结尾,不能用 var 定义变量,假设违反了就会出现一下错误:
image.png
可以看到,有这种提示和校验,那么在我们提交代码之前有个校验,还是能很好对代码质量控制的,记下来我们就讲讲安装使用。

2.0.2 安装

步骤一:安装依赖

  1. npm install eslint --save-dev

步骤二:紧接着你应该设置一个配置文件:

  1. $ ./node_modules/.bin/eslint --init

这个时候会生成一个 .eslintrc.js 配置文件,这个文件就是来配置各种规则使用的,贴一个我自己常用的规则。

  1. module.exports = {
  2. root: true,
  3. env: {
  4. browser: true,
  5. node: true,
  6. commonjs: true,
  7. es2020: true,
  8. },
  9. extends: ["eslint:recommended"],
  10. parserOptions: {
  11. ecmaVersion: 12,
  12. },
  13. rules: {
  14. "no-console": 0, // 允许 console
  15. "no-empty": "error",
  16. eqeqeq: "error",
  17. indent: ["error", 4], // 缩进宽度4个空格
  18. "comma-dangle": "off", // 允许行末逗号
  19. "no-constant-condition": "off", // 允许常量作为表达式条件
  20. "no-delete-var": "off", // 允许使用 delete
  21. "no-extend-native": "off", // 允许扩展原生对象
  22. "no-floating-decimal": "off", // 允许省去小数点前的0
  23. "no-multi-str": "off", // 允许多行字符串
  24. semi: 2, // 不使用分号
  25. "generator-star-spacing": "off", // 关闭
  26. // 最大长度 120
  27. "max-len": [
  28. "warn",
  29. {
  30. code: 120,
  31. ignoreComments: true,
  32. ignoreStrings: true,
  33. ignoreTemplateLiterals: true,
  34. ignoreUrls: true,
  35. },
  36. ],
  37. // 最大行数 500
  38. "max-lines": [
  39. "warn",
  40. {
  41. max: 500,
  42. skipBlankLines: true,
  43. skipComments: true,
  44. },
  45. ],
  46. // 要求使用 let 或 const 而不是 var
  47. "no-var": ["error"],
  48. // allow debugger during development
  49. camelcase: "off",
  50. "prefer-promise-reject-errors": "off",
  51. "node/no-deprecated-api": "off",
  52. "no-case-declarations": "off",
  53. "no-new-func": "off",
  54. "no-new": "off",
  55. "no-proto": "off",
  56. },
  57. globals: {
  58. __dirname: true,
  59. },
  60. };

这里我们主要看 rules,这里是配置各种我们想要的规则,配置好以后,我们配置一个 npm script。

  1. "scripts": {
  2. "lint": "eslint app/** --fix"
  3. },

这样我们执行下 npm run lint,控制台就会出现一些提示:
image.png
这样我们针对这些提示去修改代码就好了。
但是这里有个不好的问题的是,每次需要跑这个命令才能知道代码哪里有问题,能不能写代码的时候就提示红线提示了,这样就比较容量立马就改正了,类似下面这样:
image.png
这个时候就需要编辑器插件出手了。

2.0.3 vscode eslint 插件

上面需要的这个功能就是 eslint 插件了,安装比较简单,直接在 vscode 插件里面搜下 eslint 就好了。
image.png
安装好后,这个插件会读取 我们项目下面的 .eslintrc.js 配置文件,这样就做到了提示代码不符合规范的问题。

3.0 Prettier

3.0.1 Prettier 简介

Eslint 能把不符合 rule 的优化掉,但有些代码美化的事情,它是做不了的,比如下面这张图,我们像把左边这种代码很长的,优化成右边这种看起来比较舒服的风格,Eslint 就帮不上忙了,这个时候就需要 Prettier 上场了。
image.png
Prettier 是个一个 代码美化的工具,结合 Eslint ,代码回看起来会非常舒服。

3.0.2 Prettier 安装使用

步骤一:安装依赖

  1. npm install --save-dev prettier eslint-plugin-prettier eslint-config-prettier

步骤二: 配置Prettier

Prettier 配置有好几种方式,比如 package.json,.prettierrc.json,.prettierrc.yaml,我这里采用.prettierrc.yaml,这里需要注意的是,Prettier 的配置不要和 Eslint 冲突,比如 Prettier 配置是单引号,而Eslint 配置的双引号,这样就冲突了。

  1. singleQuote: false // 不允许单引号
  2. tabWidth: 4 // tab 键是个空格

步骤二: 结合Eslint
我们需要 对 .eslintrc.js 加以改造,增加 prettier 插件,添加 prettier/prettier 的 rule ,这样 eslint 格式化的时候,会先走 Prettier 配置格式化下代码

  1. module.exports = {
  2. root: true,
  3. env: {
  4. browser: true,
  5. node: true,
  6. commonjs: true,
  7. es2020: true,
  8. },
  9. extends: ["eslint:recommended"],
  10. plugins: ["prettier"],
  11. parserOptions: {
  12. ecmaVersion: 12,
  13. },
  14. rules: {
  15. "prettier/prettier": "error",

这样结合 Eslint 和 Prettier 我们代码风格就能得到保证了。

4.0 husky 妙用

很多时候我们希望在 git commit 之前,来做代码风格美化,eslint 格式化,但我们又不可能每次都手动执行 eslint ,这个时候我们就需要一个 hook ,在 commit 之前格式化把代码,这个工具就是 husky。

4.0.1 安装

  1. npm install husky --save

4.0.2 基本使用

使用非常简单 pacakge.json 配置下就好。

  1. "scripts": {
  2. "lint": "eslint app/** --fix"
  3. },
  4. "husky": {
  5. "hooks": {
  6. "pre-commit": "npm run lint",
  7. "post-commit": "git update-index --again"
  8. }
  9. },

这样简单配置后,就可以执行了。
配置好后,有了个新问题出现了, 假设是个大型项目,文件多,每次 commit 都执行一次,也挺耽搁时间的,有什么办法,只对我这个提交改动的代码做格式化吗?有的 这个需要 lint-staged 插件出马了。

5.0 lint-staged

lint-staged 字面含义已经很明显了, 只格式化 每次 git commit 里面 staged 的代码。

5.0.1 安装

  1. npm install lint-staged --save

5.0.2 基本使用

根路径 创建 .lintstagedrc

  1. // .lintstagedrc
  2. {
  3. "*.js": [
  4. "prettier --write",
  5. "eslint app/** --fix",
  6. ],
  7. }

package.json 改变下

  1. "husky": {
  2. "hooks": {
  3. "pre-commit": "lint-staged",
  4. "post-commit": "git update-index --again"
  5. }
  6. },

这样就完成了 提交前格式化代码的整个操作了。这样对我们代码质量有了一定把控。
**

6.0 小结

这节我们学习了,本地开发过程中,通过一些措施保证代码风格统一,代码质量统一,是非常使用的,Demo 地址