chore(手动): 针对已经压缩的代码,手动去除console 相关语句

This commit is contained in:
2025-12-29 10:00:00 +08:00
parent fba563f034
commit 5eed46c27e
36 changed files with 345 additions and 43 deletions

View File

@@ -1,6 +1,8 @@
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const { minify } = require('terser');
// 定义项目根目录
const rootDir = __dirname;
@@ -10,6 +12,18 @@ const distDir = path.join(rootDir, 'dist');
const excludeDirs = ['node_modules', '.git', 'dist', '.vscode', 'scripts'];
const excludeFiles = ['.gitignore', 'package-lock.json', 'yarn.lock', 'release.js', 'README.md'];
// 统计信息变量
let totalJsOriginalSize = 0;
let totalJsCompressedSize = 0;
let jsFileCount = 0;
const jsSizeDetails = [];
// 存储包含console语句的JS文件
const filesWithConsole = [];
// 存储压缩错误的JS文件
const filesWithCompressionError = [];
// 存储压缩后仍含console语句的JS文件
const filesWithConsoleAfterCompression = [];
// 获取当前日期用于生成zip文件名格式YYYY-MM-DD
function getCurrentDate() {
const now = new Date();
@@ -35,12 +49,44 @@ function compressWxml(content) {
return content;
}
// 定义js压缩函数 - 安全处理已压缩文件,去除真正多余的内容
function compressJs(content) {
let result = content;
return result;
// 定义js压缩函数 - 使用Terser去除console语句
function compressJs(content, filePath) {
return content;
try {
// 使用Terser进行压缩
const result = minify(content, {
compress: {
drop_console: true, // 去除所有console语句
drop_debugger: true, // 去除debugger语句
dead_code: true,
passes: 3 // 增加压缩次数
},
mangle: false, // 不混淆变量名,保持代码可读性
output: {
ascii_only: true, // 确保输出ASCII字符
comments: false // 去除所有注释
}
});
if (result.error) {
console.warn('Terser compression failed for', filePath, ':', result.error.message);
if (filePath && !filesWithCompressionError.includes(filePath)) {
filesWithCompressionError.push(filePath);
}
return content; // 出错时返回原始内容
}
return result.code || content;
} catch (error) {
console.warn('Error in compressJs for', filePath, ':', error.message);
if (filePath && !filesWithCompressionError.includes(filePath)) {
filesWithCompressionError.push(filePath);
}
return content; // 捕获异常时返回原始内容
}
}
// 定义css压缩函数
function compressCss(content) {
// 移除单行注释
@@ -75,6 +121,38 @@ function compressJson(content) {
}
}
// 输出JS文件压缩统计结果
function outputJsCompressionStats() {
if (jsFileCount === 0) {
console.log('\nNo JS files were processed.');
return;
}
console.log('\n=== JS File Compression Statistics ===');
// 输出每个文件的详细信息
console.log('\nIndividual File Statistics:');
jsSizeDetails.forEach(file => {
console.log(`${file.path}`);
console.log(` Original: ${file.originalSize} bytes`);
console.log(` Compressed: ${file.compressedSize} bytes`);
console.log(` Saved: ${file.sizeDiff} bytes (-${file.compressionRatio}%)`);
console.log('');
});
// 计算整体统计信息
const totalSaved = totalJsOriginalSize - totalJsCompressedSize;
const overallRatio = totalJsOriginalSize > 0 ? (totalSaved / totalJsOriginalSize * 100).toFixed(2) : '0.00';
// 输出整体统计结果
console.log('=== Overall JS Compression Results ===');
console.log(`Total JS files processed: ${jsFileCount}`);
console.log(`Total original size: ${totalJsOriginalSize} bytes`);
console.log(`Total compressed size: ${totalJsCompressedSize} bytes`);
console.log(`Total saved: ${totalSaved} bytes (-${overallRatio}%)`);
console.log('=====================================');
}
// 递归复制目录并压缩文件wxml, js, css, json
function copyAndCompressDir(sourceDir, targetDir) {
// 创建目标目录
@@ -113,9 +191,41 @@ function copyAndCompressDir(sourceDir, targetDir) {
} else if (extname === '.js') {
// 压缩js文件
content = fs.readFileSync(sourcePath, { encoding: 'utf8' });
compressedContent = compressJs(content);
// 检测是否包含console语句
const hasConsole = /console\.(log|warn|error|info|debug|trace|table|dir|time|timeEnd)/i.test(content);
if (hasConsole) {
filesWithConsole.push(sourcePath);
}
compressedContent = compressJs(content, sourcePath);
// 检测压缩后是否仍包含console语句
const hasConsoleAfterCompression = /console\.(log|warn|error|info|debug|trace|table|dir|time|timeEnd)/i.test(compressedContent);
if (hasConsoleAfterCompression) {
filesWithConsoleAfterCompression.push({ sourcePath, targetPath });
}
fs.writeFileSync(targetPath, compressedContent, { encoding: 'utf8' });
console.log(`Compressed and copied: ${sourcePath}`);
// 统计JS文件大小变化
const originalSize = Buffer.from(content).length;
const compressedSize = Buffer.from(compressedContent).length;
const sizeDiff = originalSize - compressedSize;
const compressionRatio = originalSize > 0 ? (sizeDiff / originalSize * 100).toFixed(2) : '0.00';
totalJsOriginalSize += originalSize;
totalJsCompressedSize += compressedSize;
jsFileCount++;
jsSizeDetails.push({
path: sourcePath,
originalSize,
compressedSize,
sizeDiff,
compressionRatio
});
console.log(`Compressed and copied: ${sourcePath} - ${originalSize}${compressedSize} bytes (-${compressionRatio}%)`);
} else if (extname === '.css') {
// 压缩css文件
content = fs.readFileSync(sourcePath, { encoding: 'utf8' });
@@ -194,7 +304,7 @@ function main() {
try {
// 解析命令行参数
const args = process.argv.slice(2);
const keepDist = args.includes('--keep-dist') || args.includes('-k');
const keepDist = args.includes('--keep-dist') || args.includes('-k') || true;
// 清理dist目录如果存在且不保留
if (fs.existsSync(distDir)) {
@@ -210,6 +320,9 @@ function main() {
copyAndCompressDir(rootDir, distDir);
console.log('Files copied and compressed successfully!');
// 输出JS文件压缩统计结果
outputJsCompressionStats();
// 生成zip文件名格式POCT检测分析平台-定制化-YYYY-MM-DD-mp-weixin.zip
const currentDate = getCurrentDate();
const zipFileName = `POCT检测分析平台-定制化-${currentDate}-mp-weixin.zip`;
@@ -227,6 +340,43 @@ function main() {
console.log('\nAll tasks completed successfully!');
console.log(`Dist directory: ${distDir}`);
console.log(`Zip file: ${zipPath}`);
// 输出包含console语句的JS文件列表
if (filesWithConsole.length > 0) {
console.log('\n=== JS Files with Console Statements ===');
console.log(`Found ${filesWithConsole.length} file(s) containing console statements:`);
filesWithConsole.forEach(file => {
console.log(`- ${file}`);
});
console.log('======================================');
} else {
console.log('\nNo JS files contain console statements.');
}
// 输出压缩错误的JS文件列表
if (filesWithCompressionError.length > 0) {
console.log('\n=== JS Files with Compression Errors ===');
console.log(`Found ${filesWithCompressionError.length} file(s) with compression errors:`);
filesWithCompressionError.forEach(file => {
console.log(`- ${file}`);
});
console.log('======================================');
} else {
console.log('\nNo JS files had compression errors.');
}
// 输出压缩后仍含有console语句的JS文件列表
if (filesWithConsoleAfterCompression.length > 0) {
console.log('\n=== JS Files with Console Statements After Compression ===');
console.log(`Found ${filesWithConsoleAfterCompression.length} file(s) still containing console statements after compression:`);
filesWithConsoleAfterCompression.forEach((file, index) => {
console.log(`\n${index + 1}. Source: ${file.sourcePath}`);
console.log(` Target: ${file.targetPath}`);
});
console.log('\n=================================================');
} else {
console.log('\nNo JS files contain console statements after compression.');
}
} catch (error) {
console.error('Error occurred:', error);
process.exit(1);