(详)Vue3 + Typescript 项目配置 eslint + prettier + husky + lint-staged

news2024/9/21 10:33:09

目录

  • 1,前言
    • 1.1,eslint 和 prettier 的关系
    • 1.2,Node.js 版本的问题
  • 1,eslint
    • 1.1,安装
    • 1.2,配置文件
    • 1.3,集成对 vue 文件的配置
    • 1.4,在 package.json 中添加命令
  • 2,prettier
    • 2.1,安装
    • 2.2,配置文件
    • 2.3,在 package.json 中添加命令
  • 3,husky + lint-staged
    • 3.1,husky 和 Git Hooks
    • 3.2,lint-staged
  • 4,其他问题
    • 4.2,husky 配置文件问题
    • 4.1,no-unused-vars 的问题

1,前言

1.1,eslint 和 prettier 的关系

prettier 是代码格式化工具,专注于代码的格式化和美化。它的主要目标是自动格式化代码,以确保代码风格的一致性。配置简单,执行速度快。

eslint 是静态代码分析工具。可以识别和报告 js 代码中的错误、潜在问题以及不符合特定编码风格的地方,通常用于确保代码质量。主要功能:

  • 错误检查;
  • 代码风格,相比较 prettier,对代码风格的检查更严格,比如是否允许声明但未使用的变量;
  • 插件系统,比如可集成针对 .vue 文件或 .tsx.jsx 文件的检查。

1.2,Node.js 版本的问题

eslint + prettier + husky + lint-staged 这4个 npm 依赖对 Node.js 的版本都有要求,需要安装适配的。

通过 这篇文章 可以确定适配本地 Node.js 版本的依赖。

下面都是以 Node.js@v16.20.2 举例:

1,eslint

1.1,安装

查看 eslint 官方文档 发现,无法使用下面的命令安装,因为默认会安装最新版本 v9.9.1,不匹配本地 Node.js 版本。

npx eslint --init
npm init @eslint/config@latest

所以手动安装版本 v8.57.0

npm i eslint@8.57.0 -D

因为要使用 Typescript 开发,所以需要安装 typescript-eslint,这里选择适配的版本 v7.2.0

npm i @typescript-eslint/eslint-plugin@7.2.0 @typescript-eslint/parser@7.2.0 -D

1.2,配置文件

新建 .eslintrc.json.eslintrc.js 文件,添加如下配置,参考官方文档的示例

{
    "root": true,
    "extends": [
        "eslint:recommended",
        "plugin:@typescript-eslint/recommended"
    ],
    "parser": "@typescript-eslint/parser",
    "parserOptions": { "project": ["./tsconfig.json"] },
    "plugins": [
        "@typescript-eslint"
    ],
    "rules": {},
    // 忽略的文件
    "ignorePatterns": ["src/**/*.test.ts", "src/frontend/generated/*"]
}

也可以将要忽略的文件放到 .eslintignore 中。另外,一般也不用 eslint 检查图片和样式。

dist

auto-imports.d.ts
components.d.ts

*.png
*.svg
*.scss
*.css

1.3,集成对 vue 文件的配置

需要添加对 .vue 文件的解析器,否则无法解析(react 同理)。这里使用 eslint-plugin-vue,eslint 检测 .vue 文件相关的问题,都可以在官网规则中找到。

npm i eslint-plugin-vue -D

同时参考官方文档,修改 .eslintrc.json 如下:

{
  "root": true,
  "plugins": ["@typescript-eslint"],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:vue/vue3-recommended"
  ],
  "parser": "vue-eslint-parser",
  "parserOptions": {
    "parser": "@typescript-eslint/parser"
  }
}

1.4,在 package.json 中添加命令

{
	"scripts": {
		"eslint": "eslint src/** --cache",
		"eslint:fix": "npm run eslint --fix",
	}
}

配置项 --cache :只检查已更改的文件。所以第一次做 eslint 检查时应去掉该选项来检查全局。
配置项 --fix :自动修复。

也可以使用配置项 --ext,指定要检查的文件扩展名,不过一般也是在 .eslintignore 中配置不检查的文件类型。

eslint src/** --ext .js, .ts

这样,关于 eslint 的配置就完成了,运行 npm run eslint 结果如下,可以看到检测出的问题。CTRL+ 鼠标左键 可以跳转对应文件。

在这里插入图片描述

而这种稍微复杂的语法,使用 npm run eslint:fix 是无法修复的,需要手动修复。

2,prettier

2.1,安装

查看 官方文档 发现,如果要集成 eslint,还需要安装 eslint-config-prettier

npm i prettier eslint-config-prettier -D

2.2,配置文件

添加配置文件 .prettierrc.js,下面是我常用的一些配置,更多配置看官方文档。

const config = {
	printWidth: 180,
	semi: true, // 使用分号
	trailingComma: "es5", // 使用尾随逗号
	arrowParens: "avoid", // 箭头函数一个参数不使用括号
	htmlWhitespaceSensitivity: "ignore", // 忽略 HTML 中的空白
	endOfLine: "crlf", // 换行符为 \r\n
	// 其他默认值
	// tabWidth: 2, // 缩进大小
	// useTabs: false,  // 使用空格代替制表符
	// singleQuote: false, // 使用单引号
	// bracketSpacing: true, // 使用空格分隔括号
	// bracketSameLine: false, // > 单独起一行
	// proseWrap: "preserve", // 纯文本不自动换行
	// singleAttributePerLine: false, // 不将单个属性放在单独的一行
	// vueIndentScriptAndStyle: false, // Vue 不缩进 script 和 style
};

export default config;

同时为了避免和 eslint 的冲突,需要使用 eslint-config-prettier 替换掉 eslint 的部分规则,修改 .eslintrc.json 添加 prettier 的配置:

{
	"extends": [
		"eslint:recommended", 
		"plugin:@typescript-eslint/recommended", 
		"plugin:vue/vue3-recommended", 
		"prettier"
	],
	// ...
}

添加忽略文件 .prettierignore,它的默认值是

**/.git
**/.svn
**/.hg
**/node_modules

注意,默认情况下 .gitignore 中的文件,也不会被格式化。

2.3,在 package.json 中添加命令

{
	"scripts": {
		"prettier": "prettier --check .",
		"prettier:fix": "prettier --write . --list-different",
		"lint": "npm run eslint && npm run prettier",
		"lint:fix": "npm run prettier:fix && npm run eslint:fix"
	}
}

. 表示项目根目录下所有文件。目标目录必须添加,否则无效
--write 表示修复。
--list-different 表示输出日志中,只展示发生变化的文件。

这样,关于 prettier 的配置就完成了,运行 npm run prettier:fix,就会检查并修复:

在这里插入图片描述

3,husky + lint-staged

目的:为了统一整个团队的代码规范,所以在 git commit 时,需要自动执行一次检查并进行格式化,无法修改的问题也要输出警告。

要实现这个能力,需要用到 Git Hookslint-staged

3.1,husky 和 Git Hooks

Git hooks 是 Git 一个功能,它们是一些在特定重要动作发生时自动执行的脚本。这些脚本被存储在 Git 仓库的 .git/hooks 目录下。Git 提供了多种类型的 hooks,例如:

  • pre-commit:在 commit 之前运行,可以用来检查代码风格、运行测试等。
  • pre-push:在 push 之前运行,可以用来检查远程状态、防止推送不符合要求的代码等。
  • post-merge:在 merge 之后运行,可以用来自动安装依赖、更新子模块等。

Husky 是一个用于管理 Git hooks 的 npm 依赖,它增强了 Git hooks 的功能,配置也比较方便。

同样安装适配本地 Node.js@16.x 的版本:

npm i husky@8.0.3 --D

初始化 husky,正常情况下可通过 npx husky init 命令实现,但它只对最新版本(v9.x)有效,所以我们手动实现。

npx husky install

会在项目根目录下生成

在这里插入图片描述

添加 pre-commit

npx husky add .husky/pre-commit 'npx lint-staged'

会在 .husky/ 目录下生成一个文件 pre-commit

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

npx lint-staged

现在我们在执行 git commit -m "xxx" 就会触发执行 pre-commit 脚本了。

另外,注意到有的 husky 写法是在 package.json 中添加配置,这个是 husky@4 版本 的做法,已经过时了。

{
  "husky": {
    "hooks": {
      "pre-commit": "xxx"
    }
  },
}

这样,husky 相关的配置就完成了。

3.2,lint-staged

目的:它允许在 Git 暂存区(staging area)中的文件上运行脚本。

这意味着可以在文件被 commit 到仓库之前,自动运行一些检查或格式化命令。比如用于代码风格一致性、代码质量或执行其他验证。

注意,只对暂存区的文件生效。

同样的,安装适配 Node.js@16.x 版本的,

npm i lint-staged@14.0.1 -D

package.json 中增加配置,

{
	"lint-staged": {
		"*.{js, ts, vue}": [
			"eslint src/** --fix",
			"prettier --write --list-different"
		],
		"*.{json,md,html,css,scss,sass}": [
			"prettier --write --list-different"
		]
	}
}

注意,这里的 prettier --write 后没有加目标目录,这是允许的。

这样,lint-staged 相关的配置就完成了。


至此,现在运行 git commit -m xxx 就会检查并尝试修复一次代码,如果有问题会 commit 失败!

4,其他问题

4.2,husky 配置文件问题

在这里插入图片描述

注意,当执行 npx husky install 时生成的文件中,是有 .gitignore 文件的,这样会导致这个 husky.sh 无法上传到远程仓库,这样其他组员拉取代码后,husky 是不会生效的。

所以记得将这个 .gitignore 文件删掉!

4.1,no-unused-vars 的问题

1,@typescript-eslint 的配置项 @typescript-eslint/no-unused-vars 用于检测声明但未使用的变量

但有一种情况比较特殊:解构赋值。常用于从一个对象中剔除一些属性:

const { id, type, ...rest } = options

在上面的例子中,idtype 之后也不会用到,也算是 no-unused-vars。所以需要特殊处理。

解决

在 typescript-eslint 官方文档 中有说明,它是继承了 eslint/no-unused-vars 的规则,其中可配置规则以忽略特定的变量

{
  "rules": {
    "@typescript-eslint/no-unused-vars": [
      "error",
      {
         // 忽略解构赋值产生的变量
        "ignoreRestSiblings": true
      }
    ]
  }
}

以上。

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

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

相关文章

【代码随想录训练营第42期 Day52打卡 - 岛屿问题2

目录 一、做题心得 二、题目与题解 题目一:卡码网 101. 孤岛的总面积 题目链接 题解:DFS 题目二:卡码网 102. 沉没孤岛 题目链接 题解:DFS 三、小结 一、做题心得 今天做题时间比较晚了,只打卡完成了岛屿问题…

条件生成模型 (conditional generation)

我们之前讲的 GAN 中的生 成器,它没有输入任何的条件,它只是输入一个随机的分布,然后产生出来一张图片。我们现 在想要更进一步的是希望可以操控生成器的输出,我们给它一个条件x,让他根据条件x跟 输入z 来产生输出y。那…

硬件-经典开机电路

文章目录 一:网友公司祖传的开机电路二:电路符号名称三:电路原理分析道友:对于利益相关的人,要展示你的实力和智力。对于利益不相关的人,展示你的礼貌就好。 一:网友公司祖传的开机电路 业务逻辑…

【二】TDEngine快速入门

TDEngine快速入门 目录 TDEngine深入理解 概述 一、核心概念解析 二、基本操作 三、可视化管理工具 总结 概述 TDEngine创始人在官方出品的书籍中写到:我观察到,无论是出行行业还是更广义的运输行业,以及分布式能源系统,都将…

【网络安全 | 渗透工具】Cencys+Shodan使用教程

原创文章,不得转载。 文章目录 Cencys准备语法全文搜索字段和值搜索通配符搜索布尔逻辑搜索嵌套搜索时间相关搜索范围搜索双引号 (")转义序列和保留字符Censys 搜索语言中的主机查询查看主机搜索结果Censys 搜索语言中的证书查询查看证书搜索结果生成报告其余Shodan准备使…

解决MongoDB创建用户报错command createUser requires authentication

1、执行创建用户报错如下: 2、解决方法 2.1 关闭 MongoDB /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongod.conf --shutdown 2.2 修改配置文件 vim /usr/local/mongodb/mongod.conf 将security.authorization值从enabled改为disabled 2.3 启动MongoD…

HTML/CSS/JS学习笔记 Day2(HTML--标签 上)

跟着该视频学习,记录笔记:【黑马程序员pink老师前端入门教程,零基础必看的h5(html5)css3移动端前端视频教程】https://www.bilibili.com/video/BV14J4114768?p12&vd_source04ee94ad3f2168d7d5252c857a2bf358 Day2 内容梳理:…

redission中的锁分类

redis 分布式锁的核心命令 redis分布式锁的实现主要是依靠setnx和expire两个命令完成。 注意:由于setnx和expire是两个命令,会存在如果 setnx 是成功的,但是 expire 设置失败,一旦出现了释放锁失败,或 者没有手工释放…

用华为智驾,开启MPV的下半场

作者 |老缅 编辑 |德新 8月28日,岚图正式对外公布了全球首款搭载华为乾崑智驾和鸿蒙座舱的MPV——全新岚图梦想家。 新车定位「全景豪华科技旗舰MPV」,全系标配四驱,分为四驱鲲鹏版和四驱乾崑版。 其中岚图逍遥座舱和鲲鹏智驾构成的鲲鹏版…

yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距

可实现对图片,视频,摄像头的检测 项目概述 本项目旨在实现一个集成了YOLOv5目标检测算法、图形用户界面(GUI)以及单目测距功能的系统。该系统能够对图片、视频或实时摄像头输入进行目标检测,并估算目标的距离。通过…

【Java】基于JWT+Token实现完整登入功能(实操)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 认识依赖4.2 使用JWT4.3 登入实现4.4 配置拦截器4.5 获取数据 五、总结&…

Unity数据持久化 之 使用Excel.DLL读写Excel表格

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ 终于找到一个比较方便容易读表的方式了,以前用json读写excel转的cvs格式文件我怎么使用怎么别扭&#xf…

合宙4G模组Air780EX——产品规格书

Air780EX 是合宙通信推出的LTE Cat.1 bis通信模块; Air780EX采用移芯EC618平台,支持LTE 3GPP Rel.13 技术; Air780EX 是4G全网通模块,可适应不同的运营商和产品,确保产品设计的最大灵活性。 其主要特点和优势可以总…

(一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别

🍂1、不说废话,现象展示 🍃图片识别 🍃视频识别 自己训练样本 十分简易快速 opencv级联ha

个股场外期权怎么交易?场外期权交易流程是怎样的?

今天带你了解个股场外期权怎么交易?场外期权交易流程是怎样的?个股场外期权是一种非标准化的期权合约,通常在场外市场(OTC市场)由金融机构和投资者之间进行交易。 场外个股期权主要功能 风险管理: 帮助投…

太速科技-基于Kintex-7 XC7K325T的FMC USB3.0四路光纤数据转发卡

基于Kintex-7 XC7K325T的FMC USB3.0四路光纤数据转发卡 一、板卡概述   本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持64bit DDR3容量2GByte,USB3.0接口,HPC的FMC连接器&#xff…

安卓玩机工具-----通用安卓玩机工具 “搞机助手”界面预览 推荐

在网络中有很多很好玩的工具。方便安卓机型联机使用各种功能。系列博文将详细的演示有些工具的特点与使用方法 搞机助手 作者:流水断崖 目前开发功能有:Twrp recovery全自动刷机,免Root冻结、卸载预装软件,免Root激活&#xff…

1-9 图像膨胀 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 kernel np.ones((3, 3), np.uint8) _, binary_image cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) dilated_image cv2.dilate(binary_image, kernel, iterations1) 三、运行现象 四、完整代码 五、完整工程贴出 一、提前准备 …

【vue css】background设置背景图片不显示问题

问题: 如上图所示,添加背景图片页面没有显示 解决: 添加background-position: center center 即可显示 但是不知道为什么添加这个属性就可以,求大神解惑

端口安全老化细节

我们都知道port-security aging-time命令用来配置端口安全动态MAC地址的老化时间,但是后面还可以加上类型: [SW1-GigabitEthernet0/0/1]port-security aging-time 5 type absolute Absolute time 绝对老化 inactivity Inactivity time相对老化 …