前端工程规范-4:Git提交前代码规范检查(Husky + Lint-staged)

news2024/12/23 14:18:59

Git提交前代码规范检查

在前端项目开发中,规范git提交信息,也是经常使用的手段,如何确保团队成员都遵循ESint规则,且不会将不符合规范的代码推送到Git仓库?

在这里插入图片描述

答案是:使用带有git hooks功能的huskygit hooksgit内置的功能,它会在执行Git命令之前(或之后)进行一些其它操作。例如ESLint规则校验。husky依靠git hooks来触发EsLint规则校验,并确保团队成员提交和推送代码到git之前的代码无任何问题。

git hooks是什么?

git hooksgit在触发事件(例如:commitpushreceive)之前或之后执行的一组脚本,git hooks是git内置的功能,当在项目中使用 git init初始化git时就会自动添加git hooks,我们可以在/.git/hooks文件夹下找到每个事件的示例文件。

husky是什么?

需要注意的是,git hooks不受版本控制,即不会提交到git仓库中,我们添加到/.git/hooks文件夹中的文件只会在本地。

那么,当团队成员克隆仓库时不会自动将我们自定义的git hooks下载到本地,我们又如何确保每个团队成员都执行hooks?解决这个问题的办法就是使用husky

husky使git hooks更易于管理,因为我们不必手动编写代码,我们只需要在husky提供的配置文件中添加想要执行的命令,例如提交之前运行ESLint,除此之外的一切都由husky处理。

需要下载的插件

依赖描述
husky操作 git hooks的工具,更方便的管理 git hooks 脚本
lint-staged在提交之前进行 eslint 校验

1、husky(操作 git 钩子的工具)

安装husky

# "husky": "^9.1.6"
pnpm add --save-dev husky

husky init

pnpm exec husky init

init 命令简化了项目中的 husky 设置。它会在 .husky/ 中创建 pre-commit 脚本:

在这里插入图片描述

并更新 package.json 中的 prepare 脚本:

// package.json
{
  "scripts": {
    // ...其他代码
    "prepare": "husky"
  }
}

随后可根据你的工作流进行修改。

2、设置git hooks

husky安装完成,并配置好脚本后,我们就可以进行 git hooks 的设置。

git hooks让我们能够在git操作的特定命令发生时自动执行自定义的脚本,用来完成一些额外的事情。

而我们在git提交信息的规范中,一般常用的两个阶段是:pre-commitcommit-msg

除此以外,git hooks还有多个阶段,可以在需要的时候启用,比如以下这些:

  • pre-receive:从本地版本完成一个推送后
  • prepare-commit-msg:信息准备完成后但编辑尚未启动
  • pre-pushpush 之前执行
  • post-update:在工作区更新完成后执行
  • pre-rebase:在rebase操作之前执行

pre-commit

上面介绍中,提到husky工具会在根目录下生成 .husky 目录,保存有husky的基本配置。要想配置 git hooks,还得在这个目录下进行操作,可以采取下面两种方式。

  1. 我们可以在刚刚生产的 .husky 目录下的pre-commit文件中添加以下代码,注意无后缀名,默认生产的pre-commitpnpm test内容,将其删除改成以下内容:
pnpm run lint:eslint
  1. 使用脚本命令生成pre-commit文件及其内容:
# V9
echo "pnpm run lint:eslint" > .husky/pre-commit

该脚本执行后,将在 .husky 目录下自动生成 pre-commit 文件(如果有则覆盖),并且写入对应的脚本命令:pnpm run lint:eslint,内容与上面的第一种方式一样。

完成以上操作后,当我们执行 git commit 命令时,就会自动执行eslint命令。除了eslint,我们也可以配置其他诸如 stylelintprettier 等。

  1. 如果执行失败,如下图:

在这里插入图片描述

应该重新执行pnpm exec husky init,这个错误通常是因为 .husky/pre-commit 脚本没有正确的执行权限或者文件格式不正确导致。

  1. lint-staged

使用 husky 后,ESLint会在项目中的每个文件上都运行,这是个非常糟糕的主意。因为在未更改的代码上运行ESLint可能会导致出乎预料的错误。

对于大型项目,在每个文件上运行ESLint可能会消耗大量的时间。同样,在旧项目中消耗时间解决ESLint抛出的问题而不是研发新功能,是没意义的事。

那么,我们如何只在我们更改的代码上运行 ESLint?

答案是lint-staged。它的作用是只在当前提交中对已更改的文件运行 pre-commit hooks。并且还能对代码进行更多的设置,比如使用 prettier 格式化代码

安装

pnpm add lint-staged -D

修改pre-commit文件内容

pnpm run lint:lint-staged

在package.json文件中添加scripts脚本

"scripts": {
    //其他代码省略
    "lint:lint-staged": "lint-staged"
}

新增 lint-staged.config.cjs 文件

module.exports = {
  "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"],
  "{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": ["prettier --write--parser json"],
  "package.json": ["prettier --write"],
  "*.vue": ["eslint --fix", "prettier --write", "stylelint --fix"],
  "*.{scss,less,styl,html}": ["stylelint --fix", "prettier --write"],
  "*.md": ["prettier --write"]
};

如果仅仅只是简单配置一下lint-staged,也可以直接在package.json文件中进行配置

.cjs 文件其实就是js文件,只是更加明显的说明这是一个模块文件,并且模块声明遵循的是CommonJS的标准。因此同理,也有 .mjs 的文件,表明这个文件是遵循ESM标准(ECMAScript Modules)的模块文件。

简单图示

  1. .JS (JavaScript):

在这里插入图片描述

  1. CJS (CommonJS):

在这里插入图片描述

  1. MJS (ECMAScript Modules):

在这里插入图片描述

测试

完成了上面的所有步骤,执行命令测试

在这里插入图片描述

注意必须先git add .,否则命令会提示→ No staged files found.

git add . 之后,我们使用git commit提交,触发pre-commit钩子,看看会出现什么情况

在这里插入图片描述

git commit的时候,之前我们在.eslintrc.cjs中定义为error的项,直接帮我们定义错误,由于前面已经做过了格式化处理,所以这里只是显示了一些错误警告,图中提示代码中有2个未使用的变量,修改后:

在这里插入图片描述

按步骤执行命令,图示:

  1. git add . : 提交修改;
  2. git commit -m "🔧 build(husky): husky+git hooks初步构建完成":提交本次修改信息
  3. pnpm run lint:lint-staged:由于我们配置了huskypre-commit 会自动抓取git hookscommit命令,从而触发执行 pnpm run lint:lint-staged 命令,并且 lint-staged 会根据 lint-staged.config.cjs 文件进行文件扫描吗,暂存提交的文件通过各项扫描后就会提交到本地仓库

在这里插入图片描述

🌈🥚后续篇章讲解

也许你会发现,上图的 git commit -m "🔧 build(husky): husky+git hooks初步构建完成" —— 提交的内容信息比较规范。那么下一篇内容着重讲解 git 的提交规范。

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

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

相关文章

文心一言 VS 讯飞星火 VS chatgpt (357)-- 算法导论24.2 3题

三、上面描述的 PERT 图的公式有一点不太自然。在一个更自然的结构下,图中的结点代表要执行的工作,边代表工作之间的次序限制,即边 (u,v) 表示工作 u 必须在工作 v 之前执行。在这种结构的图中,我们将权重赋给结点&…

SQL中基本SELECT语句及常见关键字的使用(内连接,左/右连接)

这里写目录标题 SQL中基本SELECT语句的使用SQL语法简介DDL、DML、DCLSEECT SELECT常用关键词group by分组having筛选limit限定条数UION和UION ALL合并SQL执行顺序 联表查询多表查询示例特殊用法:笛卡尔积(交叉连接)等值连接vs非等值连接自连接…

ResNet18果蔬图像识别分类

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

接口隔离原则(学习笔记)

客户端不应该被迫依赖于它不使用的方法:一个类对另一个类的依赖应该建立在最小的接口上。 上面的设计我们发现他存在的问题,黑马品牌的安全门具有防盗,防水,防火的功能。现在如果我们还需要再创建一盒传智品牌的安全门&#xff0c…

王道-计网

2 采用滑动窗口机制对两个相邻结点A(发送方)和B(接收方)的通信过程进行流量控制。假定帧的序号长度为3比特,发送窗口与接收窗口的大小均为7,当A发送了编号为0、1、2、3这4个帧后,而B接收了这4个帧,但仅应答了0、1两个帧,A继续发送4、5两个帧,且这两个帧已进入B的接收…

Oracle 表空间时间点恢复

已有一个数据库全备,在PDB中恢复被drop掉的表空间 1.新建表空间 create tablespace PITR_TBS datafile /u01/app/oracle/oradata/PRODCDB/PDBPROD2/PITR_TBS01.dbf size 10m; 2.使用RMAN备份. backup as compressed backupset database INCLUDE CURRENT CONTROLFI…

秘AI模型登顶评分网站:网友猜测是F.1新作诞生?

神秘的 AI 生成模型 就在近日,有一个“幽灵模型”直接登顶了模型评测网站,直接力压近期爆火的 Flux.1 等一众模型。但奇怪的是这个名为 Blueberry 的模型却没有任何一家公司或团队出来“认领”。这件事情也引发了众多人的讨论。 疑似 Flux 团队续作 幽灵…

ADRC线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

【车载开发系列】ParaSoft单元测试环境配置(四)

【车载开发系列】ParaSoft单元测试环境配置(四) 【车载开发系列】ParaSoft单元测试环境配置(四) 【车载开发系列】ParaSoft单元测试环境配置(四)一. 如何设置过滤二. 如何设置静态扫描的规则三. 如何设置单个测试用例的超时时间四. 如何获取测试用例的数量五. 如何设置Gc…

数字图像处理:边缘检测

数字图像处理:边缘检测 笔记来源: 1.Gradient and Laplacian Filter, Difference of Gaussians (DOG) 1.1 图像一阶梯度 水平方向的一阶导数 一阶导数滤波器在实际应用中难实现的原因 图像梯度中,一阶梯度中找局部极大值就是边缘所在处&a…

2、Stable Diffusion

2、Stable Diffusion Stable Diffusion 是一种高效的文本到图像生成模型,它利用扩散模型(Diffusion Model)技术将自然语言描述转换为高质量的图像。其工作原理是通过反向扩散过程,逐渐将噪声引导到符合输入文本描述的图像上。相比…

HTB:Three[WriteUP]

使用OpenVPN连接并启动机器 1.How many TCP ports are open? 使用nmap对靶机进行扫描:nmap -sV 10.129.233.85 可见仅开启了 22、80 共2个端口 2.What is the domain of the email address provided in the "Contact" section of the website? 直接对…

探索自闭症寄宿学校:为孩子的未来铺设坚实基石

在自闭症儿童教育的广阔天地中,寄宿学校以其独特的教育模式和全方位的关怀体系,为这些特殊孩子提供了一个安全、稳定且充满爱的成长环境。这些学校不仅关注孩子们的学习与康复,更致力于培养他们独立生活的能力,为他们的未来铺设坚…

java 解析excel (网络资源)

在Java中解析Excel文件,可以使用Apache POI库。以下是一个简单的例子,展示如何使用Apache POI读取一个Excel文件(假设为.xlsx格式)的内容。 首先,确保你的项目中包含了Apache POI的依赖。如果你使用Maven,…

【muduo源码分析】「阻塞」「非阻塞」「同步」「异步」

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言何为「muduo库」安装muduo库阻塞、非阻塞、同步、异步数据准备数据准备 引言 从本篇博客开始,我会陆续发表muduo库源码分析的相关文章。感谢大家的持续关注!!…

ORM的了解

什么是ORM?为什么要用ORM?-CSDN博客 C高级编程(99)面向资源的设计思想(ORM)_c orm-CSDN博客 ORM:Object-Relational-Mapping 对象关系映射 -------------------------- 我想对数据库中的表A进行增删改…

International Journal of Metalcasting是否值得投稿?

International Journal of Metalcasting期刊如何? 投稿快不快?这是一本材料科学3区期刊,冶金工程3区期刊,是美国铸造协会(American Foundry Society)创办,Springer International Publishing出版的期刊,旨在促进金属铸造领域的…

电脑使用adb工具连接手机,全文完整教程

目录 前言 正文 前置条件 打开开发者选项 打开usb调试 连接步骤 1、保证电脑和手机在同一网络下 2、打开电脑cmd窗口。 3、在cmd窗口输入adb connect手机IP地址 4、验证 扩展 问题解决 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝…

D16【python接口自动化学习】-python基础之内置数据类型

day16 字典的常见操作(下) 学习日期:20240923 学习目标:内置数据类型--25 常见常新:字典的常见操作(下) 学习笔记: 字典的高级用法 # 字典的高级用法 # setdefaul函数 tom_mail …

CHI trans简介--Retry

总目录: CHI协议简读汇总-CSDN博客 Retry trans flow requester发送一个请求,该请求没有protocol credit(P-Credit); 也就是说,该请求不保证completer一定能够接收该trans;completer返回一个retry resp, RetryAck, 给到Requester;completer再…