()
| 259 | |
| 260 | // 主函数 |
| 261 | async function optimizeImages() { |
| 262 | BuildLogger.log('🚀 开始图片优化...'); |
| 263 | BuildLogger.log(`📁 输入目录: ${config.inputDir}`); |
| 264 | BuildLogger.log(`📁 输出目录: ${config.outputDir}`); |
| 265 | BuildLogger.log(`⚡ 并发数: ${config.maxConcurrent}`); |
| 266 | |
| 267 | // 确保输出目录存在 |
| 268 | ensureOutputDir(); |
| 269 | |
| 270 | // 检查输入目录是否存在 |
| 271 | if (!fs.existsSync(config.inputDir)) { |
| 272 | BuildLogger.warn(' 输入目录不存在,创建示例目录: ${config.inputDir}'); |
| 273 | fs.mkdirSync(config.inputDir, { recursive: true }); |
| 274 | |
| 275 | // 创建示例文件 |
| 276 | const examplePath = path.join(config.inputDir, 'example.txt'); |
| 277 | fs.writeFileSync(examplePath, '请将需要优化的图片文件放在此目录中'); |
| 278 | BuildLogger.log(`📝 已创建示例文件: ${examplePath}`); |
| 279 | return; |
| 280 | } |
| 281 | |
| 282 | const files = fs.readdirSync(config.inputDir); |
| 283 | const imageFiles = files.filter(isImageFile); |
| 284 | |
| 285 | if (imageFiles.length === 0) { |
| 286 | BuildLogger.warn(' 未找到图片文件'); |
| 287 | return; |
| 288 | } |
| 289 | |
| 290 | BuildLogger.log(`📸 找到 ${imageFiles.length} 个图片文件`); |
| 291 | |
| 292 | const startTime = Date.now(); |
| 293 | const results = await processImagesInBatches(imageFiles); |
| 294 | const duration = ((Date.now() - startTime) / 1000).toFixed(2); |
| 295 | |
| 296 | // 生成清单 |
| 297 | generateManifest(); |
| 298 | |
| 299 | BuildLogger.log(`\n🎉 优化完成!`); |
| 300 | BuildLogger.log(`⏱️ 用时: ${duration}秒`); |
| 301 | BuildLogger.success(' 成功: ${results.successful}'); |
| 302 | BuildLogger.log(`⏭️ 跳过: ${results.skipped}`); |
| 303 | BuildLogger.error(' 失败: ${results.failed}'); |
| 304 | if (results.totalSavings > 0) { |
| 305 | const avgSavings = (results.totalSavings / results.successful).toFixed(1); |
| 306 | BuildLogger.log(`💾 平均节省空间: ${avgSavings}%`); |
| 307 | } |
| 308 | BuildLogger.log(`📁 输出目录: ${config.outputDir}`); |
| 309 | |
| 310 | if (results.failed > 0) { |
| 311 | BuildLogger.warn(' 有 ${results.failed} 个文件处理失败'); |
| 312 | process.exit(1); |
| 313 | } |
| 314 | } |
| 315 | |
| 316 | // 命令行参数处理 |
| 317 | const args = process.argv.slice(2); |
no test coverage detected