首页 > 其他分享 >利用husky.js git hooks实现图片自动压缩功能

利用husky.js git hooks实现图片自动压缩功能

时间:2024-12-11 17:31:44浏览次数:3  
标签:git console filePath hooks 压缩 tinify js error 图片

场景

在一般的网页开发过程中,往往我们都要下载较多的切图,而这些切图未必都做了压缩,即使做了压缩,效果未必能达到理想效果。

要解决这种图片压缩问题,途径有很多

1. 手动将图片丢到xx站点,压缩好之后再放进项目

2. 让UI给已经压缩好的图

这些方式都得靠人工操作,人工操作往往存在一些不确定性,比如忘记了要压缩,也察觉不出来,如果是多人开发,问题会更大。下面我将列举一些常规的解决方案

1. 当代码提交时,拦截大图的提交,提醒开发人员手动压缩(之前博文有实现过)

2. 当提交代码时,主动压缩大图并自动提交(本期讨论重点)

本期将解决方案2展开讨论:主动压缩大图并自动提交

1.安装 Husky:

确保你已经在项目中安装了 Husky。如果还没有安装,可以使用以下命令:

npm install husky --save-dev

2.启用 Git 钩子:

运行以下命令以启用 Husky 钩子:

npx husky install

3.添加 pre-commit 钩子:

使用 Husky 添加 pre-commit 钩子:

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

4.安装 lint-staged:

为了配合 Husky,安装 lint-staged 来处理文件:

npm install lint-staged --save-dev

5.配置 lint-staged:

package.json 中添加 lint-staged 配置:

{
  "lint-staged": {
    "**/*.{weapp,jpg,png}": "node scripts/compress-images.mjs"
  }
}

6.编写图片压缩脚本(tinify):

安装相关依赖

pnpm install tinify fs-extra glob --save-dev

在项目中创建一个 scripts 文件夹,并在其中添加 compress-images.mjs 文件,内容如下:

程序所包含的逻辑

1. 压缩使用的是tinify压缩工具,官网 https://tinypng.com/

2. 它只压缩图片大于300kb的图

3. 压缩的图将覆盖原图

4. 只有在 git commit -m 'xx' 时会触发图片压缩

import tinify from 'tinify';
import fs from 'fs-extra';

// 设置你的 Tinify API key
tinify.key = 'xxx';

const SIZE_LIMIT = 300 * 1024; // 300KB

async function compressImage(filePath) {
  try {
    const stats = await fs.stat(filePath);

    // 检查文件大小和压缩标记
    if (stats.size < SIZE_LIMIT) {
      console.log(`跳过 ${filePath} (小于300KB)`);
      return;
    }
    console.log(`压缩中: ${filePath}`);

    // 使用 tinify 压缩图片
    const source = tinify.fromFile(filePath);
    await source.toFile(filePath);


    console.log(`压缩完成: ${filePath}`);
  } catch (error) {
    console.error(`压缩失败 ${filePath}:`, error);
  }
}

async function main() {
  try {
    // 获取待提交的文件列表
    const files = process.argv.slice(2);
    console.log(`找到 ${files.length} 个图片文件`);

    // 并发压缩图片
    await Promise.all(files.map(compressImage));

    console.log('所有图片压缩完成!');
  } catch (error) {
    console.error('发生错误:', error);
    process.exit(1);
  }
}

main();

其他场景

有时候你可能需要再已提交的图片中压缩图片,只需要运行一行命令就能处理整个项目的图片压缩

在package.josn 中 的scripts添加命令

"scripts": {
  "compress": "node scripts/compress-images.mjs"
}

在scripts中创建compress-images.mjs,内容如下

程序所包含的逻辑

1. 压缩使用的是tinify压缩工具,官网 https://tinypng.com/

2. 它只压缩图片大于300kb的图

3. 图片压缩完之后会在图片同级目录生成一个文件已压缩标识 例如:我对a.png图片进行了压缩,那同级目录就会生成a.compress-marker 空白文件,只有每次压缩前都会判断这个文件有没有被压缩

4. 压缩的图将覆盖原图

import tinify from 'tinify';
import fs from 'fs-extra';
import {glob} from 'glob';

// 设置你的 Tinify API key
tinify.key = 'xxx';

// 压缩标记文件
const COMPRESS_MARKER = '.compress-marker';
const SIZE_LIMIT = 300 * 1024; // 300KB

async function compressImage(filePath) {
  try {
    const stats = await fs.stat(filePath);
    const markerPath = `${filePath}${COMPRESS_MARKER}`;

    // 检查文件大小和压缩标记
    if (stats.size < SIZE_LIMIT || await fs.pathExists(markerPath)) {
      console.log(`跳过 ${filePath} (已压缩或小于300KB)`);
      return;
    }

    console.log(`压缩中: ${filePath}`);

    // 使用 tinify 压缩图片
    const source = tinify.fromFile(filePath);
    await source.toFile(filePath);

    // 添加压缩标记
    await fs.writeFile(markerPath, '');

    console.log(`压缩完成: ${filePath}`);
  } catch (error) {
    console.error(`压缩失败 ${filePath}:`, error);
  }
}

async function main() {
  try {
    // 获取所有图片文件
    // const files = glob.sync('**/*.{png,jpg,jpeg}', {
    //   ignore: ['node_modules/**', 'dist/**']
    // });

    // 获取待提交的文件列表
    const files = process.argv.slice(2);

    console.log(`找到 ${files.length} 个图片文件`);

    // 并发压缩图片
    await Promise.all(files.map(compressImage));

    console.log('所有图片压缩完成!');
  } catch (error) {
    console.error('发生错误:', error);
    process.exit(1);
  }
}

main();

 

标签:git,console,filePath,hooks,压缩,tinify,js,error,图片
From: https://www.cnblogs.com/yz-blog/p/18600083

相关文章

  • nodejs长字符串RSA加解密解决方法
            为了让项目数据在前后端交互过程中不被拦截破解,在项目中使用RSA对数据进行加解密,同时考虑到交互数据过大情况,于是想到将数据在加密前先进行压缩,解密后在解压的思路。        基于nodejs代码进行测试,得到了验证。constNodeRSA=require('node-rsa')......
  • Git_版本管理-版本控制
    Git--本地和远程本地--工作区暂存区仓库区WorkingDirectory已修改(modified)workingtreeclean或者Untrackedfiles:Stage已暂存(staged)unstage查看命令:gitls-filesRepository已提交说明(committed)动作:加入--提交-推送发布......
  • Github上博客园SimpleMemory主题美化插件使用体验
    Github上博客园SimpleMemory主题美化插件使用体验目录Github上博客园SimpleMemory主题美化插件使用体验基本设置SimpleMemory插件地址管理选项管理侧边栏管理页面定制合影基本设置进入博客园管理界面,完成基础设置。皮肤模版选择SimpleMemory作为基础模版。JS权限如果开通,......
  • 在Git中撤消更改的六种方法总结
    在Git中,撤消更改是一个常见的操作,以下是主机邦收集的六种常用的方法来撤消更改:使用gitcheckout或gitrestore如果你想要撤销对文件的更改(即恢复到最后一次提交的状态),可以使用:gitcheckout--<file>或者使用gitrestore(Git2.23+):gitrestore--source=HEAD--<file>......
  • GitHub Actions 自动部署服务到 Amazon ECS
    概述本文将详细介绍如何使用GitHubActions实现自动化部署服务到AmazonECS(ElasticContainerService)。这个自动化流程包括构建Docker镜像、推送到ECR、创建ECS任务定义、配置负载均衡器以及更新ECS服务等步骤。前提条件AWS账号及相关权限GitHub仓库......
  • A5433 Java+Jsp+Servlet+MySQL+微信小程序+LW+在线点餐小程序的设计与实现 源码 配置
    在线点餐小程序的设计与实现1.摘要2.开发目的和意义2.1系统开发目的2.2系统开发意义3.系统功能设计4.系统界面截图5.源码获取1.摘要摘要近几年,人们生活水平日益提升,但工作强度和压力不断增强,尤其是对于上班族而言,到餐厅吃饭费时费力,而传统的APP点餐难以适应针对......
  • Node.js版本管理工具之NVM的安装使用教程
    一、NVM介绍在工作中,不同的项目可能需要不同NodeJS版本,所以维护多个版本比较麻烦,因此NVM(node.jsversionmanagement)应运而生,顾名思义它是一个nodejs的版本管理工具,它可以多版本node并存,轻松切换node版本,下面就开始介绍他的安装配置及使用。二、NVM的下载安装1、NVM下载安......
  • js逆向学习-1 逆向rsa简单加密
    RSA加密Rsa加密包含一个key和一个mode这个mode默认10001,也可以修改观察发送的数据首先点击登录选择xhr这个筛选模块,可以看到这里面只有这个check的数据请求,然后查看发送的数据,可以看到这里的密码是进行加密的然后记录这些值打断点知道了请求和加密的数据,现在就是去......
  • RTSP播放器EasyPlayer.js报错“Too many active WebGL contexts” 是什么原因?
    随着互联网技术的飞速发展,流媒体视频已成为信息传播和娱乐消费的重要形式。无论是在线视频平台、社交媒体还是在线教育,流媒体视频的应用无处不在。而在这一生态系统中,开发者选择什么样的播放器进行集成和开发,也是至关重要的。随着技术的发展,越来越多的H5流媒体播放器开始支持H.26......
  • PHP + JS + HTML 实现简单模板设计的视频播放功能
    PHP+JS+HTML实现简单模板设计的视频播放功能引言随着互联网的发展,视频内容已成为网站的重要组成部分。本文将介绍如何使用PHP、JavaScript和HTML实现一个简单的视频播放功能。我们将创建一个基本的模板,允许用户上传视频并在网页上播放。一、项目准备1.1环境搭建......