From 18bc663f04a3c739c3e34a9942a2a187e26a7614 Mon Sep 17 00:00:00 2001 From: lirtual Date: Fri, 20 Dec 2024 16:23:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E4=B8=BA=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=E5=9B=BE=E7=9B=B4=E6=8E=A5=E6=9B=BF=E6=8D=A2=E5=8E=9F?= =?UTF-8?q?=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/optimize-images.js | 58 +++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/scripts/optimize-images.js b/scripts/optimize-images.js index d602e0b8b63..cdca8f09bee 100644 --- a/scripts/optimize-images.js +++ b/scripts/optimize-images.js @@ -10,7 +10,6 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const sourceDir = 'public/images'; -const outputDir = 'dist/images'; const SMALL_FILE_THRESHOLD = 5 * 1024; // 5KB // 动态计算最佳参数 @@ -81,7 +80,7 @@ async function calculateOptimalParams() { } // 检测是否在RAM disk上 - const isRamDisk = await checkIfRamDisk(outputDir); + const isRamDisk = await checkIfRamDisk(sourceDir); return { batchSize, @@ -134,15 +133,13 @@ function formatBytes(bytes) { // 工作线程逻辑 if (!isMainThread) { - const { files, sourceDir, outputDir, isRamDisk } = workerData; + const { files, sourceDir, isRamDisk } = workerData; async function optimizeImage(inputPath) { const relativePath = path.relative(sourceDir, inputPath); - const outputPath = path.join(outputDir, relativePath); - const outputDirPath = path.dirname(outputPath); + const tempPath = `${inputPath}.temp`; try { - await fs.mkdir(outputDirPath, { recursive: true }); const inputStats = await fs.stat(inputPath); const isSmallFile = inputStats.size < SMALL_FILE_THRESHOLD; @@ -164,7 +161,7 @@ if (!isMainThread) { colors: 128, dither: 0.4 }) - .toFile(outputPath); + .toFile(tempPath); } else { await sharpInstance .png({ @@ -175,21 +172,36 @@ if (!isMainThread) { dither: 0.4, effort: 10 }) - .toFile(outputPath); + .toFile(tempPath); } - const outputStats = await fs.stat(outputPath); - if (outputStats.size > inputStats.size) { - await fs.copyFile(inputPath, outputPath); + const outputStats = await fs.stat(tempPath); + if (outputStats.size < inputStats.size) { + // 如果优化后的文件更小,则替换原文件 + await fs.rename(tempPath, inputPath); + return { + success: true, + inputSize: inputStats.size, + outputSize: outputStats.size, + path: relativePath + }; + } else { + // 如果优化后的文件更大,则删除临时文件 + await fs.unlink(tempPath); + return { + success: true, + inputSize: inputStats.size, + outputSize: inputStats.size, + path: relativePath, + skipped: true + }; } - - return { - success: true, - inputSize: inputStats.size, - outputSize: Math.min(inputStats.size, outputStats.size), - path: relativePath - }; } catch (error) { + // 清理临时文件 + try { + await fs.unlink(tempPath); + } catch {} + return { success: false, path: relativePath, @@ -221,10 +233,6 @@ else { console.log(`RAM Disk: ${optimalParams.isRamDisk ? '是' : '否'}`); console.log('==================================\n'); - // 清空输出目录 - await fs.rm(outputDir, { recursive: true, force: true }); - await fs.mkdir(outputDir, { recursive: true }); - // 获取所有PNG文件 const files = await glob(path.join(sourceDir, '**/*.png')); const totalFiles = files.length; @@ -236,6 +244,7 @@ else { let totalOptimizedSize = 0; let successCount = 0; let failCount = 0; + let skippedCount = 0; const startTime = Date.now(); const results = []; @@ -257,7 +266,6 @@ else { workerData: { files: currentBatch, sourceDir, - outputDir, isRamDisk: optimalParams.isRamDisk } }); @@ -304,6 +312,9 @@ else { successCount++; totalOriginalSize += result.inputSize; totalOptimizedSize += result.outputSize; + if (result.skipped) { + skippedCount++; + } } else { failCount++; console.error(`\n✗ 处理 ${result.path} 时出错:`, result.error); @@ -318,6 +329,7 @@ else { console.log('\n\n========== 优化结果报告 =========='); console.log(`处理总文件数: ${totalFiles}`); console.log(`成功处理: ${successCount} 个文件`); + console.log(`跳过处理: ${skippedCount} 个文件(优化后体积更大)`); console.log(`处理失败: ${failCount} 个文件`); console.log(`原始总大小: ${(totalOriginalSize / 1024 / 1024).toFixed(2)}MB`); console.log(`优化后总大小: ${(totalOptimizedSize / 1024 / 1024).toFixed(2)}MB`);