#!/usr/bin/env node const { minify: minifyHtml } = require('html-minifier-terser'); const { minify: minifyJs } = require('terser'); const CleanCSS = require('clean-css'); const fs = require('fs'); const path = require('path'); // 配置选项 const options = { collapseWhitespace: true, removeComments: true, removeEmptyAttributes: true, removeOptionalTags: true, removeRedundantAttributes: true, removeScriptTypeAttributes: true, removeStyleLinkTypeAttributes: true, minifyCSS: true, minifyJS: true, processScripts: ['application/json'], }; // CSS 压缩选项 const cssOptions = { level: 2 }; // 处理文件 async function minifyFile(inputPath, outputPath) { try { const ext = path.extname(inputPath).toLowerCase(); const content = fs.readFileSync(inputPath, 'utf8'); let minified; switch (ext) { case '.html': minified = await minifyHtml(content, options); break; case '.js': const result = await minifyJs(content); minified = result.code; break; case '.css': minified = new CleanCSS(cssOptions).minify(content).styles; break; default: throw new Error(`Unsupported file type: ${ext}`); } fs.writeFileSync(outputPath, minified); console.log(`✓ Minified ${path.basename(inputPath)} -> ${path.basename(outputPath)}`); } catch (err) { console.error(`✗ Error processing ${inputPath}:`, err); process.exit(1); } } // 主函数 async function main() { // 获取命令行参数,跳过前两个参数(node和脚本路径) const files = process.argv.slice(2); if (files.length === 0) { console.error('No input files specified'); process.exit(1); } const staticDir = path.join(__dirname, '..', 'static'); for (const file of files) { const inputPath = path.join(staticDir, file); const ext = path.extname(file); const outputPath = path.join( staticDir, file.replace(ext, `.min${ext}`) ); await minifyFile(inputPath, outputPath); } } main();