cocos3dx web反编译 第三篇

cocos3dx web反编译 第三篇

这篇讲述的是获取全部脚本文件,优化后存入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
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容