拜托了,追求下代码质量吧

684 阅读3分钟

前端规范配置

ESLint + Prettier + lint-staged + commitizen

背景

近期项目中,为实现代码规范统一而着手配置起ESLint。先前在个人项目中,因为方便好用,直接采用@antfu/eslint-config来配置。

// .eslintrc
{
  "extends": "@antfu",
  "rules": {
    "no-console": "off",
  }
}

ESLint配置

首先安装ESLint并初始化

pnpm add eslint -D

pnpm eslint --init

执行上述命令时,会出现以下选项:

(1) How would you like to use ESLint?
选择:To check syntax and find problems

(2) What type of modules does your project use?
选择:JavaScript modules (import/export)

(3) Which framework does your project use?
选择:Vue.js

(4) Does your project use TypeScript?
选择:Yes

(5) Where does your code run?
选择:Browser

(6) What format do you want your config file to be in?
选择:JavaScript

(7) Would you like to install them now?
选择:Yes

(8) Which package manager do you want to use?
选择:pnpm

执行完初始化命令后,会自动生成 .eslintrc 相关文件

module.exports = {
    "env": {
        "browser": true,
        "es2021": true,
        // 如果打开该文件出现报错:module is not defined 则添加以下代码
        "node": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:vue/vue3-essential",
        "plugin:@typescript-eslint/recommended"
    ],
    "overrides": [
    ],
    // pnpm install vue-eslint-parser -D 解析.vue文件
    // 如果不安装会报错:Eslint Vue 3 Parsing error: '>' expected.eslint
    "parser": "vue-eslint-parser",
    "parserOptions": {
        "ecmaVersion": "latest",
        "parser": "@typescript-eslint/parser",
        "sourceType": "module"
    },
    "plugins": [
        "vue",
        "@typescript-eslint"
    ],
    "rules": {
    }
}

设置自动保存

可以在package.json文件中的script中添加lint命令: "lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix",每执行一次命令pnpm lint 都会去做ESLint校验。但也可在保存时自动校验,在.vscode的settings.json中,添加以下代码

{
  // 开启自动修复
  "editor.codeActionsOnSave": {
      "source.fixAll": false,
      "source.fixAll.eslint": true
  },
}

安装VsCode插件ESLint

给ESLint配置rules

在rules中添加常用规则,即可实现校验功能。

参考Vue3源码中的规范配置,在ESLint的基础上需要配置prettier

prettier配置

首先安装prettier

pnpm add prettier -D

根目录下创建.prettierrc.xxx文件

关于配置,可参考官方文档:prettier.io/docs/en/opt…

module.exports = {
  semi: false,
  tabWidth: 2, 
  singleQuote: true,
  printWidth: 80,
  trailingComma: 'none',
  arrowParens: 'avoid'
};

在package.json文件的script中添加命令

    "format": "prettier --write --loglevel warn \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\""

安装VsCode插件Prettier - Code formatter

设置保存自动格式化

在.vscode的settings.json中,添加以下代码

{
   // 保存的时候自动格式化
    "editor.formatOnSave": true,
    // 格式化工具默认选择prettier
    "editor.defaultFormatter": "esbenp.prettier-vscode"
}

解决ESLint和Prettier的冲突

安装插件并添加配置

pnpm add eslint-config-prettier eslint-plugin-prettier -D

在 .eslintrc.xxx文件的extends中添加一个配置,重启后即可生效

{ 
    extends: [
    'eslint:recommended',
    'plugin:vue/vue3-essential',
    'plugin:@typescript-eslint/recommended',
+    // 新增,必须放在最后面
+    'plugin:prettier/recommended' 
  ],
}

lint-staged + husky + commitizen配置

通过上述的配置,我们实现代码格式的统一,代码总算看起来舒服多了。不再是空格不一致,单双引号混用,分号随机使用的场景了。但是,在代码提交到远程仓库时,我们都希望知晓本次提交的目的和内容是什么。因此,我们需要控制提交时commit的规范。

安装并配置lint-staged

pnpm add lint-staged -D

在package.json中配置

"lint-staged": {
  "*.{js,jsx,ts,tsx,vue}": [
    "prettier --write",
    "eslint --fix"
  ],
  "*.{html,css,less,scss,md}": [
    "prettier --write"
  ]
},

安装并配置husky

npx husky-init && npm install,执行命令后,会生成.husky文件夹。

在package.json中添加一条prepare脚本

"scripts": {
    "dev": "vite",
+   "prepare": "husky install"
  },

在提交时,执行一次检查

// .husky/pre-commit

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run lint

安装并配置commitizen规范提交

安装commitizen npm install commitizen -D

安装cz-conventional-changelog,并且初始化cz-conventional-changelog npx commitizen init cz-conventional-changelog --save-dev --save-exact

在package.json中进行配置:

"config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
},
"scripts": {
    "dev": "vite",
    "prepare": "husky install"
+   "commit":"cz"
},

安装commitlint npm i @commitlint/config-conventional @commitlint/cli -D

在根目录创建commitlint.config.js文件,配置commitlint

module.exports = {
  extends: ['@commitlint/config-conventional']
}

使用husky生成commit-msg文件 npx husky add .husky/commit-msg "npx --no-install commitlint --edit $1" 输入以上命令,自动生成以下文件信息,输入提交信息会触发commit-msg钩子

// .husky/commit-msg

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx --no-install commitlint --edit

通过上述的配置,我们便实现了代码风格的统一和commit提交格式的规范化。此时我们可以测试看看是否生效。如果生效,恭喜你完成了前端代码的规范化,冲鸭!

参考链接

juejin.cn/post/711829…

juejin.cn/post/704370…