项目的相关规范性配置(eslint|prettier|husky|lint-staged|stylelint等)
目的: 检测代码质量和代码格式,对编辑器进行相关设置,提交的时候进行代码检查以及提交规范设置 包括: eslint、prettier、husky、lint-staged、stylelint等
一、eslint
1、eslint简介
eslint作用:它是一个js代码检测工具,主要检测以下问题:
- 未使用的变量
- 未定义的引用
- 比较时使用三等
- 禁止不必要的括号等等 通过配置eslint,可以在开发的时候在语法不正确的地方进行提示并提供建议进行修复。
2、配置
- 添加eslint依赖
shell
npm i eslint -D
# or
yarn add eslint -D
-
添加配置(可在package.json中直接配置eslintConfig项或者初始化.eslintrc.*文件来配置)
- 在package.json中配置
json"eslintConfig": { "root": true, "env": { "node": true }, "extends": [ "plugin:vue/essential", "eslint:recommended", "@vue/standard" ], "parserOptions": { "parser": "@babel/eslint-parser" }, "rules": {} }
- 初始化.eslintrc.*文件(这里初始化为js文件) 初始化文件,根据提示和自己的项目依次进行选择,选择完成后生成一个.eslintrc.js文件
shellnpx eslint --init
具体.eslintrc.js配置(这里是Vue的项目,所以会引入Vue的Plugin)
javascriptmodule.exports = { env: { browser: true, es2021: true, }, extends: ['plugin:vue/essential', 'eslint:recommended', '@vue/standard'], parserOptions: { parser: '@babel/eslint-parser', }, rules: {}, plugins: ['vue'], };
- 在package.json中添加脚本命令(一般用cli构建的项目可能已有相关命令) 以下为用vue-cli构建的项目中的lint命令
json"scripts": { "lint": "vue-cli-service lint", }
一般自定义命令如下
json"scripts": { "lint": "eslint --fix" }
执行npm run lint 或yarn run lint 可对代码进行js检查
-
配置.eslintignore文件(指定相关文件、文件夹忽略js代码检测)
node_modules
dist
.vscode -
如果在同一目录下存在多个配置文件,ESLint 将按照以下优先顺序只使用其中一个(并不会进行合并配置):
- .eslintrc.js
- .eslintrc.cjs (需要在 package.json 中指定 "type":"module")
- .eslintrc.yaml
- .eslintrc.yml
- .eslintrc.json
- package.json
3、插件与vscode设置
进行了以上eslint配置后,我们暂且做到的是可以手动去执行npx eslint lint命令去对我们的代码进行检测是否符合规范的,同时还可以使用--fix参数去手动修复。 但是试想一下,在实际代码开发的过程中,每写几行代码,就得手动执行一下这个命令,那得多麻烦呀,很显然,这不是最佳实践。 那到底如何做呢?答案就是在编辑器中引入eslint插件。
-
在vscode中使用eslint扩展插件 安装了插件之后,对相关文件可以点击右键【使用...格式化文档】,进行eslint文档格式化
-
进行vscode设置(根目录.vscode下的settings.json文件) 启用eslint格式化能力、启用自动代码修复功能
json{ // 启用 eslint 的格式化能力 "eslint.format.enable": true, // eslint 会在检查出错误时,给出对应的文档链接地址 "eslint.codeAction.showDocumentation": { "enable": true }, // 指定 eslint 生效的文件类型(尤其是 vue 文件)。 "eslint.probe": ["javascript", "typescript", "vue"], // 指定 eslint 的工作区,使每个子模块下的 .eslintignore 文件都能对当前目录生效。 "eslint.workingDirectories": [{ "mode": "auto" }], // 启用自动代码修复功能,保存时触发 eslint 和 stylelint 的自动修复。 "editor.codeActionsOnSave": { "source.fixAll": true, "source.fixAll.eslint": true } }
-
若无根目录.vscode,则进行以下操作
- 快捷键 ctr + shift + p 进入窗口,键入user,选择【preferences: open user settings】并进入用户设置页面,
- 用户设置页面 有两个Tab,分别是User和Workspace,这两个都是对VsCode进行配置的,其中User是对用户进行配置,可以理解为全局配置,在User里的配置项会对所有VsCode打开的文件有效。Workspace的配置只对当前工作目录有效,如果你改了Workspace里的配置,那么VsCode会在当前打开的目录下新建一个.vscode目录用来保存做的修改,Workspace里配置的优先级大于User里配置的优先级。
- 修改Workspace中的eslint.enable配置是的项目根目录出现.vscode文件夹
- 根据上文进行settings.json文件的配置
二、prettier
1、prettier简介
Prettier是一款纯粹的代码格式化工具 ,很显然,它的作用就是:格式化,不关系代码语法等问题。 比如常见格式化问题:
- 代码缩紧
- 单引号与双引号等等
2、配置
-
添加prettier依赖
shellnpm i prettier -D # or yarn add prettier -D
-
prettier与eslint冲突解决 由于eslint和prettier有部分规则是冲突的,但是在实际项目中,两者又都需要,那如何解决冲突的这部分问题呢?eslint因此推出了eslint-plugin-prettier 插件,也就是说把prettier做成eslint的一个插件,然后引入到eslint中,会用prettier把eslint冲突的那部分覆盖掉。但是我们整体的代码格式化使用的是eslint。
shellnpm i eslint-config-prettier eslint-plugin-prettier --save-dev # or yarn add eslint-config-prettier eslint-plugin-prettier -D
-
创建根目录 .prettierrc 配置文件 具体配置
json{ "trailingComma": "es5", "tabWidth": 2, "semi": true, "singleQuote": true }
-
修改 eslint配置
javascriptmodule.exports = { // ...省略一些配置 extends: [ // ...省略一些配置 'plugin:prettier/recommended', //关键点 ], };
-
创建根目录 .prettierignore文件 忽略一些不需要prettier检查的文件、文件夹
.yarn dist node_modules
3、插件与vscode设置
-
settings.json中添加
json{ // 设置默认格式化工具为 Prettier "editor.defaultFormatter": "esbenp.prettier-vscode" }
三、husky、commitlint
1、husky简介
规范化git commit 与git push等。 Husky是一个用于在git进程的不同阶段运行脚本的工具。 当我们提交git的时候,会触发一些钩子,我们可以在这些钩子里做一些检查,如果检查不通过那么不执行对应的提交操作, husky就是用来方便我们写钩子函数的,相关的文档可以看这个。
2、配置
-
添加husky依赖
shellnpm i husky -D # or yarn add husky -D
-
在package.json中添加【prepare】脚本
shellnpm pkg set scripts.prepare="husky install"
执行上述命令完毕后,package.json中脚本会添加如下:
json{ "scripts": { "prepare": "husky install" } }
-
执行命令初始化 .husky文件夹
shellnpm run prepare # or yarn add prepare
-
执行命令,对git提交前的钩子pre-commit进行设置
shellnpx husky add .husky/pre-commit "yarn run lint"
执行这个命令后会生成.husky/pre-commit文件,相关内容如下
bash#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" yarn run lint
上述pre-commit文件内容表示在执行git commit命令的时候,会先执行yarn run lint,这个命令通过了才会执行commit操作,否则中止commit操作。
-
执行命令,对git pre-push钩子进行设置
shellnpx husky add .husky/pre-push "yarn build"
执行这个命令后会生成.husky/pre-push文件,相关内容如下
bash#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" yarn build
上述pre-push文件内容表示在执行git push命令的时候,会先执行yarn build,这个命令通过了才会执行push操作,否则中止push操作, 通过这个设置我们可以确保推上去的代码是可构建成功的。
3、与husky结合使用的commitlint
使用commitlint可以对团队的提交信息格式进行规范化。 husky在commit-msg这个git钩子里触发commitlint校验。
-
添加相关依赖
shellnpm i -D @commitlint/config-conventional @commitlint/cli # or yarn add -D @commitlint/config-conventional @commitlint/cli
-
执行命令,对git commit-msg钩子进行设置
shellnpx husky add .husky/commit-msg 'npx --no -- commitlint --edit ${1}' # Sometimes above command doesn't work in some command interpreters # You can try other commands below to write npx --no -- commitlint --edit $1 # in the commit-msg file. npx husky add .husky/commit-msg \"npx --no -- commitlint --edit '$1'\" # or npx husky add .husky/commit-msg "npx --no -- commitlint --edit $1"
执行这个命令后会生成.husky/commit-msg文件,相关内容如下
bash#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npx --no -- commitlint --edit $1
由此,在提交代码时。会现有commitlint校验提交信息是否规范,如若不规范则会提交失败。
-
commitlint设置 一般,在添加了依赖后,其会使用默认规范设置,但为了避免遗忘提交信息的前缀,这里将这些前缀信息列举在 commitlint.config.js文件中
javascript// build: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm) // ci: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs) // docs: Documentation only changes // feat: A new feature // fix: A bug fix // perf: A code change that improves performance // refactor: A code change that neither fixes a bug nor adds a feature // style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) // test: Adding missing tests or correcting existing tests module.exports = { extends: ['@commitlint/config-conventional'], rules: { 'body-leading-blank': [1, 'always'], 'body-max-line-length': [2, 'always', 100], 'footer-leading-blank': [1, 'always'], 'footer-max-line-length': [2, 'always', 100], 'header-max-length': [2, 'always', 100], 'scope-case': [2, 'always', 'lower-case'], 'subject-case': [ 2, 'never', ['sentence-case', 'start-case', 'pascal-case', 'upper-case'], ], 'subject-empty': [2, 'never'], 'subject-full-stop': [2, 'never', '.'], 'type-case': [2, 'always', 'lower-case'], 'type-empty': [2, 'never'], 'type-enum': [ 2, 'always', [ 'build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test', 'translation', 'security', 'changeset', ], ], }, };
5、与husky结合使用的lint-staged
lint-staged 一般结合 husky 来使用,它可以让 husky 的 hook 触发的命令只作用于 git 暂存区的文件,而不会影响到其他文件。 由此可以避免当我们下载了一个库、只改了一个文件,可是commit的时候却格式化了一大堆文件。可参考这个文档
-
添加相关依赖
shellnpm i -D lint-staged # or yarn add -D lint-staged
-
在package.json中添加lint-staged相关配置
json{ "lint-staged": { "*.{js,jsx,ts,tsx}": ["eslint --fix"], "*.vue": ["eslint --fix"], "*.{html,vue,vss,sass,less}": ["prettier --write"], "package.json": ["prettier --write"], "*.md": ["prettier --write"] } }
-
修改pre-commit文件
bash#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npx lint-staged
每次在执行git commit的时候,都会先调用npx lint-staged进行检查
四、vscode编辑器的设置
-
.vscode文件夹 .vscode 文件夹是什么,里面有什么?
-
settings.json
json
// 编辑器相关设置
{
"typescript.tsdk": "node_modules/typescript/lib",
// 关闭 IDE 自带的样式验证
"css.validate": false,
"less.validate": false,
"scss.validate": false,
// 指定 stylelint 生效的文件类型(尤其是 vue 文件)。
"stylelint.validate": ["css", "scss", "postcss", "vue"],
// 启用 eslint 的格式化能力
"eslint.format.enable": true,
// eslint 会在检查出错误时,给出对应的文档链接地址
"eslint.codeAction.showDocumentation": {
"enable": true
},
// 指定 eslint 生效的文件类型(尤其是 vue 文件)。
"eslint.probe": ["javascript", "typescript", "vue"],
// 指定 eslint 的工作区,使每个子模块下的 .eslintignore 文件都能对当前目录生效。
"eslint.workingDirectories": [{ "mode": "auto" }],
// 设置默认格式化工具为 Prettier
"editor.defaultFormatter": "esbenp.prettier-vscode",
// 默认禁用自动格式化(手动格式化快捷键:Shift + Alt + F)
"editor.formatOnSave": false,
"editor.formatOnPaste": false,
// 启用自动代码修复功能,保存时触发 eslint 和 stylelint 的自动修复。
"editor.codeActionsOnSave": {
"source.fixAll": true,
"source.fixAll.eslint": true,
"source.fixAll.stylelint": true
},
// volar 可以处理 vue 文件的格式化
"[vue]": {
"editor.defaultFormatter": "Vue.volar"
},
// json、yaml 等配置文件保存时自动格式化
"[json]": {
"editor.formatOnSave": true
},
"[jsonc]": {
"editor.formatOnSave": true
},
"[yaml]": {
"editor.formatOnSave": true
},
// 行尾默认为 LF 换行符而非 CRLF
"files.eol": "\n",
// 键入 Tab 时插入空格而非 \t
"editor.insertSpaces": true,
// 缩进大小:2
"editor.tabSize": 2,
// 自动补充闭合的 HTML 标签
"html.autoClosingTags": true
}
- extensions.json
json
// 插件推荐设置
{
"recommendations": [
"vue.volar",
"vue.vscode-typescript-vue-plugin",
"esbenp.prettier-vscode",
"stylelint.vscode-stylelint",
"dbaeumer.vscode-eslint"
]
}
五、stylelint
样式规范配置
1、相关依赖插件
运行命令安装依赖,项目用的是less,故安装的是less相关的样式规范插件,具体安装的依赖 依项目而定。
shell
yarn add stylelint postcss-html stylelint-config-recommended-vue stylelint-config-standard-less stylelint-config-recess-order @stylistic/stylelint-plugin -D
- stylelint css 样式规范工具,这里用的版本为v16
- postcss 转换css代码工具
- postcss-html、stylelint-config-recommended-vue vue文件的样式规范,postcss-html识别html/vue中的标签中的样式,要求stylelint版本大于v14
- stylelint-config-standard-less less样式的规范设置 扩展自【stylelint-config-standard stylelint-config-recommended-less】插件
- stylelint-config-recess-order 样式属性顺序规则
- @stylistic/stylelint-plugin 样式代码风格规则
2、新建并配置.stylelintrc.js文件 和创建.stylelintignore文件
具体如下
javascript
// 样式代码检查规则配置文件
module.exports = {
// 继承的预设,这些预设包含了规则集插件
extends: [
// 基本 less 规则
'stylelint-config-standard-less',
// vue 规则
'stylelint-config-recommended-vue',
// 样式属性顺序规则
'stylelint-config-recess-order',
// 代码风格规则
'@stylistic/stylelint-plugin',
],
// 识别html文件中的样式
overrides: [
{
files: ['*.html', '**/*.html'],
customSyntax: 'postcss-html',
},
],
};
.stylelintignore文件
node_modules
dist
3、增加脚本运行命令,自定义开启\禁用规则集
在package.json中增加脚本运行命令
json
{
"scripts": {
"lint:style": "stylelint --fix ./**/*.{css,scss,vue,html}"
}
}
运行脚本命令检查样式
shell
yarn lint:style
根据项目以及样式报错情况,在.stylelintrc.js中自定义开启\禁用规则集,如:
javascript
module.export = {
// ...省略一些设置
rules: {
// 自定义规则集的启用 / 禁用
'no-empty-source': null, // 值为null表示禁用原规则 空样式文件不报错
'at-rule-no-unknown': null, // 引入第三方样式插件如tailwindcss不报错
'selector-class-pattern': null, // 设置第三方ui组件样式时,形如.el-radio-button__inner的类名不报错。或者可以自定义类选择器的格式
},
};
4、安装vscode stylelint插件并开启样式自动修复功能、设置提交前置样式校验
-
设置settings.json
json{ // 启用自动代码修复功能,保存时触发 eslint 和 stylelint 的自动修复。 "editor.codeActionsOnSave": { "source.fixAll": true, "source.fixAll.eslint": true, "source.fixAll.stylelint": true } }
-
提交前置样式校验 在package.json的lint-staged中给对应的文件 设置样式检查(husky中的pre-commit已设置执行lint-staged校验,故在package中添加样式校验命令即可),具体如下
json{ "lint-staged": { "src/**/*.{js,jsx,ts,tsx,vue}": ["prettier --write", "eslint --fix"], "src/**/*.{vue,scss,css,sass,less,html}": [ "stylelint --fix", // new "prettier --write" ], "package.json": ["prettier --write"], "*.md": ["prettier --write"] } }