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

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.xdnf.cn/news/1550486.html

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

相关文章

【LLM大模型】Ollama 运行 GGUF 模型

Ollama 默认直接支持很多模型,只需要简单的使用 ollama run命令,示例如下: ollama run gemma:2b就可安装、启动、使用对应模型。 通过这样方式直接支持的模型我们可以通过https://ollama.com/library 找到。 在https://huggingface.co/mod…

大端、小端区分与判断

大小端的判断是根据系统如何存储二进制数据来判断的 大端顾名思义,以数据的高位做开端的操作系统、小端也是以数据的低位做开端的操作系统 用最简单的例子: 对于数据0x01来说,高位为0低位为1,转十进制: 0x01 0 * 1…

RK3588主板PCB设计学习(五)

DDR中的一组信号线如何进行走线: 高亮这一组的焊盘,按照DDR4的走线要求,TOP层贴元器件的话从最下面的层开始走线: 先行CPU这一端把线拉出来,怎么顺怎么拉:如果在第六层拉不出来的话,在表层进行…

STM32DMA学习日记

STM32 DMA学习日记 写于2024/9/28晚 文章目录 STM32 DMA学习日记1. DMA简介2. I/O方式2.1 程序查询方式2.2 程序中断方式2.3 DMA方式 3.DMA框图4. 相关寄存器4.1 DMA中断状态寄存器(DMA_ISR)4.2 DMA中断标志清除寄存器(DMA_IFCR)…

[CSP-J 2022] 解密

题目来源:洛谷题库 [CSP-J 2022] 解密 题目描述 给定一个正整数 k k k,有 k k k 次询问,每次给定三个正整数 n i , e i , d i n_i, e_i, d_i ni​,ei​,di​,求两个正整数 p i , q i p_i, q_i pi​,qi​,使 n …

verilog实现FIR滤波系数生成(阶数,FIR滤波器类型及窗函数可调)

在以往采用 FPGA 实现的 FIR 滤波功能,滤波器系数是通过 matlab 计算生成,然后作为固定参数导入到 verilog 程序中,这尽管简单,但灵活性不足。在某些需求下(例如捕获任意给定台站信号)需要随时修改滤波器的…

【教程】57帧! Mac电脑流畅运行黑神话悟空

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 1、先安装CrossOver。网上有许多和谐版,可自行搜索。(pd虚拟机里运行黑神话估计够呛的) 2、运行CrossOver&#xf…

12、echarts 没有显示折线图

一、问题描述 echarts 没有显示折线图,但是,有数据显示: 看图表展示,y轴数据全部没有显示,直接可以判定是数据结构出问题了。 检查 series.data[] 数据结构: dataList [{"dateStr":"202…

鸿蒙开发(NEXT/API 12)【硬件(传感器开发3)】传感器服务

场景介绍 当设备需要获取传感器数据时,可以使用sensor模块,例如:通过订阅方向传感器数据感知用户设备当前的朝向,通过订阅计步传感器数据统计用户的步数等。 函数说明 名称描述OH_Sensor_GetInfos(Sensor_Info **infos, uint32…

GAMES101(作业8)

作业8 题目: 模拟绳子动画,包括基于物理的,和非物理的,应该修改的函数是:rope.cpp 中的void Rope::simulateEuler(... Rope::rope(...),,void Rope::simulateVerlet(...) 代码框架: main:负…

调试分析:[跳数度量]更改为[距离度量]后的 routing_bellmanford 算法

回顾复习2023年8月的《★修改Exata6.2源码:〔修改Bellmanford最短路径路由的衡量标准从【路由跳数】改为【“路由器节点间的物理距离”】,并动画演示〕》,VS2015调试Exata,跟踪调试修改后的[ routing_bellmanford.cpp ]源码&#…

Redis-常见数据类型(修改ing)

1. 预备知识 redis按照键值对的方式存储数据 1.1 基本全局命令 KEYS 返回所有满⾜样式(pattern)的key,⽀持如下统配样式: h?llo 匹配hello,hallo,hxlloh*llo 匹配hllo,heeeelloh[ae]llo 只匹配hallo helloh[^e]llo 匹配除hello,heee..llo以外的h[a…

Java-数据结构-Map和Set-(二)-哈希表 |ू・ω・` )

文本目录: ❄️一、哈希表: ☑ 1、概念: ☑ 2、冲突-概念: ☑ 3、冲突-避免: ☞ 1)、避免冲突-哈希函数的设计: ☞ 2)、避免冲突-负载因子调节(重点): ☑ 4、冲突-解决&…

宠物空气净化器该怎么选?希喂、美的、有哈这三款有推荐的吗?

终于要到国庆了,这可是打工人除春节外最长的假期!在外上班后,回家的次数越来越少了,这次国庆肯定要回去陪陪父母。这票是真难买啊,候补了我一个多星期才买到。本来以为最困难的问题已经解决了,又想到我家猫…

有通话质量更好的蓝牙耳机推荐吗?高品质的平价开放式耳机推荐

个人认为开放式耳机在通话方面还是表现不错的,主要有以下几个原因: 首先,在麦克风设计与配置方面: 拥有高品质麦克风硬件。优质的开放式耳机往往会配备高性能的麦克风,这些麦克风灵敏度较高,能够精准地捕捉…

情感短视频素材下载推荐

在制作热门的情感短视频时,优质的素材是不可或缺的。作为一名资深视频剪辑师,今天我将为你推荐几个可以下载高清无水印情感视频素材的网站,助你轻松找到创作灵感。 蛙学网 蛙学网是国内领先的视频素材平台,专注于情感和治愈类视频…

TypeScript是基于LLM上层研发的受益者

TypeScript优在哪里 TypeScript是一种由微软开发的开源编程语言,它是JavaScript的一个超集,添加了类型系统和一些其他特性。TypeScript的优势在于: 静态类型检查:TypeScript的最大卖点是它的静态类型系统。这允许开发者在编写代码…

11.C++程序中的常用函数

我们将程序中反复执行的代码封装到一个代码块中,这个代码块就被称为函数,它类似于数学中的函数,在C程序中,有许多由编译器定义好的函数,供大家使用。下面就简单说一下,C中常用的函数。 1.sizeof sizeof函…

AI预测福彩3D采取888=3策略+和值012路或胆码测试9月28日新模型预测第101弹

经过100多期的测试,当然有很多彩友也一直在观察我每天发的预测结果,得到了一个非常有价值的信息,那就是9码定位的命中率非常高,100多期一共只错了12次,这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xf…

Learn OpenGL In Qt之炫酷进度条

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 公众号: C学习与探索 | 个人主页: rainInSunny | 个人专栏: Learn OpenGL In Qt 文章目录 设计实现目录结构需要哪些类接口设计关键函数 实现效果Shader解析GLSL基本函数clampsmoothstep 实现分析效…