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://www.rhkb.cn/news/376882.html

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

相关文章

缓存与分布式锁

一、缓存 1、缓存使用 为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。 适合放入缓存的数据有: 即时性、数据一致性要求不高的;访问量大且更新频率不高的数据。 在开发中,凡是放入缓存中的数据我们都…

语言主要是一种交流工具,而不是思维工具?GPT5何去何从?

引言 在人工智能领域,特别是大语言模型(LLM)的发展中,语言和思维的关系一直是一个备受关注的话题。近期,麻省理工学院(MIT)在《Nature》杂志上发表了一篇题为《Language is primarily a tool f…

【ChatGPT】深入解析Prompt提示词及如何高效使用ChatGPT

一、Prompt提示词是什么? 1.1 Prompt的定义 Prompt是人工智能领域中的一个关键概念,尤其在自然语言处理(NLP)和生成型AI模型中。简而言之,prompt是一段文本或指令,用于引导或启动AI模型的特定响应或操作。…

Linux - 基础开发工具(yum、vim、gcc、g++、make/Makefile、git)

目录 Linux软件包管理器 - yum Linux下安装软件的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式各命令汇总 vim底行模式各命令汇总 vim的简单配置 Linux编译器 - gc…

Spring-Cache 缓存

1.简介 2.SpringCache 整合 简化缓存开发 1.导入依赖 <!-- spring cache --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>2.redis 作为缓存…

Mac应用程序清理卸载工具:App Cleaner Uninstaller for Mac 中文版

App Cleaner Pro是一款Mac上非常好用的软件卸载工具&#xff0c;支持应用卸载、Widget卸载、浏览器插件卸载&#xff0c;支持拖拽卸载和列表卸载&#xff0c;能够非常干净的卸载应用&#xff0c;节省你的磁盘空间。App Cleaner Uninstaller Pro是一款深度清理和卸载的工具&…

什么是边缘计算?创造一个更快、更智慧、更互联的世界

前言 如今&#xff0c;数十亿物联网传感器广泛部署在零售商店、城市街道、仓库和医院等各种场所&#xff0c;正在生成大量数据。从这些数据中更快地获得洞察&#xff0c;意味着可以改善服务、简化运营&#xff0c;甚至挽救生命。但要做到这一点&#xff0c;企业需要实时做出决策…

Excel第30享:基于辅助列的条件求和

1、需求描述 如下图所示&#xff0c;现要统计2022年YTD&#xff08;Year To Date&#xff1a;年初至今日&#xff09;各个人员的“上班工时&#xff08;a2&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 Step1&#xff1a;确定逻辑。“从日期中提取出…

virtualbox的ubuntu默认ipv4地址为10.0.2.15的修改以及xshell和xftp的连接

virtualbox安装Ubuntu后&#xff0c;默认的地址为10.0.2.15 我们查看virtualbox的设置发现是NAT 学过计算机网络的应该了解NAT技术&#xff0c;为了安全以及缓解ip使用&#xff0c;我们留了部分私有ip地址。 私有IP地址网段如下&#xff1a; A类&#xff1a;1个A类网段&…

jenkins系列-09.jpom构建java docker harbor

本地先启动jpom server agent: /Users/jelex/Documents/work/jpom-2.10.40/server-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % sh Server.sh start/Users/jelex/Documents/work/jpom-2.10.40/agent-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % ./Agent.…

SAP PP学习笔记26 - User Status(用户状态)的实例,订单分割中的重要概念 成本收集器,Confirmation(报工)的概述

上面两章讲了生产订单的创建以及生产订单的相关内容。 SAP PP学习笔记24 - 生产订单&#xff08;制造指图&#xff09;的创建_sap 工程外注-CSDN博客 SAP PP学习笔记25 - 生产订单的状态管理(System Status(系统状态)/User Status(用户状态)),物料的可用性检查&#xff0c;生…

Nginx -Web服务器/反向代理/负载均衡

文章目录 一、web服务1.1 nginx安装1.2 配置文件1.3 Nginx处理Web机制 二、反向代理三、负载均衡3.1 分类3.2 负载相关配置文件3.3 keepalive 提高吞吐量3.4 配置浏览器缓存 附、JMeter性能测试工具 以赛促学内容,大概率感觉会使用nginx做web服务,特对nginx做总结归纳. Nginx是…

去水印小程序源码修复版-前端后端内置接口+第三方接口

去水印小程序源码&#xff0c;前端后端&#xff0c;内置接口第三方接口&#xff0c; 修复数据库账号密码错误问题&#xff0c;内置接口支持替换第三方接口&#xff0c; 文件挺全的&#xff0c;可以添加流量主代码&#xff0c;搭建需要准备一台服务器&#xff0c;备案域名和http…

react的解构赋值

我最近在用react讨生活。我的感觉&#xff0c;react开发效率不高。这当然应该是我还不熟悉react的缘故。但是&#xff0c;在阅读react代码过程中&#xff0c;其中一个容易困惑的地方是它到处充斥着的解构赋值。当然了&#xff0c;解构赋值并不是React特有的功能&#xff0c;而是…

编译x-Wrt 全过程

参考自;​​​​​​c编译教程 | All about X-Wrt 需要详细了解的小伙伴还请参看原文 ^-^ 概念&#xff1a; x-wrt&#xff08;基于openwrt深度定制的发行版本&#xff09; 编译系统: ubuntu22.04 注意&#xff1a; 特别注意的是&#xff0c;整个编译过程&#xff0c;都是用 …

JavaWeb后端学习

Web&#xff1a;全球局域网&#xff0c;万维网&#xff0c;能通过浏览器访问的网站 Maven Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建Java项目的工具 作用&#xff1a; 依赖管理&#xff1a;方便快捷的管理项目以来的资源&#xff08;jar包&#xff09;&am…

未来互联网的新篇章:深度解析Facebook的技术与战略

随着科技的飞速发展和社会的不断变迁&#xff0c;互联网作为全球信息交流的重要平台&#xff0c;正经历着前所未有的变革和演进。作为全球最大的社交媒体平台之一&#xff0c;Facebook不仅是人们沟通、分享和互动的重要场所&#xff0c;更是科技创新和数字化进程的推动者。本文…

MySQL-表的约束

文章目录 一、空属性二、默认值三、zerofill四、列描述五、主键删除主键追加主键复合主键根据主键快速索引 六、自增长last_insert_id() 七、唯一键八、外键class表&#xff08;主表&#xff09;student表&#xff08;从表&#xff09; 一、空属性 之前我们将表的机构&#xff…

【数学建模】——数学规划模型

目录 一、线性规划&#xff08;Linear Programming&#xff09; 1.1 线性规划的基本概念 1.2 线性规划的图解法 模型建立&#xff1a; 二、整数规划&#xff08;Integer Programming&#xff09; 2.1 整数规划的基本概念 2.2 整数规划的求解方法 三、非线性规划&#x…

python 怎样生成窗体

通过import tkinter导入Tkinter模块&#xff0c;没有这句下面的都不成立了。 wintkinter.Tk()&#xff0c;这句是创建windows的窗口对象&#xff0c;注意后面的Tk&#xff0c;大小写。 win.title("窗口")&#xff0c;这段是设置窗口上的标题。 另外窗口的大小你可以通…