前端项目规范化:手把手教你使用prettier和pre-commit(git hook或者husky)优化规范项目代码

news2024/11/19 0:50:09

如何在提交代码之前,进行代码格式化检查,保证每个成员的代码都是同一个风格呢?

最简单的两种方式:

    1. 使用 prettier + git pre-commit
    1. 使用 prettier + husky(原理和第一种一模一样哦)

名词简介

git hooks

下图为git hooks的官方示例,以.sample结尾。注意这些以.sample结尾的示例脚本是不会执行的,重命名后会生效

  • 是一些自定义的脚本,用于控制git工作的流程,分为客户端钩子和服务端钩子。

  • 客户端钩子包括:pre-commit、prepare-commit-msg、commit-msg、post-commit等,主要用于控制客户端git的提交工作流。服务端钩子:pre-receive、post-receive、update,主要在服务端接收提交对象时、推送到服务器之前调用。

  • git hooks位置位于每个git项目下的隐藏文件夹.git中的hooks文件夹里

  • 具体内容可以参考git的文档

Git pre-commit

  • 客户端hooks之一,在git add提交之后,然后执行git commit时执行,脚本执行没有问题的话就继续提交,反之就驳回提交操作
  • 它一般用来对将要提交的代码进行检查、优化代码格式、或者对提交的图片进行压缩等等任务
    举个栗子,下面是eslint检查的一个shell脚本,将下面代码保存为.git/hooks/pre-commit中,每次执行git commit时就会使用eslint进行代码检查
STAGE_FILES=$(git diff --cached --name-only --diff-filter=ACM -- '*.vue' '*.js')
if test ${#STAGE_FILES} -gt 0
then
    echo '开始eslint检查'

    which eslint &> /dev/null
    if [[ "$?" == 1 ]]; then
        echo '没安装eslint'
        exit 1
    fi

    PASS=true

    for FILE in $STAGE_FILES
    do
        eslint $FILE
        if [[ "$?" == 1 ]]; then
      PASS=false
    fi
  done

  if ! $PASS; then
      echo "eslint检查没通过!"
      exit 1
  else
      echo "eslint检查完毕"
  fi

else
    echo '没有js文件需要检查'
fi

exit 0

prettier

  • prettier是一个代码格式化工具,它可以支持JS/JSX/TS/Flow/JSON/CSS/LESS等文件格式。
  • 用来优化代码格式,比如缩进、空格、分号等等

husky

可以用于实现各种 Git Hook。这里主要用到 pre-commit这个 hook,在执行 commit 之前,运行一些自定义操作

快速上手第一种方案:使用 prettier + git pre-commit 检查并格式化本次修改的文件

本文示例代码

安装依赖到开发环境

//npm
npm install --save-dev --save-exact prettier
//yarn
yarn add --dev --exact prettier

根目录下创建.prettierrc.js

  • .prettierrc 文件用于配置规则,
module.exports = {
  printWidth: 100, // 单行长度
  tabWidth: 2, // 缩进长度
  useTabs: false, // 使用空格代替tab缩进
  semi: true, //句末使用分号
  singleQuote: true, //使用单引号
  quoteProps: 'as-needed', //仅在必需时为对象的key添加引号
  trailingComma: 'all', //多行时尽可能打印尾随逗号
  bracketSpacing: true, //在对象前后添加空格-eg: { foo: bar }
  jsxBracketSameLine: true, //多属性html标签的‘>’折行放置
  arrowParens: 'always', //单参数箭头函数参数周围使用圆括号-eg: (x) => x
  requirePragma: false, //无需顶部注释即可格式化
  insertPragma: false, //在已被preitter格式化的文件顶部加上标注
  proseWrap: 'preserve', //不知道怎么翻译
  htmlWhitespaceSensitivity: 'ignore', //对HTML全局空白不敏感
  endOfLine: 'lf', //结束行形式
  embeddedLanguageFormatting: 'auto', //对引用代码进行格式化
};

根目录下创建.prettierignore,忽略不想格式化的文件

  • .prettierignore 文件用于忽略默写不需要处理的文件或目录
  • node_modules默认被忽略,创建 .prettierignore忽略其他文件
build
.cache

# Ignore all HTML files:
*.html
*.yml
*.yaml

手动测试格式化效果

举个栗子:我们先故意把./index.js文件搞乱,然后测试格式化./index.js

npx prettier --write ./index.js
//或
yarn prettier --write ./index.js

备注:格式化全部文件的命令

npx prettier --write .
//或
yarn prettier --write .

配置Git提交代码 Commit 前执行 Prettier (只格式化本次改动的文件)

创建 .git/hooks/pre-commit

STAGE_FILES=$(git diff --cached --name-only -- '*.json' '*.js')
if test ${#STAGE_FILES} -gt 0
then
    echo '开始代码格式检查与修正'
    for FILE in $STAGE_FILES
    do
        npx prettier --write $FILE
        if [[ "$?" == 1 ]]; then
      PASS=false
    fi
  done
echo "代码格式化检查完毕"

else
    echo '没有js或者json文件需要检查'
fi

exit 0

改动部分文件,进行测试

把代码改乱,然后执行下面命令

git add .
git commit -m "feat: test pre commit prettier"

代码已被修正,修正后,我们需要重新执行命令再次提交

按需处理文件

当我们提交非 js ,json文件时候,会提示:没有js或者json文件需要检查

XXX prettier-demo % git add .

git commit -m "feat: add readme"             
没有js或者json文件需要检查
[master 262be83] feat: add readme
 1 file changed, 21 insertions(+)
 create mode 100644 README.md

XXX prettier-demo % 

方案一大功告成

快速上手第二种方案:使用 prettier + husky 检查并格式化本次修改的文件

友情提示,此部分内容几乎和第一种一样,但是用了husky,没有使用git hook

安装依赖到开发环境

//npm
npm install --save-dev --save-exact prettier
//yarn
yarn add --dev --exact prettier

根目录下创建.prettierrc.js

  • .prettierrc 文件用于配置规则,
module.exports = {
  printWidth: 100, // 单行长度
  tabWidth: 2, // 缩进长度
  useTabs: false, // 使用空格代替tab缩进
  semi: true, //句末使用分号
  singleQuote: true, //使用单引号
  quoteProps: 'as-needed', //仅在必需时为对象的key添加引号
  trailingComma: 'all', //多行时尽可能打印尾随逗号
  bracketSpacing: true, //在对象前后添加空格-eg: { foo: bar }
  jsxBracketSameLine: true, //多属性html标签的‘>’折行放置
  arrowParens: 'always', //单参数箭头函数参数周围使用圆括号-eg: (x) => x
  requirePragma: false, //无需顶部注释即可格式化
  insertPragma: false, //在已被preitter格式化的文件顶部加上标注
  proseWrap: 'preserve', //不知道怎么翻译
  htmlWhitespaceSensitivity: 'ignore', //对HTML全局空白不敏感
  endOfLine: 'lf', //结束行形式
  embeddedLanguageFormatting: 'auto', //对引用代码进行格式化
};

根目录下创建.prettierignore,忽略不想格式化的文件

  • .prettierignore 文件用于忽略默写不需要处理的文件或目录
  • node_modules默认被忽略,创建 .prettierignore忽略其他文件
build
.cache

# Ignore all HTML files:
*.html
*.yml
*.yaml

手动测试格式化效果

举个栗子:我们先故意把./index.js文件搞乱,然后测试格式化./index.js

npx prettier --write ./index.js
//或
yarn prettier --write ./index.js

备注:格式化全部文件的命令

npx prettier --write .
//或
yarn prettier --write .

安装husky

npm install husky --save-dev

让 husky 启用 git hooks

npx husky install

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

设置安装后自动启用 git hooks

注意:yarn 安装是不支持 prepare 这个生命周期的,需要将 prepare 改成 postinstall

npm set-script prepare "husky install"

可以看到 package.json 里增加一个 script

创建 pre commit hook

// 下面这行命令后面没有跟脚本,会产生undefined 的内容,但是我们可以自己修改具体的脚本命令
npx husky add .husky/pre-commit 

.husky/pre-commit 写入脚本

STAGE_FILES=$(git diff --cached --name-only -- '*.json' '*.js')
if test ${#STAGE_FILES} -gt 0
then
    echo '开始代码格式检查与修正'
    for FILE in $STAGE_FILES
    do
        npx prettier --write $FILE
        if [[ "$?" == 1 ]]; then
      PASS=false
    fi
  done
echo "代码格式化检查完毕"

else
    echo '没有js或者json文件需要检查'
fi

exit 0

测试,大功告成

今天就写到这里啦~

  • 小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~
  • 大家要天天开心哦

欢迎大家指出文章需要改正之处~
学无止境,合作共赢

在这里插入图片描述

欢迎路过的小哥哥小姐姐们提出更好的意见哇~~

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

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

相关文章

FcaNet: Frequency Channel Attention Networks论文总结和代码详解

论文:https://arxiv.org/abs/2012.11879 中文版:FcaNet: Frequency Channel Attention Networks 源码:https://github.com/cfzd/FcaNet或https://gitee.com/yasuo_hao/FcaNet 目录 一、论文背景和出发点 二、创新点 三、离散余弦变换&…

FastDFS-图灵

1. 分布式文件系统应用场景 互联网海量非结构化苏剧的存储需求 电商网站:海量商品图片视频网站:海量视频文件网盘:海量文件社交网站:海量图片 2.FastDFS介绍 https://github.com/happyfish100/fastdfs 2.1 简介 FastDFS是一个…

(转载)支持向量机(support vector machine, SVM)的分类(matlab实现)

支持向量机(support vector machine,SVM)是一种新的机器学习方法,其基础是Vapnik 创建的统计学习理论(statistical learning theory,STL)。统计学习理论采用结构风险最小化(structural risk minimization,SRM)准则,在最小化样本点误差的同时,…

Redis进阶 - Redis主从

原文首更地址,阅读效果更佳! Redis进阶 - Redis主从 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-master-slave.html 搭建主从架构 单节点 Redis 的并发能力是有上限的,要进一步提高 Redis 的并发能力&am…

CSS3技巧35:滚动的条纹背景

感觉好久没更博客了,虽然我经常登录看下粉丝数。O(∩_∩)O 端午节摆烂,休息了下,恢复下元气。 节后开始满负荷工作。 ---------------------------正文开始------------------------------------------ 做进度条的时候,有时候会…

Tomcat【部署zrlog】

目录 目录 1、单节点部署zrlog【192.168.200.121】 1.1、 创建数据库、远程登录用户 1.2、 浏览器访问 2、 LB集群-构建-部署zrlog-NFS共享存储 2.1、 安装、配置LB【192.168.200.120】 2.2、 NFS-资源共享【192.168.200.125】 3、配置tomcat访问日志中记录真实IP 1、单…

[元带你学: eMMC协议详解 20] emmc的命令(cmd)、响应(resp)详解

依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 8100字, 主要内容 对eMMC的command进行详细介绍,主要包含如下内容: (1) emmc命令有哪些 (2) 使用不同命…

Java POI (1)—— 数据读写操作快速入门

一、Excel的版本区别(03版和07版) 所谓“03版” 和 “07版”,指的是 Microsoft Excel 版本号。这些版本号代表着不同的Excel 文件格式。2003版 Excel 使用的文件格式为 .xls,而2007版开始使用新的文件格式 .xlsx。 . xlsx 文件格式…

Unreal 5 蓝图常用的一些节点和规范

命名规范 蓝图类以 BP_作为前缀 对应Blue Print 混合空间以 BS_作为前缀 Blend Space 静态网格体以 SM_作为前缀 StaticMesh 骨骼网格体以 SK_作为前缀 Skeletal Mesh 纹理以 T_作为前缀 Texture 粒子系统 以 PS_作为前缀 Particle System 主材质以 M_作为前缀 Material 材质子…

手术机器人常见骨科手术 TKA UKA HTO

TKA UKA HTO 首先这几种手术都是常见的手术,下面先进行常见的但要介绍: 近年来有大量的研究聚焦于手术方式的对比,这里先就现有证据对「HTO」、单髁置换「UKA」和全膝置换「TKA」做一个简要的总结,以便于速查: TKA 不…

熵权法步骤及例题讲解

一、基本原理 在信息论中,熵是对不确定性的一种度量。不确定性越大,熵就越大,包含的信息量越大;不确定性越小,熵就越小,包含的信息量就越小。 根据熵的特性,可以通过计算熵值来判断一个事件的随…

【玩转Linux操作】详细讲解shell的注释,变量,字符串,数组等操作

🎊专栏【玩转Linux操作】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题🥰 文章目录 🍔概述⭐注意⭐示例🏳️‍🌈然…

scala的基本语法

注释 对于scala的注释,简而言之就是一句话,和java的注释一模一样 基本语法 (1)单行注释:// (2)多行注释:/* */ (3)文档注释:/****/代码示例&…

samaphore、countdownlatch、cyclinarrier

目录 一、samaphore 1、介绍 2、应用 3、原理 二、countdownlatch 三、cyclicbarrier 一、samaphore 1、介绍 信号量,用来限制同时访问共享资源的线程上限。可以理解为停车场入口的提示排,标识有多少车位,有车位才能进去停车&#xf…

ElasticSearch-使用IK分词器进行分词

使用KIbana测试IK分词器 打开开发工具台 ik_smart 最少分词器 分词结果比较少 GET _analyze{"analyzer": "ik_smart","text": "中国共产党"}ik_max_word 颗粒度最细分词器 分词结果比较多,组成各种结果,穷尽词库的可能&#xff01…

easypan前端学习

文章目录 前端项目node 版本node镜像构建项目创建项目安装项目所有依赖 图片资源网站encodeURI & decodeURIapp.config.globalProperties与getCurrentInstanceObject.assignvue-cookies安装vue-cookies 使用vue-cookiesrouter.currentRoutepreserve logimport.meta.envRequ…

QPaint绘制图形

流程 继承QWidget类&#xff0c;重写paintEvent方法&#xff0c;在其中使用QPainter进行绘图。 举例 创建项目&#xff0c;项目结构如下&#xff1a; // widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget…

TypeScript ~ TS 掌握编译文件配置项 ⑥

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

git 上传下载

文章目录 gitee/GitHub 是用来做什么的&#xff1f;什么时候需要学习上传项目到 gitee&#xff1f;为什么要将本地项目上传到 gitee&#xff1f;创建 gitee 仓库&#xff1a;在本地新建一个项目将仓库拉取到本地使用 idea 实现项目的上传下载gitee 仓库查看 下面我就来为大家介…

第六章 习题(6789B)【计算机系统结构】

第六章 习题【计算机系统结构】 前言推荐第六章 习题678911 最后 前言 2023-6-24 10:43:46 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐 第五章 作业&#xff08;149A&#xff09;【计算机系统结构】 答案参考&#xff1a; https://www.docin.com/p-28456…