[Whole Web] 前端项目规范 -- 3. Git工作流规范(Husky + Lint-staged)

news/2025/2/11 16:05:06/文章来源:https://www.cnblogs.com/Answer1215/p/18706939

Git 流程规范配置

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

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

git hooks是什么?

git hooksgit在触发事件(例如:commit、push、receive)之前或之后执行的一组脚本,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 校验
@commitlint/cli git提交规范检验工具,对提交信息的 message 规范进行校验
@commitlint/config-conventional 基于 conventional commits 规范的配置文件
czg 交互式命令行工具生成标准化的 git commit message
cz-git 一款工程性更强,轻量级,高度自定义,标准输出格式的 commitize 适配器

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

安装husky

pnpm add husky@8.0.0 -D 

设置package.json脚本命令

npm pkg set scripts.prepare="husky install"

这个命令其实就是在package.json文件中的scripts脚本中添加脚本命令"prepare": "husky install",不想执行命令,自己手动添加脚本命令即可

运行prepare脚本命令,生成husky文件夹

运行这个命令之前,确保你的工程已经初始化git,没有的话,先运行git init命令,当然,最好也创建一下.gitignore文件

# Numerous always-ignore extensions  
*.bak  
*.patch  
*.diff  
*.err  # temp file for git conflict merging  
*.orig  
*.log  
*.rej  
*.swo  
*.swp  
*.zip  
*.vi  
*.sass-cache  
*.tmp.html  
*.dump  # OS or Editor folders  
.DS_Store  
._*  
.cache  
.project  
.settings  
.tmproj  
*.esproj  
*.sublime-project  
*.sublime-workspace  
nbproject  
thumbs.db  
*.iml  # Folders to ignore  
.hg  
.svn  
.CVS  
.idea
.next  
node_modules/  
jscoverage_lib/  
bower_components/  
dist/ 
.vscode/

运行npm脚本

npm run prepare

2、设置git hooks

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

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

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

除此以外,git hooks还有多个阶段,可以在需要的时候启用,比如以下这些:
pre-receive:从本地版本完成一个推送后
prepare-commit-msg:信息准备完成后但编辑尚未启动
pre-push:push 之前执行
post-update:在工作区更新完成后执行
pre-rebase:在rebase操作之前执行

pre-commit

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

下面的代码可以不需要运行,后面会使用lint-staged替代

1、我们可以直接在 .husky 目录下新建文件:pre-commit注意无后缀名。然后给该文件添加以下内容:

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

2、使用脚本命令生成pre-commit文件

npx husky add .husky/pre-commit "npx eslint src"

该脚本执行后,将在 .husky 目录下自动生成 pre-commit 文件,并且写入对应的脚本命令:npx eslint src,内容与上面的第一种方式一样。

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

3、lint-staged

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

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

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

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

安装

pnpm add lint-staged -D

使用脚本命令生成pre-commit文件,

npx husky add .husky/pre-commit "npm run lint:lint-staged"

如果已经生成了pre-commit文件,那么在文件中,删除其他命令,添加npm run lint:lint-staged脚本命令即可

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

//......其他代码省略
"scripts": {"dev": "vite","build": "vue-tsc && vite build","preview": "vite preview","lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src","lint:prettier": "prettier --write \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"","lint:lint-staged": "lint-staged","prepare": "husky install"
},

新增 lint-staged.config.cjs 文件

module.exports = {"*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"],"package.json": ["prettier --write"],"*.vue": ["eslint --fix", "prettier --write"],"*.md": ["prettier --write"]
};

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

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

测试一下

写了这么多配置了,我们测试一下

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

git commit的时候,之前我们在.eslintrc.cjs中定义为error的项,直接帮我们定义错误,而且帮为了做好了格式化,修复掉这个问题之后,重新执行git add .,再次git commit,这次依然提示错误:

vue自动生成的代码中有未使用的函数和变量,继续修改吧......

全部修改完成后,才会提交成功!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《DeepSeek从入门到精通》PDF免费下载

全网疯传的DeepSeek使用教程,DeepSeek:从入门到精通(104页面,资料比较全)(清华大学元宇宙文化实验室出的)全网疯传的DeepSeek使用教程 点击查看原文下载内容简介 DeepSeek:从入门到精通(104页面,资料比较全)(清华大学元宇宙文化实验室出的) 文章中提到了微博、小红书、抖…

【洛谷P3884】二叉树问题[JLOI2009]

这个主要是二叉树的大杂烩 [JLOI2009] 二叉树问题 题目描述 如下图所示的一棵二叉树的深度、宽度及结点间距离分别为:深度:\(4\) 宽度:\(4\) 结点 8 和 6 之间的距离:\(8\) 结点 7 和 6 之间的距离:\(3\)其中宽度表示二叉树上同一层最多的结点个数,节点 \(u, v\) 之间的距…

[Whole Web] 前端项目规范 - 1. 项目风格统一

项目风格统一 在前端项目中存在.vscode文件夹,文件夹下一般存在两个文件extensions.json和setting.json。作用是保持所有开发者安装了相同的插件和相同的配置,保持开发环境一致性。extensions.json 在当前项目中,需要安装哪些插件。 {"recommendations": ["V…

告别熬夜写代码!VSCode+Cline扩展插件+DeepSeek-V3大模型,让你的编程水平瞬间超越99.9%的人

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注什么是DeepSeek-V3 DeepSeek是杭州深度求索公司发布的一系列在知识类任务上表现出色的人工智能模型! …

RocketMQ实战—8.营销系统业务和方案介绍

大纲 1.电商核心交易场景的业务流程 2.电商支付后履约场景的业务流程 3.电商营销场景的业务说明 4.电商促销活动的Push推送 5.会员与推送的数据库表结构 6.营销系统的数据库表结构 7.营销系统的基础技术架构 8.XXLJob分布式调度运行原理 9.电商营销系统的工程结构 10.电商营销系…

fluid主题优化

根目录是 C:\blog, 主题目录是 C:\blog\node_modules\hexo-theme-fluid固定背景和设置透明度在根目录下新建一个 scripts 目录,里面添加一个 bg.js 的文件 const {root: siteRoot = "/"} = hexo.config; hexo.extend.injector.register("body_begin", `&l…

Arch、Hyprland实体机全安装教程

安装 内容参考 Arch WiKi Arch 提供了自动化安装脚本可以输入 archinstall 进行配置 下载 Arch 镜像 Arch 2024.12.01 镜像 验证 ISO 文件密钥 SHA256 certutil -hashfile 镜像文件. iso SHA256 # 和官网密钥对比Arch 官网下载界面 密钥在这查看 制作启动盘 进入 Rufus 官网 下…

Zsh Codex:一个革命性的 ZSH 插件

# MacOS 前言 Zsh Codex 是一个革命性的 ZSH 插件,它将人工智能的力量引入了命令行界面。 这个插件能够让你在使用 MacOS 的原生终端时,通过 AI 驱动的代码补全功能,节省大量记忆命令的时间,提高编码效率。 github地址: https://github.com/tom-doerr/zsh_codex本文我们来…

WPS/Office完美集成DeepSeek,提升工作效率的秘密武器!

大家好,今天给大家带来一款超实用的办公神器——DeepSeek!如果你还在为繁琐的文案、翻译、数据分析等任务头疼,那这篇文章绝对不容错过。今天我们要介绍的这款工具——DeepSeek,通过强大的 AI 功能,帮你在 WPS 或 Office 中实现无缝办公,不管是写文案、做策划、翻译校对,…

本地部署 DeepSeek Janus Pro 文生图大模型

Hello, 大家新年好。 在这个春节期间最火的显然是 DeepSeek 了。据不负责统计朋友圈每天给我推送关于 DeepSeek 的文章超过20篇。打开知乎跟B站也全是 DeepSeek 相关的内容。不过大部分的内容都是关于 DeepSeek R1 推理模型有多牛逼。在这里就不多说关于 R1 的废话了,因为大家…

新生赛回顾

签到 文件用Exeinfo PE打开,无壳用ida64位打开F5跳转到C语言界面,可以发现明文rc4 无壳,用ida64打开,发现为rc4加密可以直接用动调拿flag,在输入后面下断点按F9后选择动调方式再按F9进入。输入随便21位字符串,进入后双击Str也就是我们输入的数组,右击选择到Change byte …

CrackMe

[HNCTF 2022 Week1]CrackMe 题目链接:https://www.nssctf.cn/problem/2908 一个用户名对应注册码,应该将用户名输入正确 常规解法断点在strcmp 这道题就是根据这个判断得出flag 用户名为CrackMe,在动调的时候因为会先的到一个假的,在弹出错误信息后在才是正确的 详细原因看…