使用方法:
package.json - scripts 添加一条命令
"sharp": "node script/sharp.js"
脚本代码:
const sharp = require('sharp');
const fs = require('fs');
const path = require('path');
// 定义图片格式
const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif'];
// 压缩图片
function compressImage(filePath) {
// 获取文件扩展名
const extension = path.extname(filePath);
// 判断是否为图片格式
if (!imageExtensions.includes(extension)) {
return;
}
// 读取图片
const oldsize = fs.statSync(filePath).size;
try {
const image = sharp(filePath).png({ quality: 10 })
// 获取图片元数据
image.metadata().then(metadata => {
// 将图片转换为buffer
image.toBuffer().then(buffer => {
// 将buffer写入文件
fs.writeFileSync(filePath, buffer);
const newSize = fs.statSync(filePath).size;
console.log(`压缩图片成功,原大小:${oldsize},新大小:${newSize}`);
});
});
} catch (error) {
console.log('压缩图片失败', error);
}
}
// 遍历目录
function traverseDirectory(directoryPath) {
// 获取目录下的所有文件
const files = fs.readdirSync(directoryPath);
// 遍历文件
files.forEach(file => {
// 获取文件路径
const filePath = path.join(directoryPath, file);
// 获取文件状态
const stats = fs.statSync(filePath);
// 判断是否为目录
if (stats.isDirectory()) {
// 如果是目录,则继续遍历
// 只遍历src目录
if (filePath.includes('/src')) {
traverseDirectory(filePath);
}
} else {
// 如果是文件,则判断是否为src文件下的文件
if (filePath.includes('/src/')) {
// 获取文件扩展名
const fileType = path.extname(filePath)
// 判断是否为图片格式
const isImage = imageExtensions.includes(fileType);
// 如果是图片格式,则压缩图片
if (isImage) {
compressImage(filePath);
} else {
// console.log('不是图片格式', filePath);
}
}
}
});
}
// 遍历项目目录
traverseDirectory(path.join(__dirname, '../'));