husky 和 lint-staged 构建代码项目规范

目录

前言

最简单的方法

过 scripts 来解决如果检测工具多,需要多次处理

通过 husky(哈士奇)来解决容易遗忘的问题

1. 安装

2. husky init 

3. 试一试​

lint-stadge 只 lint 改动的

1. 安装

2. 修改 package.json 配置

3. 添加 npm 脚本:

4.使用 Husky 触发 lint-staged:

参考配置

总结 

附:npx 查找规则


前言

一个项目如果涉及到多人协作,由于每个人代码的书写习惯和风格不太一样,如果没有统一的规范,那就会很乱,这对代码的可维护性大大降低。

所以现代工程有个一环节就是代码风格检查(Code Linting,下面以 Lint 简称),来保障代码规范一致性

现在也有很多保障代码规范一致性,比如:ESLint、prettier、SCSSLint、JSONLint 等。比较全的可以见 github 官方的 Lint 工具列表[1]

本文不会介绍每一个工具怎么用,而是介绍怎么把这些工具串起来,构建一个代码检查的工作流。

最简单的方法

最简单的方法就是自己每次在 commit 代码之前先处理一下,以 eslint 举例:

eslint src/**/*.jsgit add .git commit -m 'feat: 一个新 feature'

这种方法有两个致命的缺点:

  1. 如果检测工具多,需要多次处理。
  2. 很容易遗忘。

过 scripts 来解决如果检测工具多,需要多次处理

scripts 就是 package.json 里的 scripts。

比如你同时需要用到 prettier 和 eslint,可以定制一个脚本,然后运行这个脚本之后再提交代码:

{"scripts": {"lint": "prettier --write & eslint src/**/*.js"}
}

然后每次提交代码前就只需要:

pm run lintgit add .git commit -m 'feat: 一个新 feature'

通过 husky(哈士奇)来解决容易遗忘的问题

虽然咱们通过 scripts 来解决检查工具多的问题,但是还有一个容易遗忘怎么解呢?

解决方案就是通过 husky,原理实际上是通过 git hooks[2] 来解决,husky 就是让 git hooks 用起来更容易的工具。

“You can use it to lint your commit messages , run tests , lint code , etc... when you commit or push. Husky supports all Git hooks[3].”

这个是 husky 官网的一句话,用来描述 husky 可以做什么。

那到底怎么解决呢?接下来介绍一下 husky 的使用方式:

1. 安装
  • 安装 husky
npm install --save-dev husky
2. husky init 
  • husky init 推荐​

    init 命令简化了项目中的 husky 设置。它会在 .husky/ 中创建 pre-commit 脚本,并更新 package.json 中的 prepare 脚本。随后可根据你的工作流进行修改。

npx husky init

执行完之后文件根目录会多一个 .husky 文件夹:

3. 试一试​

恭喜你!你已经成功地用一个命令设置了你的第一个 Git 钩子 🎉。让我们测试一下:

  • 修改 .husky/pre-commit 文件
  •  脚本会在每次提交时运行
pnpm lint

**问题:**默认进行的是全量检查,耗时问题,历史问题。

这个时候 commit 就会先自动执行 npm run lint 了,然后才会 commit。

但是这样解决了以上的问题,当项目大的时候会遇到一些问题,比如每次 lint 是整个项目的文件,文件太多导致跑的时间过久,另外如果这个 lint 是在项目后期接入的话,可能 lint 命令会报很多错误,全量去改可能会有问题。

lint-stadge 只 lint 改动的

基于上面的痛点,lint-stadge 就出现了,它的解决方案就是只检查本次提交所修改(指 git 暂存区[5]里的东西)的问题,这样每次 lint 量就比较小,而且是符合我们的需求的。

“如果不知道暂存区的需要去复习一下 git 知识,简单来说就是 git add 或者 git commit -a 的那部分代码会先放到暂存区。”

1. 安装
npm install -D lint-staged
2. 修改 package.json 配置

这段配置是 lint-staged 的配置项,它定义了当运行 lint-staged 时,对于特定文件类型应该执行哪些命令。下面是对这段配置的详细解释:

  • lint-staged: 这是 lint-staged 的配置对象,用于定义不同的文件模式和对应的命令。

  • "*.{js,ts,vue}": 这是一个 glob 模式,表示匹配所有扩展名为 .js.ts.vue 的文件。Glob 模式是一种文件路径模式,用于匹配文件系统中的文件名。

  • "eslint --fix": 这是一个命令,当 lint-staged 运行时,它会对所有匹配上述文件模式的文件执行这个命令。这里使用的是 ESLint,一个流行的 JavaScript 和 TypeScript 的代码质量和代码风格检查工具。

    • eslint 是命令本身,用于检查 JavaScript 或 TypeScript 代码中的问题。
    • --fix 是一个选项,它告诉 ESLint 尝试自动修复那些可以自动修复的问题。

当你在 Git 仓库中运行 git commit 命令时,如果 Husky 配置了 pre-commit 钩子来运行 lint-staged,那么 lint-staged 将会检查暂存区(staged)的文件。对于所有扩展名为 .js.ts.vue 的文件,它会执行 eslint --fix 命令。这将自动修复这些文件中的可修复问题,并将修复后的文件重新暂存,准备提交。

  "lint-staged": {"*.{js,ts,vue}": ["eslint --fix"]}
3. 添加 npm 脚本:

package.json 中添加你需要的 npm 脚本,

  "scripts": {"lint-staged": "lint-staged"},
4.使用 Husky 触发 lint-staged:

在完成上面的配置之后,可以手动通过 npx lint-staged 来检查暂存区里面的文件。

手动是永远不会手动的,自动的方法就是将 npx lint-staged 设置到 hook 里。

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"pnpm lint-staged

到现在我们的代码检查工作流就完成了。在 git commit 的时候就自动的回去帮我们跑检查脚本,而且还是只针对我们本次提交的代码进行检查。

参考配置

  1. 安装了插件 ESlint,开启保存自动修复
  2. 禁用了插件 Prettier,并关闭保存自动格式化
// ESlint插件 + Vscode配置 实现自动格式化修复
"editor.codeActionsOnSave": {"source.fixAll": true
},
"editor.formatOnSave": false,

.eslintrc 配置可以参考:

 rules: {'prettier/prettier': ['warn',{singleQuote: true, // 单引号semi: false, // 无分号printWidth: 80, // 每行宽度至多80字符trailingComma: 'none', // 不加对象|数组最后逗号endOfLine: 'auto' // 换行符号不限制(win mac 不一致)}],// eslint 关注于规范,如果不符合规范报错'vue/multi-word-component-names': ['warn',{ignores: ['index'] // vue组件名称多单词组成(忽略index.vue)}],'vue/no-setup-props-destructure': ['off'], // 关闭 props 解构的校验// 💡 添加未定义变量错误提示,create-vue@3.6.3 关闭,这里加上是为了支持下一个章节演示。'no-undef': 'error'}

总结 

Husky 是一个用于管理 Git 钩子的工具,它可以让你在提交代码前自动运行脚本,比如代码格式化、代码检查等。它通过在 Git 仓库的 .husky 目录下创建钩子脚本来实现这个功能。

Husky使 Git hooks 变得简单icon-default.png?t=N7T8https://typicode.github.io/husky/zh/

lint-staged 是一个运行在 Git 钩子上的 Node.js 脚本,它允许你使用 npm 脚本对暂存区的文件进行 lint 检查。它通常与 Husky 结合使用,以确保每次提交的代码都符合代码质量标准。

lint-staged - npmLint files staged by git. Latest version: 15.2.7, last published: a month ago. Start using lint-staged in your project by running `npm i lint-staged`. There are 2202 other projects in the npm registry using lint-staged.icon-default.png?t=N7T8https://www.npmjs.com/package/lint-staged

使用 Husky 和 lint-staged 的好处是,它们可以帮助你自动化代码质量检查流程,确保每次提交的代码都符合团队的编码标准。这样不仅可以减少代码审查的工作量,还可以提高代码的整体质量

附:npx 查找规则

npx 是一个命令行工具,它随同 npm(Node Package Manager)一起提供,用于执行包中的程序。npx 允许你运行本地或全局安装的包中的命令,而无需单独安装每个包的可执行文件。

以下是 npx 的一些关键特性和查找规则:

  1. 执行本地或全局包npx 首先检查当前项目中的 node_modules/.bin 目录,如果找到了要执行的命令,就会使用它。如果没有找到,它会尝试全局安装的包。

  2. 临时安装:如果你指定了一个包名但没有指定版本,npx 会临时安装该包的最新版本,然后执行它。

  3. 版本控制:如果指定了版本,npx 会根据版本号安装并执行正确的版本。

  4. 环境隔离npx 会为每个执行创建一个干净的 node_modules 目录,这意味着不同的项目可以有不同的依赖版本,而不会相互干扰。

  5. 使用 npx 执行脚本:你可以使用 npx 来运行 package.json 中定义的脚本,例如 npx my-package start

  6. 使用 npx 作为代理:你可以使用 npx 来代理全局安装的命令,例如 npx -p some-package some-command,这会先安装 some-package,然后执行 some-command

  7. 查找规则npx 首先在本地项目中查找命令,如果没有找到,它会在全局 node_modules 中查找。如果两者都没有找到,它会尝试从 npm 注册表下载并安装最新的包。

  8. 使用 --no-install:如果你不想让 npx 安装缺失的包,可以使用 --no-install 选项。

  9. 使用 --ignore-existing:如果你只想使用全局安装的包,可以使用 --ignore-existing 选项。

  10. 使用 --npm:如果你想要指定使用特定的 npm 版本,可以使用 --npm 选项。

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

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

相关文章

成为git砖家(1): author 和 committer 的区别

大家好,我是白鱼。一直对 git author 和 committer 不太了解, 今天通过 cherry-pick 的例子搞清楚了区别。 原理 例如我克隆了著名开源项目 spdlog 的源码, 根据某个历史 commit A 创建了分支, 然后 cherry-pick 了这个 commit …

卡片式组件封装demo

效果视频: 卡片组件 样式还得细调~,时间有限,主要记录一下逻辑。 html结构: 目录 父组件数据处理数据格式 父组件的全部代码 子组件数据处理props参数 样式部分三个圆点点击三圆点在对应位置显示查看弹框点击非内容部分隐藏查看…

第四章 自定义序列类

目录 5.1 序列类型的分类 容器序列 扁平序列 可变序列 不可变序列 5.2 序列的abc继承关系 5.3 序列的、和extend的区别 操作符 操作符 extend方法 5.4 实现可切片的对象 5.5 bisect管理可排序序列 深入解释 5.6 什么时候我们不该用列表 深入解释 5.7 列表推导式…

第十章 多线程、多进程和线程池编程

目录 11.1 多线程编程 什么是多线程? 创建和启动线程 线程同步 11.2 多进程编程 什么是多进程? 创建和启动进程 进程间通信 11.3 线程池和进程池 什么是线程池和进程池? 使用线程池 使用进程池 11.4 选择多线程还是多进程 适用…

vue3 vxe-grid修改currentPage,查询数据的时候,从第一页开始查询

1、当我们设置好VxeGrid.Options进行数据查询的时候,下面是可能的设置&#xff1a; const gridOptions reactive<BasicTableProps>({id: UserTable,showHeaderOverflow: false,showOverflow: true,keepSource: true,columns: userColumns,size: small,pagerConfig: {cur…

【常见开源库的二次开发】基于openssl的加密与解密——单向散列函数(四)

目录&#xff1a; 目录&#xff1a; 一、什么是单项散列函数&#xff1f; 1.1 如何验证文件是否被修改过 1.2 单项散列函数&#xff1a; 二、单向hash抗碰撞 2.1 弱抗碰撞&#xff08;Weak Collision Resistance&#xff09; 2.2 强抗碰撞&#xff08;Strong Collision Resista…

[GXYCTF2019]Ping Ping Ping1

打开靶机 结合题目名称&#xff0c;考虑是命令注入&#xff0c;试试ls 结果应该就在flag.php。尝试构造命令注入载荷。 cat flag.php 可以看到过滤了空格,用 $IFS$1替换空格 还过滤了flag&#xff0c;我们用字符拼接的方式看能否绕过,ag;cat$IFS$1fla$a.php。注意这里用分号间隔…

【光伏发电功率预测】方法综述学习笔记2《光伏发电功率超短期预测方法综述》

本文参考《光伏发电功率超短期预测方法综述》&#xff1a;https://d.wanfangdata.com.cn/periodical/ChlQZXJpb2RpY2FsQ0hJTmV3UzIwMjQwNzA0Eg5nZHlqczIwMjMwNzAyNBoIeHp4NW40YmU%3D 文章目录 摘要&#xff1a;引言1. 光伏发电功率的影响因素分析1.1传递过程中的影响因素1.1.1…

DDei在线设计器-数据格式说明

数据格式说明 DDei的所有设计数据都以文件为单位保存在一个JSON对象中。JSON对象包含了全量的页签、舞台、图层、控件的位置以及属性信息。开发人员可以存储这个JSON到服务端数据库中&#xff0c;从而轻易的实现保存功能&#xff1b;也解析这个JSON&#xff0c;将其转换成自己业…

对红酒品质进行数据分析(python)

http://t.csdnimg.cn/UWg2S 数据来源于这篇博客&#xff0c;直接下载好csv文件。 这篇内容均在VScode的jupyter notebook上完成&#xff0c;操作可以看我的另一篇博客&#xff1a;http://t.csdnimg.cn/69sDJ 一、准备工作 1. 导入数据库 #功能是可以内嵌绘图&#xff0c;并…

用了6年git,不知道cherry-pick是啥意思

背景 可能是测试开发角色原因&#xff0c;平时很少有代码冲突或多人协同的编码场景。今天有个协同项目&#xff0c;需要提交自己的代码到其它业务的代码库中&#xff0c;这个代码库是分支开发分支上线模式&#xff0c;同时会有多个同事提交代码&#xff0c;然后模块负责的同学…

常用优秀内网穿透工具(实测详细版)

文章目录 1、前言2、安装Nginx3、配置Nginx4、启动Nginx服务4.1、配置登录页面 5、内网穿透5.1、cpolar5.1.1、cpolar软件安装5.1.2、cpolar穿透 5.2、Ngrok5.2.1、Ngrok安装5.2.2、随机域名5.2.3、固定域名5.2.4、前后端服务端口 5.3、NatApp5.4、Frp5.4.1、下载Frp5.4.2、暴露…

【数学建模】——【线性规划】及其在资源优化中的应用

目录 线性规划问题的两类主要应用&#xff1a; 线性规划的数学模型的三要素&#xff1a; 线性规划的一般步骤&#xff1a; 例1&#xff1a; 人数选择 例2 &#xff1a;任务分配问题 例3: 饮食问题 线性规划模型 线性规划的模型一般可表示为 线性规划的模型标准型&…

vue2.0结合使用 el-scrollbar 和 v-for实现一个横向滚动的元素列表,并且能够自动滚动到指定元素(开箱即用)

效果图&#xff1a; 代码&#xff1a; <div class"gas-mode-item-body"><el-scrollbar style"width: 300px;height: 100%;" wrap-style"overflow-y:hidden" ref"scrollbarRef"><div style"display: flex&quo…

Python Linux环境(Centos8)安装minicoda3+jupyterlab

文章目录 安装miniconda安装python环境启动 最近服务器检查&#xff0c;我下面的服务器有漏洞&#xff0c;不得已重装了&#xff0c;正好记录下怎么从零到python写代码。 安装miniconda miniconda是anconda的精简版&#xff0c;就是管理python环境的得力助手。 # 创建一个名…

7.18 学习笔记 解决分页越界问题 及分页查询

1.解决分页越界 1.1出现的问题 于是我索性把分页去掉想是不是就可以了&#xff0c;结果发现还不行 1.2解决方法 就当我找了一两个小时抓耳挠腮时&#xff0c;万幸在csdn上找到了相关的帖子&#xff0c;在此感谢一下那位大佬。 原因是我的实体类中没有构造方法&#xff0c;那…

软考系规百天备考攻略:基础阶段的三轮强化

早在今年4-5月份的时候&#xff0c;我就曾经讲过系统规划与管理师的备考建议&#xff0c;也就是先从教程学起&#xff0c;先读教程&#xff0c;而且我也说过&#xff0c;不要迷信任何培训班或者培训视频&#xff0c;任何培训班或者培训视频都不能取代你认真读至少一遍教程&…

BIOMOD2 物种分布模拟教程

原文链接&#xff1a;BIOMOD2 物种分布模拟教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247609373&idx5&sn492e7597314a5f9e358c35e4780b275f&chksmfa826dfacdf5e4ecf8ac06bdeba5469b31650bdbefbc8fb88b79c0f332714c453a4cc058d29f&token155…

Calibration相机内参数标定

1.环境依赖 本算法采用张正友相机标定法进行实现&#xff0c;内部对其进行了封装。 环境依赖为 ubuntu20.04 opencv4.2.0 yaml-cpp yaml-cpp安装方式&#xff1a; &#xff08;1&#xff09;git clone https://github.com/jbeder/yaml-cpp.git #将yaml-cpp下载至本地 &a…

15- 微分方程

对三角函数不敏感