#!/usr/bin/env node const { minify: minifyHtml } = require('html-minifier-terser'); const { minify: minifyJs } = require('terser'); const CleanCSS = require('clean-css'); const MarkdownIt = require('markdown-it'); 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 { let ext = path.extname(inputPath).toLowerCase(); if (ext === '.md') ext = '.html'; const filename = path.basename(inputPath); let content = fs.readFileSync(inputPath, 'utf8'); let minified; // 特殊处理 readme.html if (filename.toLowerCase() === 'readme.md') { const md = new MarkdownIt({ html: true, linkify: true, typographer: true }); const readmeMdPath = path.join(__dirname, '..', 'README.md'); const markdownContent = fs.readFileSync(readmeMdPath, 'utf8'); // 添加基本的 markdown 样式 const htmlContent = ` README ${md.render(markdownContent)} `; content = htmlContent; } 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) { // 特殊处理 README.md 的输入路径 let inputPath; let outputPath; if (file.toLowerCase() === 'readme.md') { inputPath = path.join(__dirname, '..', 'README.md'); outputPath = path.join(staticDir, 'readme.min.html'); } else { inputPath = path.join(staticDir, file); const ext = path.extname(file); outputPath = path.join( staticDir, file.replace(ext, `.min${ext}`) ); } await minifyFile(inputPath, outputPath); } } main();