chore(手动): 针对已经压缩的代码,手动去除console 相关语句
This commit is contained in:
164
release.js
164
release.js
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user