pref: 代码打包优化
This commit is contained in:
129
optimize-images.js
Normal file
129
optimize-images.js
Normal file
@@ -0,0 +1,129 @@
|
||||
// 图片优化脚本 - 使用sharp压缩PNG图片
|
||||
const sharp = require('sharp');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// 需要优化的大图片列表 (> 500KB)
|
||||
const LARGE_IMAGES = [
|
||||
'CoverImage.png',
|
||||
'BasicImage.png',
|
||||
'teams-image.png',
|
||||
'hand-background.png',
|
||||
'basic-auth.png',
|
||||
'BgMusicCard.png',
|
||||
'Landing2.png',
|
||||
'Landing3.png',
|
||||
'Landing1.png',
|
||||
'smart-home.png',
|
||||
'automotive-background-card.png'
|
||||
];
|
||||
|
||||
const IMG_DIR = path.join(__dirname, 'src/assets/img');
|
||||
const BACKUP_DIR = path.join(IMG_DIR, 'original-backup');
|
||||
|
||||
// 确保备份目录存在
|
||||
if (!fs.existsSync(BACKUP_DIR)) {
|
||||
fs.mkdirSync(BACKUP_DIR, { recursive: true });
|
||||
}
|
||||
|
||||
console.log('🎨 开始优化图片...');
|
||||
console.log('================================\n');
|
||||
|
||||
let totalBefore = 0;
|
||||
let totalAfter = 0;
|
||||
let optimizedCount = 0;
|
||||
|
||||
async function optimizeImage(filename) {
|
||||
const srcPath = path.join(IMG_DIR, filename);
|
||||
const backupPath = path.join(BACKUP_DIR, filename);
|
||||
|
||||
if (!fs.existsSync(srcPath)) {
|
||||
console.log(`⚠️ 跳过: ${filename} (文件不存在)`);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// 获取原始大小
|
||||
const beforeStats = fs.statSync(srcPath);
|
||||
const beforeSize = beforeStats.size;
|
||||
totalBefore += beforeSize;
|
||||
|
||||
// 备份原始文件
|
||||
if (!fs.existsSync(backupPath)) {
|
||||
fs.copyFileSync(srcPath, backupPath);
|
||||
}
|
||||
|
||||
// 读取图片元数据
|
||||
const metadata = await sharp(srcPath).metadata();
|
||||
|
||||
// 优化策略:
|
||||
// 1. 如果宽度 > 2000px,缩放到 2000px
|
||||
// 2. 压缩质量到 85
|
||||
// 3. 使用 pngquant 算法压缩
|
||||
let pipeline = sharp(srcPath);
|
||||
|
||||
if (metadata.width > 2000) {
|
||||
pipeline = pipeline.resize(2000, null, {
|
||||
withoutEnlargement: true,
|
||||
fit: 'inside'
|
||||
});
|
||||
}
|
||||
|
||||
// PNG优化
|
||||
pipeline = pipeline.png({
|
||||
quality: 85,
|
||||
compressionLevel: 9,
|
||||
adaptiveFiltering: true,
|
||||
force: true
|
||||
});
|
||||
|
||||
// 保存优化后的图片
|
||||
await pipeline.toFile(srcPath + '.tmp');
|
||||
|
||||
// 替换原文件
|
||||
fs.renameSync(srcPath + '.tmp', srcPath);
|
||||
|
||||
// 获取优化后的大小
|
||||
const afterStats = fs.statSync(srcPath);
|
||||
const afterSize = afterStats.size;
|
||||
totalAfter += afterSize;
|
||||
|
||||
// 计算节省的大小
|
||||
const saved = beforeSize - afterSize;
|
||||
const percent = Math.round((saved / beforeSize) * 100);
|
||||
|
||||
if (saved > 0) {
|
||||
optimizedCount++;
|
||||
console.log(`✅ ${filename}`);
|
||||
console.log(` ${Math.round(beforeSize/1024)} KB → ${Math.round(afterSize/1024)} KB`);
|
||||
console.log(` 节省: ${Math.round(saved/1024)} KB (-${percent}%)\n`);
|
||||
} else {
|
||||
console.log(`ℹ️ ${filename} - 已经是最优化状态\n`);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error(`❌ ${filename} 优化失败:`, error.message);
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
// 依次优化每个图片
|
||||
for (const img of LARGE_IMAGES) {
|
||||
await optimizeImage(img);
|
||||
}
|
||||
|
||||
console.log('================================');
|
||||
console.log('📊 优化总结:\n');
|
||||
console.log(` 优化前总大小: ${Math.round(totalBefore/1024/1024)} MB`);
|
||||
console.log(` 优化后总大小: ${Math.round(totalAfter/1024/1024)} MB`);
|
||||
|
||||
const totalSaved = totalBefore - totalAfter;
|
||||
const totalPercent = Math.round((totalSaved / totalBefore) * 100);
|
||||
|
||||
console.log(` 节省空间: ${Math.round(totalSaved/1024/1024)} MB (-${totalPercent}%)`);
|
||||
console.log(` 成功优化: ${optimizedCount}/${LARGE_IMAGES.length} 个文件\n`);
|
||||
console.log('✅ 图片优化完成!');
|
||||
console.log(`📁 原始文件已备份到: ${BACKUP_DIR}\n`);
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
Reference in New Issue
Block a user