UNPKG

hudada-cli

Version:

专为程序员准备的本地文档搜索,快捷开发工具

3 lines (2 loc) 2.35 kB
#!/usr/bin/env node import e from"fs/promises";import o from"path";import t from"chalk";import n from"sharp";const a=[".jpg",".jpeg",".png",".webp",".gif"];async function s(){try{const s=process.cwd();console.log(t.cyan("开始处理图片..."));const i=o.join(s,"compressed");await e.mkdir(i,{recursive:!0});const r=await async function(t){const n=[];async function s(t){const c=await e.readdir(t,{withFileTypes:!0});for(const e of c){const c=o.join(t,e.name);"node_modules"!==e.name&&"compressed"!==e.name&&(e.isDirectory()?await s(c):e.isFile()&&a.includes(o.extname(e.name).toLowerCase())&&n.push(c))}}return await s(t),n}(s);if(0===r.length)return void console.log(t.yellow("当前目录下没有找到图片文件"));console.log(t.cyan(`找到 ${r.length} 个图片文件`));const l=new Map;for(const o of r){const t=await e.stat(o);l.set(o,t.size)}for(const a of r){const r=o.relative(s,a),g=o.parse(a).name,p=o.parse(a).ext.toLowerCase(),f=o.join(i,o.dirname(r),`${g}${p}`);try{await e.mkdir(o.dirname(f),{recursive:!0});const s=await n(a).metadata();let i=n(a);switch(p){case".jpg":case".jpeg":i=i.jpeg({quality:80,mozjpeg:!0});break;case".png":i=i.png({quality:80,compressionLevel:9,palette:!0});break;case".webp":i=i.webp({quality:80,effort:6});break;case".gif":i=i.gif()}await i.toFile(f);const g=l.get(a)||0,m=(await e.stat(f)).size,w=((g-m)/g*100).toFixed(2);console.log(t.green(`✓ ${r}`)),console.log(t.gray(` 尺寸: ${s.width}x${s.height}`)),console.log(t.gray(` ${c(g)}${c(m)} (节省 ${w}%)`))}catch(e){console.error(t.red(`× 处理失败: ${r}`),e)}}const g=Array.from(l.values()).reduce(((e,o)=>e+o),0),p=await async function(t){let n=0;async function a(t){const s=await e.readdir(t,{withFileTypes:!0});for(const c of s){const s=o.join(t,c.name);if(c.isDirectory())await a(s);else if(c.isFile()){const o=await e.stat(s);n+=o.size}}}return await a(t),n}(i),f=((g-p)/g*100).toFixed(2);console.log(t.green("\n压缩完成!")),console.log(t.cyan(`原始总大小: ${c(g)}`)),console.log(t.cyan(`压缩后总大小: ${c(p)}`)),console.log(t.cyan(`总节省空间: ${f}%`)),console.log(t.cyan(`输出目录: ${i}`))}catch(e){console.error(t.red("处理失败:"),e)}}function c(e){const o=["B","KB","MB","GB"];let t=e,n=0;for(;t>=1024&&n<o.length-1;)t/=1024,n++;return`${t.toFixed(2)} ${o[n]}`}export{s as compressImages};