基于vite和vue3、 eslint、prettier、stylelint、husky规范

news2024/11/28 8:24:52

前言  

        在现代的前端开发中,代码规范非常重要。它可以提高团队的协作效率,减少代码错误,使代码更易于维护。为了实现代码规范化,我们可以使用一些工具来辅助我们的开发流程,包括eslint、prettier、stylelint、husky,如果没有这些工具去辅助、约束我们团队开发,那么团队内,百花齐放,各写各的,各用各的规范格式、那么每次提交代码的时候,由于每个人的规范格式不一样,那么不同人提交的代码,在对比的时候,就会出现,不必要的改动显示,不利于代码检视,代码维护、代码统一规范等,所以需要上诉工具帮助我们代码开发,下面逐一介绍。

Eslint

        ESLint是一个非常流行的JavaScript代码静态分析工具,它可以帮助检测和修复代码中的错误和不规范的写法。它提供了丰富的规则配置,可以根据项目的需要进行定制,如果需要详细的教程可点击Eslint跳转官网查看。

eslint在项目中的配置使用步骤

安装eslint

npm init @eslint/config

 安装完毕之后,会在项目根目录看到 eslint.config.js 配置文件,其内容是

import globals from "globals";
import pluginJs from "@eslint/js";
import pluginVue from "eslint-plugin-vue";

export default [
  {files: ["**/*.{js,mjs,cjs,vue}"]}, // 校验文件类型,如果明确我们的项目中没有 mjs 和 cjs 文件,可以删除掉这两个后缀
  {languageOptions: { globals: globals.browser }},  // 全局变量
  pluginJs.configs.recommended, // eslint-plugin-js 的推荐配置
  ...pluginVue.configs["flat/essential"], // 表示使用Vue.js的扁平化基本配置
]

我们可以像下面一样添加一些自定义的规则,来让我们的项目更加规范

import globals from "globals";
import pluginJs from "@eslint/js";
import pluginVue from "eslint-plugin-vue";

export default [
  {files: ["**/*.{js,mjs,cjs,vue}"]}, // 校验文件类型,如果明确我们的项目中没有 mjs 和 cjs 文件,可以删除掉这两个后缀
  {languageOptions: { globals: globals.browser }},  // 全局变量
  pluginJs.configs.recommended, // eslint-plugin-js 的推荐配置, 具体有啥推荐,可以查看官方文档 https://zh-hans.eslint.org/docs/latest/rules/
  ...pluginVue.configs["flat/essential"], // 表示使用Vue.js的扁平化基本配置
  /** 自定义规则 */
  {
    rules: {
      // 代码风格
      "indent": ["error", 2], // 缩进2个空格
      "quotes": ["error", "single"],  // 字符串使用单引号
      "semi": ["error", "always"],  // 语句结尾使用分号
      "space-before-function-paren": ["error", "never"],  // 函数定义时括号前面不加空格

      // 变量声明
      "no-var": "error",  // 禁止使用 var
      "no-unused-vars": "error",  // 禁止出现未使用的变量

      // 最佳实践
      "no-console": "error",  // 禁止使用 console
      "no-debugger": "error", // 禁止使用 debugger
      "no-alert": "error",    // 禁止使用 alert

      // 错误处理
      "handle-callback-err": "error", // 要求回调函数中有错误处理

      // Vue
      "vue/html-indent": ["error", 2],  // vue文件缩进2个空格
    }
  }
];

 有了这些规则,自然就得用起来,我们可以使用下面的命令

npx eslint . // 校验当前目录下的所有文件
npm eslint file.js // 校验 file.js 文件

如何让eslint 规则,在我们编写代码的时候就校验,而不是在控制台输入命令后才校验呢 

那就得在vscode 插件市场中找到 eslint 插件然后安装

安装完我们就打开vscode设置,启用eslint即可

如果我们的代码不符合校验规则,就会出现红线提示了像下面这样

 接下来就是,设置如何在保存的时候,自动正确格式化我们的代码了,那就需要用到下面介绍的工具prettier了

配置 eslint 忽略

只需要在配置文件里面进行类似下面相应的配置即可,这是现在最新版的eslint  9.11.0

Prettier

Prettier是一个代码格式化工具,它可以自动调整代码的缩进、换行、引号等格式,使代码风格保持一致。与ESLint不同,Prettier主要关注代码的格式问题,而不是语法或逻辑错误。

安装prettier

npm install --save-dev --save-exact prettier

创建一个配置文件.prettier及忽略文件 .prettierignore

接下来是配置 prettier 可点击这里前往官网查看详细配置,下面的我一些配置

// 注意实际上,文件中不能有注释代码,记得去除
{
  "experimentalTernaries": true,  // 使用实验性的三元表达式
  "singleQuote": true,  // 使用单引号
  "semi": true,  // 使用分号
  "trailingComma": "none",  // 不使用尾随逗号
  "arrowParens": "avoid",  // 箭头函数参数只有一个时不使用括号
  "printWidth": 80,  // 每行最大字符数
  "tabWidth": 2,  // 缩进字符数
  "useTabs": false,  // 使用空格缩进
  "bracketSpacing": true,  // 对象字面量的大括号前后使用空格
  "jsxBracketSameLine": false,  // 在jsx中,将>多行JSX元素的放在另起一行
  "vueIndentScriptAndStyle": true,  // 在Vue文件中,缩进<template>、<script>和<style>标签内的代码
  "endOfLine": "auto",  // 自动检测换行符
  "quoteProps": "as-needed",  // 对象属性仅在必要时使用引号
  "bracketSameLine": false,  // 将多行HTML (HTML、JSX、Vue、Angular)元素的>单独放在下一行(不适用于自闭元素)
  "vueIndentScriptAndStyle": false,  // 在Vue文件中,缩进<script>和<style>标签内的代码
}

1、接下来在vscode 的设置里面 找到代码格式化设置,设置为使用 prettier格式化代码

2、然后再找到 保存自动格式化代码设置

3、安装vscode 扩展 eslint 与 prettier

如果发现做了上述操作之后,保存代码还是没有自动格式化代码,那就把vscode的 eslint、prettier 扩展插件 卸载了重新安装,然后重启vscode,就可以解决了,点击保存后,发现还是有eslint 校验出来的红线,我理解这就是eslint 与 prettier 的冲突规则

解决 eslint 与 prettier 冲突 

然后解决eslint(9.11.0) 与 prettier(3.3.3)冲突的常用方法就是使用 下面两个包

  • eslint-config-prettier 会关闭ESLint中有关代码格式化的配置。
  • eslint-plugin-prettier 把Prettier配置成ESLint的一个插件,让其当做一个linter规则来运行

 作为开发依赖安装

npm i eslint-config-prettier eslint-plugin-prettier  -D

 然后在eslint.config.js 增加下面的配置即可

extends: ['plugin:prettier/recommended'],

在这个地方增加配置

Stylelint

Stylelint是一个专门用于检测CSS代码规范的工具。它可以检查CSS文件中的语法错误、命名规范、属性顺序等问题。Stylelint也提供了大量的规则配置,可以根据项目需要进行定制。

安装 Stylelint

// 如果是 scss/sass 则后一个插件的后缀对应改一下接口 例如 stylelint-config-standard-scss
npm install --save-dev stylelint stylelint-config-standard-less

我是使用less写样式的,所以安装上述依赖即可,如果是其他的预处理器,则安装对应的即可,安装完之后,就需要到vscode,安装对应的插件了

安装 vscode 插件 

Git 规范流程

Husky是一个git钩子工具,它可以在代码提交前或提交后执行一些自定义的脚本。我们可以使用Husky来集成各种代码规范检查工具,例如在提交代码前自动运行ESLint、Prettier和Stylelint,以确保提交的代码符合规范、校验提交信息是否符合规范等

需要安装的依赖如下

husky操作git钩子的工具
lint-staged在提交前进行eslint校验,并使用prettier格式化暂存区的代码
@commitlint/cli校验提交信息
@@commitlint/config-conventionalAngular 的提交规范
commitizen生成标准化的commit message
cz-git轻量级、高度自定义。输出标准格式的commitize 适配器

下面逐一安装使用

安装husky 

npm install husky -D

然后再package.json 中添加如下配置

"prepare": "husky install"

npm run prepare 一下 就会在项目根目录生成一个.husky文件夹

安装 lint-staged

npm install lint-staged -D

然后在根目录创建一个lint-staged.config.js 配置如下

export default {
  '*.{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']
};

安装 commitlint 校验提交信息

npm i @commitlint/cli @commitlint/config-conventional -D

 安装commitizen、cz-git

npm install commitizen cz-git -D

 然后在 package.json中添加如下配置

"config": {
  "commitizen": {
    "path": "node_modules/cz-git"
  }
}

 然后在根目录创建一个  commitlint.config.js 文件配置如下

// @see: https://cz-git.qbenben.com/zh/guide
/** @type {import('cz-git').UserConfig} */

module.exports = {
	ignores: [commit => commit === "init"],
	extends: ["@commitlint/config-conventional"],
	rules: {
		// @see: https://commitlint.js.org/#/reference-rules
		"body-leading-blank": [2, "always"],
		"footer-leading-blank": [1, "always"],
		"header-max-length": [2, "always", 108],
		"subject-empty": [2, "never"],
		"type-empty": [2, "never"],
		"subject-case": [0],
		"type-enum": [
			2,
			"always",
			[
				"feat",
				"fix",
				"docs",
				"style",
				"refactor",
				"perf",
				"test",
				"build",
				"ci",
				"chore",
				"revert",
				"wip",
				"workflow",
				"types",
				"release"
			]
		]
	},
	prompt: {
		messages: {
			type: "选择你要提交的类型 :",
			scope: "选择一个提交范围(可选):",
			customScope: "请输入自定义的提交范围 :",
			subject: "填写简短精炼的变更描述 :\n",
			body: '填写更加详细的变更描述(可选)。使用 "|" 换行 :\n',
			breaking: '列举非兼容性重大的变更(可选)。使用 "|" 换行 :\n',
			footerPrefixsSelect: "选择关联issue前缀(可选):",
			customFooterPrefixs: "输入自定义issue前缀 :",
			footer: "列举关联issue (可选) 例如: #31, #I3244 :\n",
			confirmCommit: "是否提交或修改commit ?"
		},
		types: [
			{ value: "feat: 特性", name: "特性:   🚀  新增功能", emoji: "🚀" },
			{ value: "fix: 修复", name: "修复:   🧩  修复缺陷", emoji: "🧩" },
			{ value: "docs: 文档", name: "文档:   📚  文档变更", emoji: "📚" },
			{ value: "style: 格式", name: "格式:   🎨  代码格式(不影响功能,例如空格、分号等格式修正)", emoji: "🎨" },
			{ value: "refactor: 重构", name: "重构:   ♻️  代码重构(不包括 bug 修复、功能新增)", emoji: "♻️" },
			{ value: "perf: 性能", name: "性能:   ⚡️  性能优化", emoji: "⚡️" },
			{ value: "test: 测试", name: "测试:   ✅  添加疏漏测试或已有测试改动", emoji: "✅" },
			{ value: "chore: 构建", name: "构建:   📦️  构建流程、外部依赖变更(如升级 npm 包、修改 webpack 配置等)", emoji: "📦️" },
			{ value: "ci: 集成", name: "集成:   🎡  修改 CI 配置、脚本", emoji: "🎡" },
			{ value: "revert: 回退", name: "回退:   ⏪️  回滚 commit", emoji: "⏪️" },
			{ value: "build: 打包", name: "打包:   🔨  项目打包发布", emoji: "🔨" }
		],
		useEmoji: true,
		themeColorCode: "",
		scopes: [],
		allowCustomScopes: true,
		allowEmptyScopes: true,
		customScopesAlign: "bottom",
		customScopesAlias: "custom",
		emptyScopesAlias: "empty",
		upperCaseSubject: false,
		allowBreakingChanges: ["feat", "fix"],
		breaklineNumber: 100,
		breaklineChar: "|",
		skipQuestions: [],
		issuePrefixs: [{ value: "closed", name: "closed:   ISSUES has been processed" }],
		customIssuePrefixsAlign: "top",
		emptyIssuePrefixsAlias: "skip",
		customIssuePrefixsAlias: "custom",
		allowCustomIssuePrefixs: true,
		allowEmptyIssuePrefixs: true,
		confirmColorize: true,
		maxHeaderLength: Infinity,
		maxSubjectLength: Infinity,
		minSubjectLength: 0,
		scopeOverrides: undefined,
		defaultBody: "",
		defaultIssues: "",
		defaultScope: "",
		defaultSubject: ""
	}
};

 再然后再package.json 的script中添加如下命令

"lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src",
		"lint:prettier": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"",
		"lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
		"lint:lint-staged": "lint-staged",
		"prepare": "husky install",
		"release": "standard-version",
		"commit": "git status && git add -A && git-cz"

最后我们就可以通过 运行 npm run commit 进行代码提交了,就会出现下面的场景,然后选择对一个的特性即可 

​​​​​​​

 

然后假如 git commit -m "xx"则汇报下面的错误,无法完成提交,这样就可以达到,提交信息统一规范的目的,但是假如是通过vscode提交的还是校验不到,目前找不到解决办法 

 

总结

        综上所述,通过使用ESLint、Prettier、Stylelint和Husky,我们可以实现代码的静态分析、格式化和风格检查,并在团队中推行统一的代码规范。这将帮助我们提高代码质量,提高开发效率,降低维护成本。

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

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

相关文章

MYSQL-SQL-03-DQL(Data Query Language,数据查询语言)(单表查询)

DQL&#xff08;数据查询语言&#xff09; DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记录。 查询关键字: SELECT 在一个正常的业务系统中&#xff0c;查询操作的频次是要远高于增删改的&#xff0c;当我们去访…

宇音天下最新力作 | VTX356语音识别合成芯片问世

北京宇音天下科技有限公司&#xff0c;依托在语音技术领域的丰富经验和技术积累&#xff0c;成功推出了一款具有里程碑意义的语音识别合成芯片——VTX356。这款芯片的问世&#xff0c;不仅彰显了公司在智能语音处理领域的专业实力&#xff0c;也预示着智能家居、车载电子、智能…

开始菜单增强工具 StartAllBack v3.7.10.4910 直装激活版

StartAllBack中文版(StartIsBack)是一款Win11开始菜单增强工具&#xff0c;可以为Windows11恢复经典样式的Windows7主题风格开始菜单和任务栏&#xff0c;功能包括了&#xff1a;自定义开始菜单样式和操作&#xff0c;个性化任务栏及资源管理器等。 详细功能 √ 全面更新中文语…

java中Scanner的nextLine和next方法

思考&#xff0c;输入1 2 3 4 5加上enter&#xff0c;输出什么 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int[][] m new int[2][2];for (int i 0; i < 2; i) {for (int j 0; j < 2;…

DataX数据同步

背景&#xff1a; 业务需求中&#xff0c;经常会有同步各种系统或者数仓的数据到自己的库进行使用。比如从oracle同步到自己的mysql&#xff0c;自己写代码如果数据量大需要考虑多线程并发等。最近使用了阿里的Datax项目&#xff0c;操作简单并高效。 Datax Datax概述&支…

如何使用的是github提供的Azure OpenAI服务

使用的是github提供的Azure OpenAI的服务gpt-4o 说明&#xff1a;使用的是github提供的Azure OpenAI的服务&#xff0c;可以无限薅羊毛。开源地址 进入&#xff1a; 地址 进入后点击 右上角“Get API key”按钮 点击“Get developer key” 选择Beta版本“Generate new to…

高可用HA软件

高可用HA&#xff08;High Availability&#xff09;软件在分布式系统架构设计中至关重要&#xff0c;它们能够减少系统停机时间&#xff0c;确保应用程序持久、不间断地提供服务。以下是四款常用的高可用HA软件介绍&#xff1a; Keepalived Keepalived起初是为LVS&#xff08;…

Python小白学习教程从入门到入坑------第十八课 异常模块与包【上】(语法基础)

一、异常 在Python中&#xff0c;异常&#xff08;Exception&#xff09;是一种用于处理在程序运行时可能发生的错误情况的机制 异常允许程序在检测到错误时不是简单地崩溃&#xff0c;而是能够优雅地处理这些错误&#xff0c;可能包括记录错误信息、清理资源、或者向用户提…

如何使用非官方的根组件

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性3. 示例代码4. 内容总结我们在上一章回中介绍了"Get包简介"相关的内容,本章回中将介绍GetMaterialApp组件.闲话休提,让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经介绍过GetMaterialApp组…

Python(pandas库3)

函数 随机抽样 语法&#xff1a; n&#xff1a;要抽取的行数 frac&#xff1a;抽取的比例&#xff0c;比如 frac0.5&#xff0c;代表抽取总体数据的50% axis&#xff1a;示在哪个方向上抽取数据(axis1 表示列/axis0 表示行) 案例&#xff1a; 输出结果都为随机抽取。 空…

Qt/C++ 调用迅雷开放下载引擎(ThunderOpenSDK)下载数据资源

目录导读 前言ThunderOpenSDK 简介参考 xiaomi_Thunder_Cloud 示例ThunderOpenSDK 下载问题 前言 在对以前老版本的exe执行程序进行研究学习的时候&#xff0c;发现以前的软件是使用的ThunderOpenSDK这个迅雷开放下载引擎进行的项目数据下载&#xff0c;于是在网上搜索一番找到…

Chrome谷歌浏览器加载ActiveX控件之allWebDesktop控件介绍

背景 allWebDesktop控件是一款方便用户在线打开各类文档的OA办公控件。它设计比较轻巧&#xff0c;充分利用计算机程序资源打开文档&#xff0c;并将程序窗口嵌入到allWebDesktop控件区域内&#xff0c;从而实现浏览器内打开各类文档效果。 allWebPlugin中间件是一款为用户提供…

【工具】Charles对360浏览器抓包抓包

Charles 和 switchy sharp 配合&#xff0c;可以对 Chrome 进行抓包也可以配合对360安全浏览器抓包。 本文以Windows 电脑中的配置为例&#xff0c;介绍如何实现抓包。&#xff08;Mac中操作基本一致&#xff09; 1.安装Charles 可根据自己的电脑下载对应的版本&#xff1a;…

【C++初阶】模版入门看这一篇就够了

文章目录 1. 泛型编程2. 函数模板2. 1 函数模板概念2. 2 函数模板格式2. 3 函数模板的原理2. 4 函数模板的实例化2. 5 模板参数的匹配原则2. 6 补充&#xff1a;使用调试功能观察函数调用 3. 类模板3 .1 类模板的定义格式3. 2 类模板的实例化 1. 泛型编程 在C语言中&#xff0…

【JavaEE初阶】网络原理—关于TCP协议值滑动窗口与流量控制,进来看看吧!!!

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP协议的重要的机制“连接的建立和断开”~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1…

5. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验5:PWM驱动直流电机)

作者:Whappy,日期:2024.10.29,决战STM32 直流电机的控制就比较简单了,只有数据线和地线,正接正转,反接反转,为了方便,本实验采用H桥电路来控制电机的正反转,H桥电路也很简单,就是4个MOS管构成的2路推挽输出电路. 注:基本上大功率器件,单片机基本上是无法驱动的,都是要靠一部分…

家用wifi的ip地址固定吗?换wifi就是换ip地址吗

在探讨家用WiFi的IP地址是否固定&#xff0c;以及换WiFi是否就意味着换IP地址这两个问题时&#xff0c;我们首先需要明确几个关键概念&#xff1a;IP地址、家用WiFi网络、以及它们之间的相互作用。 一、家用WiFi的IP地址固定性 家用WiFi环境中的IP地址通常涉及两类&#xff1a…

Python——自动化发送邮件

在数字化时代&#xff0c;电子邮件是商务沟通和个人联络的重要工具。自动化邮件发送可以节省时间&#xff0c;提高效率。Python&#xff0c;作为一种强大且灵活的编程语言&#xff0c;提供了多种库来支持邮件的自动化发送。本文将详细介绍如何使用Python的smtplib和email库来编…

DRC-20开发指南:新一代区块链代币标准

区块链技术自比特币诞生以来&#xff0c;迅速发展成为全球科技与金融领域的创新中心。随着区块链技术的普及&#xff0c;数字代币作为一种新兴的数字资产类别&#xff0c;逐渐为更多人所熟知。从ERC-20到BRC-20&#xff0c;代币标准的演进一直在推动着区块链生态系统的创新与发…

从零开始的JavaScript基础!

目录 一、JavaScript 的概述 二、如何在HTML页面中使用JS &#xff08;一&#xff09;、行内式 &#xff08;二&#xff09;、内嵌式 &#xff08;三&#xff09;、外链式 &#xff08;四&#xff09;、基本执行顺序 1.从上到下线性执行&#xff1a; 2.阻塞行为&#x…