这篇讲述的是获取全部脚本文件,优化后存入scrip文件夹中
const fs = require('fs');
const path = require('path');
const esprima = require('esprima');
const estraverse = require('estraverse');
const escodegen = require('escodegen');
const prettier = require('prettier');
// 源文件夹(assets 文件夹)
const assetsDir = path.join(__dirname, 'assets');
// 目标文件夹(script 文件夹)
const scriptDir = path.join(__dirname, 'script');
// 确保 script 文件夹存在
if (!fs.existsSync(scriptDir)) {
fs.mkdirSync(scriptDir, { recursive: true });
}
// 优化代码的函数
async function optimizeCode(code) {
try {
const ast = esprima.parseScript(code);
// 遍历 AST 进行优化操作
estraverse.traverse(ast, {
enter: function (node) {
// 这里可以添加更多复杂的优化逻辑,比如转换 System.register 等
// 示例:简单处理,这里暂时不做实际转换,仅作为框架
if (node.type === 'CallExpression' && node.callee.name === 'System.register') {
// 可以在这里进行 System.register 到 ES6 模块的转换逻辑
// 这是一个复杂的操作,需要根据具体需求实现
}
}
});
// 生成优化后的代码
let optimizedCode = escodegen.generate(ast);
// 使用 prettier 进行代码格式化
optimizedCode = await prettier.format(optimizedCode, { parser: 'babel' });
return optimizedCode;
} catch (error) {
console.error('代码解析或生成出错:', error);
return code; // 出错时返回原始代码
}
}
// 递归遍历文件夹处理 JS 文件
async function traverseDirectoryForJS(sourceDir) {
const files = fs.readdirSync(sourceDir);
let hasJsFiles = false;
for (const file of files) {
const filePath = path.join(sourceDir, file);
const fileStat = fs.statSync(filePath);
if (fileStat.isDirectory()) {
// 递归处理子文件夹
const subHasJsFiles = await traverseDirectoryForJS(filePath);
if (subHasJsFiles) {
hasJsFiles = true;
}
} else if (path.extname(file) === '.js') {
hasJsFiles = true;
// 计算相对路径
const relativePath = path.relative(assetsDir, sourceDir);
const targetDir = path.join(scriptDir, relativePath);
// 确保目标文件夹存在
if (!fs.existsSync(targetDir)) {
fs.mkdirSync(targetDir, { recursive: true });
}
// 读取文件内容
const originalCode = fs.readFileSync(filePath, 'utf8');
// 优化代码
const optimizedCode = await optimizeCode(originalCode);
const destinationPath = path.join(targetDir, file);
// 写入优化后的代码
fs.writeFile(destinationPath, optimizedCode, (err) => {
if (err) {
console.error(`写入文件 ${destinationPath} 时出错:`, err);
} else {
console.log(`已优化并复制 JS 文件 ${file} 到 ${destinationPath}`);
}
});
}
}
return hasJsFiles;
}
// 开始遍历 assets 文件夹处理 JS 文件
if (fs.existsSync(assetsDir)) {
traverseDirectoryForJS(assetsDir).catch((error) => {
console.error('处理 JS 文件时出错:', error);
});
} else {
console.log('assets 文件夹不存在');
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END







暂无评论内容