git提交规范检查husky

news2024/11/14 15:21:21

一、Eslint

尤雨溪推荐的 prettierrc 配置,句尾不带分号 + 单引号。

  • 尤雨溪推荐配置:vue-next/.prettierrc

lint

lint 是最著名的 C 语言工具之一,是由贝尔实验室 SteveJohnson 于 1979 在 PCC(PortableC Compiler) 基础上开发的静态代码分析,一般由 UNIX 系统提供。

lint 被用于检查 C 程序中潜在的错误,包括(但不限于)可疑的类型组合、未使用的变量、不可达的代码以及不可移植的代码。lint 会产生一系列程序员有必要从头到尾仔细阅读的诊断信息。使用 lint 的好处是:

  1. 它可以检查出被编译器漏掉的错误;
  2. 可以关联很多文件进行错误的检查和代码分析,具有较强大灵活性

Eslint

是 Nicholas C. Zakas 在 2013 年推出了一个 Javascript 的 lint 工具,而 Javascript 也称作 ECMAScript(简称 ES),所以这个工具被叫做 ESlint。

ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码的一致性和避免错误。

Eslint 可以在运行代码前就发现一些语法错误和潜在的 bug,极大地减轻测试人员的压力,减少软件项目的除错成本。同时,Eslint 允许开发者通过 rules 定义自己的代码规范,所以非常适合用于制定团队代码规范。

Prettier 是一款代码格式化工具,用于检测代码中的格式问题,比如单行代码长度、tab 长度、空格、逗号表达式等。在功能职责上,ESlint 偏向于把控项目的代码质量,而 Prettier 更偏向于统一项目的编码风格。

Prettier

在 ESlint 推出 --fix 参数前,ESLint 并没有自动化格式代码的功能,要对一些格式问题做批量格式化只能用 Prettier 这样的工具。并且,Prettier 在代码风格的检测上比 ESlint 更全面,所以两者通常是结合在一起使用的。

Eslint 规范的区别

eslint 推荐规范ESlint Recommend

ESlint 在默认情况下是不开启任何自定义规则校验,只对错误的 ES5 语法和标准的语法错误进行检测,比如 const 这种 ES6 语法,还有莫名其妙的分号

img

当我们在项目目录下新增 eslintrc.js 文件,并写入以下内容后,将会启用 ESlint 推荐的规范:

module.exports = {
  root: true,
  extends: 'eslint:recommended',
}

在 ESlint 的推荐规范中,会有一些内置的规则,比如定义后未使用的变量将会抛出错误,使用常量作为循环条件也会抛出错误

img

ESlint 的推荐规范可以避免掉一些错误,比如上述两个错误就可以在运行前被检查到并解决,更多详细规范请参考 ESlint Recommend。

standard

standard 是基于 ESlint Recommend 衍生出来的更严格的规范。这个规范和 recommended 大概有 88 处不同,主要是 recommended 很多都是 off, standard 是 error, 比如 单行代码块两边加空格禁止使用分号结尾

下面的代码在 recommended 规范下不会报错,而在 standard 规范中会报错。

recommended 规范

image

standard 规范

image

standard 会比 recommended 更加严格,在代码风格上也做了一些限制。

airbnb

airbnb 规范是最严格的 ESlint 规范,列出下面几点比较明显的区别:

  1. 默认必须要分号,而 eslint 默认不添加分号
  2. 不能使用 for 循环,推荐使用数组自带的 API 完成遍历工作。
  3. 当你必须使用函数表达式(或传递一个匿名函数)时,使用箭头函数符号。

除了这些以外,还有更多严格的规则,可以查看 Airbnb 规范。

推荐阅读(完整指南):从项目规范(eslint + prettier)到自动化配置

ESLint 配置

https://blog.csdn.net/qq_42345108/article/details/124386056

安装及初始化

npm install eslint vue-eslint-parser eslint-plugin-vue @vue/eslint-config-standard @vue/eslint-config-typescript @typescript-eslint/eslint-plugin @typescript-eslint/parser --D

利用 npx 初始化

npx eslint --init


// 选择配置
√ How would you like to use ESLint? · style
√ What type of modules does your project use? · esm
√ Which framework does your project use? · vue
√ Does your project use TypeScript? · No / Yes
√ Where does your code run? · browser
√ How would you like to define a style for your project? · guide
√ Which style guide do you want to follow? · standard
√ What format do you want your config file to be in? · JavaScript
Checking peerDependencies of eslint-config-standard@latest

配置.eslintrc.js

...

配置 package.json 的 script 脚本

{
  "scripts": {
    "eslint": "eslint src/**/*.{js,jsx,vue,ts,tsx} --fix"
  }
}

ESLint 附带有大量的规则。你可以使用注释或配置文件修改你项目中要使用的规则。要改变一个规则设置,你必须将规则 ID 设置为下列值之一:

  • "off"0 - 关闭规则
  • "warn"1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出)
  • "error"2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)

二、VSCode 使用 Prettier 自动格式化代码

https://zhuanlan.zhihu.com/p/410587312

团队代码风格统一、一键格式化整个项目、自动格式化代码

vue 项目使用 eslint 和 prettier 规范代码

安装

npm i prettier prettier-eslint eslint-config-prettier eslint-plugin-prettier -D

新建并配置 prettier.config.js

module.exports = {
  printWidth: 100,
  semi: false, // 语句结尾不加分号
  vueIndentScriptAndStyle: true,
  singleQuote: true,
  trailingComma: 'all',
  proseWrap: 'never',
  htmlWhitespaceSensitivity: 'strict',
  endOfLine: 'auto',
}

配置 package.json 的 script 脚本

{
  "scripts": {
    "prettier": "prettier --config ./.prettierrc --write './**/*.{js,jsx,vue}'"
  }
}

三、Stylelint

安装包

npm i stylelint stylelint-scss stylelint-config-standard stylelint-config-recommended-vue stylelint-config-recommended-scss stylelint-config-recess-order -D

依赖说明

  • stylelint - Stylelint 本体
  • stylelint-config-rational-order - 对 CSS 声明进行排序
  • stylelint-config-standard -Stylelint 官方推荐规则
  • stylelint-order 使用 stylelint-config-rational-order 时依赖的模块

配置.stylelintrc.js

module.exports = {
  /* 继承公共配置 */
  extends: [
    'stylelint-config-recommended-scss',
    'stylelint-config-recess-order',
    'stylelint-config-recommended-vue',
    'stylelint-config-recommended-vue/scss',
    'stylelint-config-standard',
  ],
  /* 项目个性化的规则 */
  rules: {
    indentation: [
      4,
      {
        // 指定缩进  warning 提醒
        severity: 'warning',
      },
    ],
    'selector-pseudo-element-no-unknown': null, // deep报错
    'at-rule-no-unknown': null, // 禁止使用未知的 at 规则
    // 'selector-class-pattern': [ // 命名规范 -
    //     '^([a-z][a-z0-9]*)(-[a-z0-9]+)*$',
    //     {
    //         'message': 'Expected class selector to be kebab-case'
    //     }
    // ],
    // 'string-quotes': 'single', // 单引号
    // 'at-rule-empty-line-before': null,
    // 'at-rule-name-case': 'lower',// 指定@规则名的大小写
    // 'length-zero-no-unit': true,  // 禁止零长度的单位(可自动修复)
    // 'shorthand-property-no-redundant-values': true, // 简写属性
    // 'number-leading-zero': 'never', // 小数不带0
    // 'declaration-block-no-duplicate-properties': true, // 禁止声明快重复属性
    // 'no-descending-specificity': true, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器。
    // 'selector-max-id': 1, // 限制一个选择器中 ID 选择器的数量
    // 'max-nesting-depth': 3,
    // 'declaration-colon-space-before': 'never',// 在冒号之前禁止有空格
    // 'declaration-colon-space-after': 'always',// 在冒号之后要求有一个空格
    // 'declaration-block-semicolon-space-before':'never', // 在声明块的分号之前禁止有空白
    // 'declaration-block-trailing-semicolon':'always',//要求声明块中使用拖尾分号
    // 'declaration-block-semicolon-newline-after':'always-multi-line',
    // 'no-eol-whitespace':true, // 不允许行尾空白
  },
}

规则配置参考

官网配置:http://stylelint.cn/user-guide/rules/

  • 短横线命名(kebab-case): ^([a-z][a-z0-9]_)(-[a-z0-9]+)_$ ^([a-z][a-z0-9]*)(-[a-z0-9]+)*$
  • 小驼峰命名(lowerCamelCase): ^[a-z][a-za-z0-9]+$
  • 蛇形命名(snake*case): ^([a-z][a-z0-9]\*)(*[a-z0-9]+)\*$
  • 大驼峰命名(UpperCamelCase): ^[A-Z][a-za-z0-9]+$

package.json 配置 script 脚本

"lint:stylelint": "stylelint src/**/*.{vue,css,scss} --fix",

忽略文件.stylelintignore

# 旧的不需打包的样式库
*.min.css

# 其他类型文件
*.js
*.ts
*.tsx
*.json
*.jpg
*.png
*.eot
*.ttf
*.woff

# 测试和打包目录
/test/
/dist/

vscode 自动格式化.vscode/settings.json

"stylelint.enable": true,
// 关闭编辑器内置样式检查(避免与stylelint冲突)
"css.validate": false,
"less.validate": false,
"scss.validate": false,
"stylelint.validate": [
    "css",
    "less",
    "postcss",
    "scss",
    "vue",
    "sass"
],
"editor.codeActionsOnSave": {
    // "source.fixAll": true, // 加这句会造成多次格式化,造成style误删
    "source.fixAll.eslint": true,
    "source.fixAll.stylelint": true, // 开启stylelint自动修复
},
"[vue]": {
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true,
        "source.fixAll.stylelint": true, // 开启stylelint自动修复
    }
},

vscode 插件

在 vs-code 插件市场中搜索 Stylelint 插件

vscode 团队插件推荐

// .vscode/extensions.json
{
  "recommendations": [
    "vue.volar",
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode",
    "stylelint.vscode-stylelint",
    "mrmlnc.vscode-less",
    "OBKoro1.korofileheader" // 文件顶部注释
  ]
}

git 提交格式化

// package.json
"lint-staged": {
    "*.vue": [
        "eslint --fix",
        "stylelint --fix",
        "git add"
    ],
    "*.{scss,less,styl,html}": [
        "stylelint --fix",
        "git add"
    ],
}

踩坑

对 css 的 rgba,插件就会把 rgba 格式化成 rbg 颜色。像这样:

border: 1px solid rgba(255, 255, 255, 0.5);
格式化后
border: 1px solid rgb(255 255 255 / 50%);

这是一个比较新的css规范。sass规范还不支持

参考

https://segmentfault.com/a/1190000040917146 https://www.cnblogs.com/wangpenghui522/p/14965971.html

四、团队统一配置保存自动格式化

配置.vscode/settings.json

{
  "typescript.tsdk": "./node_modules/typescript/lib",
  "volar.tsPlugin": true,
  "volar.tsPluginStatus": false,
  "npm.packageManager": "npm",
  "editor.tabSize": 2,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "files.eol": "\n",
  "fileheader.configObj": {
    // 插件配置项
    // 头部注释 参考官网https://github.com/OBKoro1/koro1FileHeader/wiki/安装和快速上手
    "autoAdd": true, // 检测文件没有头部注释,自动添加文件头部注释
    "supportAutoLanguage": ["js", "ts"], // 设置过后只有该数组里面的文件 才会自动添加头部注释
    "colonObj": {
      "js": [" ", ": "], // .js文件 头部注释去掉: 留一个空格 函数注释保留冒号
      "ts": [" ", ": "] // .ts文件 头部注释去掉: 留一个空格 函数注释保留冒号
    },
    "createFileTime": true, // 设置为true则为文件新建时候作为date,否则注释生成时间为date
    "openFunctionParamsCheck": true, // 函数注释自动提取函数的参数
    "language": {
      // 普通后缀文件
      "js/ts": {
        "head": "/**",
        "middle": " *@",
        "end": " **/",
        "functionSymbol": {
          // 函数自定义注释符号:如果有此配置 会默认使用
          "head": "/** *****", // 统一增加几个*号
          "middle": " * @",
          "end": " */"
        }
      }
    },
    "annotationStr": {
      // 默认注释  没有匹配到注释符号的时候使用。
      "head": "/*",
      "middle": " * @",
      "end": " */",
      "use": true // 设置自定义注释可用
    }
  },
  "fileheader.cursorMode": {
    // 函数注释 ctrl+win+t
    "description": "", // 函数注释生成之后,光标移动到这里
    "param": "", // param 开启函数参数自动提取 需要将光标放在函数行或者函数上方的空白行
    "return": ""
  },
  "fileheader.customMade": {
    // 头部注释  ctrl+win+i
    "Description": "", // 文件内容描述
    // "Author": "your name", // 编辑人,写死的固定值 不从git config中获取
    // "Author": "git config user.name && git config user.email", // 同时获取用户名与邮箱
    // "Author": "git config user.email", // 仅获取邮箱
    "Author": "git config user.name", // 仅获取用户名
    "Date": "Do not edit", //时间
    "LastEditTime": "Do not edit",
    "LastEditors": "git config user.name"
  },
  "search.exclude": {
    "**/node_modules": true,
    "**/*.log": true,
    "**/*.log*": true,
    "**/bower_components": true,
    "**/dist": true,
    "**/elehukouben": true,
    "**/.git": true,
    "**/.gitignore": true,
    "**/.svn": true,
    "**/.DS_Store": true,
    "**/.idea": true,
    "**/.vscode": false,
    "**/yarn.lock": true,
    "**/tmp": true,
    "out": true,
    "dist": true,
    "node_modules": true,
    "CHANGELOG.md": true,
    "examples": true,
    "res": true,
    "screenshots": true,
    "yarn-error.log": true,
    "**/.yarn": true
  },
  "files.exclude": {
    "**/.cache": true,
    "**/.editorconfig": true,
    "**/.eslintcache": true,
    "**/bower_components": true,
    "**/.idea": true,
    "**/tmp": true,
    "**/.git": true,
    "**/.svn": true,
    "**/.hg": true,
    "**/CVS": true,
    "**/.DS_Store": true
  },
  "files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/.git/subtree-cache/**": true,
    "**/.vscode/**": true,
    "**/node_modules/**": true,
    "**/tmp/**": true,
    "**/bower_components/**": true,
    "**/dist/**": true,
    "**/yarn.lock": true
  },
  "stylelint.enable": true,
  // 关闭编辑器内置样式检查(避免与stylelint冲突)
  "css.validate": false,
  "less.validate": false,
  "scss.validate": false,
  "stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"],
  "path-intellisense.mappings": {
    "/@/": "${workspaceRoot}/src"
  },
  "[javascriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[css]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[less]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[scss]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[markdown]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true,
    "source.fixAll.stylelint": true // 开启stylelint自动修复
  },
  "[vue]": {
    "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true,
      "source.fixAll.stylelint": true // 开启stylelint自动修复
    }
  },
  "cSpell.words": [
    "windi",
    "browserslist",
    "tailwindcss",
    "esnext",
    "antv",
    "tinymce",
    "qrcode",
    "sider",
    "pinia",
    "sider",
    "nprogress",
    "INTLIFY",
    "stylelint",
    "esno",
    "vitejs",
    "sortablejs",
    "mockjs",
    "codemirror",
    "iconify",
    "commitlint",
    "vditor",
    "echarts",
    "cropperjs",
    "logicflow",
    "vueuse",
    "zxcvbn",
    "lintstagedrc",
    "brotli",
    "tailwindcss",
    "sider",
    "pnpm",
    "antd"
  ],
  "vetur.format.scriptInitialIndent": true,
  "vetur.format.styleInitialIndent": true,
  "vetur.validation.script": false
}

五、解决 prettier 和 eslint 冲突

其实就是同上配置.vscode/settings.json可以了

[解决 prettier 和 eslint 冲突详细配置

六、一键安装团队推荐的 vscode 插件

一键安装团队推荐的 vscode 插件 — 保证团队成员开发环境一致性,提升工作效率。

配置.vscode/extensions.json

在前端代码库的根目录下新增 .vscode/extensions.json文件注册插件列表,然后将文件随代码提交到 git 。如果哪位成员发现了好用的插件,直接加在 recommendations 数组中既可。入 git 的好处就是: 有记录、持续更新、都能看到。

// .vscode/extensions.json
{
  "recommendations": [
    "vue.volar",
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode",
    "stylelint.vscode-stylelint",
    "mrmlnc.vscode-less",
    "OBKoro1.korofileheader" // 文件顶部注释
  ]
}

使用

组员下载代码库后: 1. 进入 vscode 的插件视图; 2. 输入框位置输入 @recommended ; 3. 点击下载按钮一键安装

当然 vscode 也会在左下角弹窗进行提示 是否安装 推荐插件

列出本机推荐 vscode 插件

在终端执行以下命令,显示当前 vscode 安装过的插件,可以复制名字配置进.vscode/extensions.json 进行分享。

code --list-extensions

以上只是在 vscode 中保存自动格式化, 在下面介绍的 git 提交时还会做一步自动格式化,到时候无关编译器!

七、git 钩子 husky

1.安装依赖:

推荐使用 npm 安装 eslint 和 husky,因为在 windows 操作系统下, 用 yarn 安装依赖,不会触发 husky pre-commit钩子命令。

npm install husky -D

2.启动 hooks , 生成 .husky 文件夹

npx husky install

3.在 package.json 中生成 prepare 指令

npm set-script prepare "husky install"

或者手动添加

"scripts": {
    "prepare": "husky install"
}

4.执行 prepare 指令

npm run prepare

执行成功,提示

> vite-project@0.0.0 prepare
> husky install

husky - Git hooks installed

5.在.husky 中创建 commit-msg 文件,填入以下内容

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

npx --no-install commitlint --edit $1

目录结构如下

|-- .husky
    |-- _
    |   |-- .gitignore
    |   |-- husky.sh
    |-- commit-msg

八、commitlint:用于检查提交信息

1.安装依赖:

npm install --save-dev @commitlint/config-conventional@12.1.4 @commitlint/cli@12.1.4

2.配置 commitlint.config.js 文件

根目录中创建commitlint.config.js

module.exports = {
    // 继承的规则
    extends: ['@commitlint/config-conventional'],
    // 定义规则类型
    rules: {
        // type 类型定义,表示 git 提交的 type 必须在以下类型范围内
        'type-enum': [
            2,
            'always',
            [
                'feat', // 新功能 feature
                'fix', // 修复 bug
                'docs', // 文档注释
                'style', // 代码格式(不影响代码运行的变动)
                'refactor', // 重构(既不增加新功能,也不是修复bug)
                'perf', // 性能优化
                'test', // 增加测试
                'chore', // 构建过程或辅助工具的变动
                'revert', // 回退
                'build' // 打包
            ]
        ],
        // subject 大小写不做校验
        'subject-case': [0]
    }
}

3.验证测试

输入错误的示范
git commit -m 'aa'

输出结果

npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
⧗   input: aa
✖   subject may not be empty [subject-empty]type may not be empty [type-empty]

✖   found 2 problems, 0 warnings
ⓘ   Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint

husky - commit-msg hook exited with code 1 (error)
正确示范
git commit -m 'feat: 新增git提交规范检测 husky'

如果想绕过/跳过代码检查 直接提交代码

git commit -m "test" --no-verify

目前没有 lint-staged 也就是没有提交代码(git commit)自动格式化

九、提交时检测代码规范 pre-commit

ESLintPrettier 配合解决代码格式问题 的章节中,我们讲解了如何处理 本地!代码格式问题。

但是这样的一个格式处理问题,他只能够在本地进行处理,并且我们还需要 手动在 VSCode 中配置自动保存 才可以。那么这样就会存在一个问题,要是有人忘记配置这个东西了怎么办呢?他把代码写的乱七八糟的直接就提交了怎么办呢?

那么想要完成这么一个操作就需要使用 husky 配合 eslint 才可以实现。

创建 pre-commit 文件,路径为.husky/pre-commit

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

# Format and submit code according to lintstagedrc.js configuration
npm run lint:lint-staged

接下来就是:提交代码时发现格式不对,自动格式化再提交:lint-staged 自动修复格式错误

十、lint-staged 提交 commit 时自动修复格式错误

它帮我们解决如下 2 个问题

  1. 我们只修改了个别的文件,没有必要使用eslint默认检测所有的文件代码格式(虽然如Eslint之类的也有文件过滤配置,但毕竟还是对于匹配文件的全量遍历,如全量的.js文件,有时还会误格式化其他同学的代码),而lint-staged, 是一个仅仅过滤出 Git 代码暂存区文件(被 committed 的文件)的工具
  2. 默认情况下只能给我们提示出对应的错误,我们还需要手动的进行代码修改

lint-staged 可以让你当前的代码检查 只检查本次修改更新的代码,并在出现错误的时候,自动修复并且推送

安装

npm i lint-staged -D

配置package.json

lint-staged仅仅是文件过滤器,不会帮你格式化任何东西,所以没有代码规则配置文件,需要自己配置一下,如:.eslintrc.stylelintrc等,然后在package.json中引入。

"scripts": {
    "lint:lint-staged": "lint-staged"
},
"lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      // "prettier --write",
      "git add"
    ],
    "{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [
      "prettier --write--parser json"
    ],
    "package.json": [
      "prettier --write",
      "git add"
    ],
    "*.vue": [
      "eslint --fix",
      // "prettier --write",
      "stylelint --fix",
      "git add"
    ],
    "*.{scss,less,styl,html}": [
      "stylelint --fix",
      // "prettier --write",
      "git add"
    ],
    "*.md": [
      "prettier --write",
      "git add"
    ]
  }

如上配置,每次它只会在你本地 commit 之前,校验你提交的内容是否符合你本地配置的 eslint规则(校验会出现两种结果:

  1. 如果符合规则:则会提交成功。
  2. 如果不符合规则:它会自动执行 eslint --fix 尝试帮你自动修复,如果修复成功则会帮你把修复好的代码提交git add,如果失败,则会提示你错误,让你修复好这个错误之后才能允许你提交代码

TIPS:自动修正 功能只能修正部分代码风格规范,对于一些可能产生隐患的代码问题不会自动修正(例如:定义而未使用的变量)。

其他

Git 提交消息格式校验 commitizen

https://segmentfault.com/a/1190000040878824

参考

https://zhuanlan.zhihu.com/p/467335105

一键安装团队推荐的 vscode 插件

commitlint 配置参考
// “prettier --write”,
“stylelint --fix”,
“git add”
],
.{scss,less,styl,html}": [
“stylelint --fix”,
// “prettier --write”,
“git add”
],
"
.md”: [
“prettier --write”,
“git add”
]
}


如上配置,每次它只会在你本地 `commit` 之前,校验你提交的内容是否符合你本地配置的 `eslint`规则(校验会出现两种结果:

1. 如果符合规则:则会提交成功。
2. 如果不符合规则:它会自动执行 `eslint --fix` 尝试帮你自动修复,如果修复成功则会帮你把修复好的代码提交`git add`,如果失败,则会提示你错误,让你修复好这个错误之后才能允许你提交代码

> TIPS:`自动修正` 功能只能修正部分代码风格规范,对于一些可能产生隐患的代码问题不会自动修正(例如:定义而未使用的变量)。

## 其他

### Git 提交消息格式校验 commitizen

https://segmentfault.com/a/1190000040878824

### 参考

https://zhuanlan.zhihu.com/p/467335105

[一键安装团队推荐的 vscode 插件](https://segmentfault.com/a/1190000041661941)

[commitlint 配置参考](https://blog.csdn.net/huangpb123/article/details/102690412)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自己搭建远程桌面服务器-RustDesk 极简版

linux搭建RustDesk保姆间教程_rustdesk linux-CSDN博客https://blog.csdn.net/yzs2022/article/details/135136491 背景 在某公司工作,向日葵等远程办公软件均已屏蔽,无法使用(也没有明文规定不允许使用远程控制软件)&#xff0c…

2024批量下载知乎回答/文章/想法/专栏/视频/收藏夹,导出excel和pdf

之前分享过文章2024 批量下载知乎回答/文章/想法/专栏导出excel和pdf,再次更新,2024 批量下载知乎回答/文章/想法/专栏/视频导出 excel 和 pdf,今天再加上知乎收藏夹批量下载。 下载所有知乎回答以渤海小吏的号为例 https://www.zhihu.com/p…

关于SQLModel库的一些封装思路和实战,fastzdp_sqlmodel库封装过程中的一些笔记,20240817

概述 最近在对SQLModel做一些封装,本篇文章主要记录封装过程中的一些思路和实战代码。 实现or查询 原本的代码 from typing import Optional from sqlmodel import Field, SQLModel, create_engine, Session, select, or_class Hero(SQLModel, tableTrue):id: O…

【笔记】PUML语法使用

Sequence 时序图 类型:participant 1、排序 order participant NAME order NUMBER 默认是按出现定义的先后顺序排列,如下图。 【Sequence】未定义order的效果图 可以通过自定义改变,使用order关键字,将按ABC进行排序。 partici…

20 以太网帧格式及命名方法

以太网帧格式及命名方法 一、以太网帧格式及命名方法 (一)帧格式及命名标准 1.以太网帧格式 ​ 802.3 以太网帧格式 ​ 以太网帧数据的长度46-1500 ​ 以太网帧的长度64-1518 ​ 帧校验序列(FCS):从目的地址开始…

Binance 如何使用 Quickwit 构建 100PB 日志服务(Quickwit 博客)

三年前,我们开源了 Quickwit,一个面向大规模数据集的分布式搜索引擎。我们的目标很宏大:创建一种全新的全文搜索引擎,其成本效率比 Elasticsearch 高十倍,配置和管理显著更简单,并且能够扩展到 PB 级别的数…

【无标题】乐天HIQ壁挂炉使用

这里写自定义目录标题 1.按键①: 按一下,小液晶显示的温度是所设定的供暖温度; 按二下,小液晶显示的温度是所设定的生活热水温度; 按三下,小液晶显示的温度是所设定的室内温度; 如果忘记按几下的…

HCIE冲刺-----------论述解析

X园区 1.防火墙放行OSPF 2.trunk口阻塞vlan1 3.关闭VPN防环 4.ospf不通检查NSSA区域配置 5.重定向可以在三层口或二层口配置 6.vlan60在ospf的相关配置 Z园区 1.mpls不通检查lo0口配置 2.isis不通检查接口IP与lldp连接 3.确认同级RR还是备份RR 4.确认策略矩阵的访问 python 1…

测试架构师要正直诚实而非率真

目录 正直诚实的重要性 为何需要正直诚实而非仅是率真 如何实践 正直不得罪人的方式 这里是一些关键的问题,在你感觉要“绝对诚实”地表达时考虑 率真这里有若干问题要考虑: 测试架构师作为软件开发团队中的关键角色之一,需要具备多种专…

Python编码系列—Python SQL与NoSQL数据库交互:深入探索与实战应用

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

极狐GitLab 多行命令的 CI 日志管理体验的改进

极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…

Python中15个递归函数经典案例解析

文末赠免费精品编程资料~~ 递归是Python编程中一个强大的工具,它允许函数调用自身以解决复杂问题。在本文中,我们将探索15个递归函数的经典案例,从基础到进阶,帮助你理解和掌握递归编程。 1. 阶乘计算 阶乘是一个常见的递归应用…

CSP-CCF 202109-1 数组推导

一、问题描述 二、解答 初版&#xff1a; 只得了60分 #include<iostream> using namespace std; int main() {int n;cin >> n;int B[101] { 0 };int sum_max 0;int sum_min0;//以防错误“使用未初始化的局部变量”&#xff0c;建议所有变量都要初始化&#xf…

2024 Google 开发者大会,沉浸式体验AI社会公益

文章目录 一、现场打卡二、AI 社会公益三、Gemma 模型四、Gemini 模型五、Google Cloud六、现场体验七、带着问题逛展八、学习资源和活动九、结束 Happy Hour 一、现场打卡 大家好&#xff0c;我是小雨。 2024 Google 开发者大会&#xff0c;沉浸式体验AI社会公益 今天我们参加…

ERD Online即将突破 4500 用户的喜悦与展望

亲爱的朋友们&#xff1a; 大家好&#xff01; 今天&#xff0c;我怀着无比激动的心情&#xff0c;要与大家分享一个令人振奋的消息&#xff1a;我们的网站用户即将突破 4500 大关&#xff01; 这一路走来&#xff0c;充满了挑战与艰辛&#xff0c;但每一次的困难都成为了我们前…

2024新型数字政府综合解决方案(十)

新型数字政府综合解决方案融合先进的人工智能、大数据、区块链及云计算技术&#xff0c;旨在通过数据共享、智能分析与自动化处理&#xff0c;打造高效、透明、安全的政务环境&#xff0c;优化服务流程&#xff0c;提升决策科学性&#xff0c;加强信息安全&#xff0c;实现政府…

java入门-成员内部类和静态内部类的访问

&#xff08;一&#xff09;成员内部类 package InnerClass;import javax.print.attribute.standard.MediaSize;public class Outer {//2外部类中的成员private int age99;public static String a;public class Inner{//普通的成员内部类//1.1成员变量public String name;priva…

删除镜像报子镜像依赖错误

1、删除镜像报子镜像依赖错误 出现这个错误的原因是因为有其他镜像依赖需要删除的镜像。 2解决方法 2.1首先查看无法删除的镜像被哪些镜像所依赖 docker image inspect --format{{.RepoTags}} {{.Id}} {{.Parent}} $(docker image ls -q --filter since${image_id}) # ${ima…

数据结构:线性结构之顺序表、链表篇

数据结构&#xff1a;顺序表、链表篇 线性表一、顺序表&#xff08;一&#xff09;顺序表的结构定义&#xff08;二&#xff09;顺序表的功能实现1、初始化2、销毁3、扩容4、插入5、删除 &#xff08;三&#xff09;顺序表例题分析1、删除有序数组中的重复项2、合并两个有序数组…

【Hot100】LeetCode—73. 矩阵置零

目录 1- 思路开辟额外两个一维数组 2- 实现⭐53. 最大子数组和——题解思路 3- ACM 实现 原题连接&#xff1a;73. 矩阵置零 1- 思路 开辟额外两个一维数组 1- 利用额外的两个一维数组 boolean 数组空间&#xff0c;遇到 0 则将当前位置的元素设置为 true 一维 row 数组&…