zoukankan      html  css  js  c++  java
  • ast babeljs --2( 数组替换)

    https://www.cnblogs.com/gaoyongjian/p/13246736.html

    // 将js代码转换成AST
    const { parse } = require("@babel/parser");
    // 用来遍历AST中的节点
    const traverse = require("@babel/traverse").default;
    // AST转换成js
    const generator = require("@babel/generator").default;
    // 用来判断节点类型和生成新的节点
    const t = require("@babel/types");
    const fs = require("fs");
    
    const jscode = fs.readFileSync("./demo.js", {
        encoding: "utf-8"
    });
    let ast = parse(jscode);
    
    //some function code
    const visitor =
    {
        VariableDeclarator(path) {
            // 还原数组对象
            const { id, init } = path.node;
            // 非Array或者没有元素, 返回
            if (!t.isArrayExpression(init) || init.elements.length === 0) return;
    
            let elements = init.elements;
    
            // 获取binding实例
            const binding = path.scope.getBinding(id.name);
    
            for (const ref_path of binding.referencePaths) {
                // 获取 MemberExpression 父节点
                let member_path = ref_path.findParent(p => p.isMemberExpression());
    
                if (member_path == null) continue;
                let property = member_path.get('property');
    
                // 索引值不是 NumericLiteral 类型的不处理
                if (!property.isNumericLiteral()) {
                    continue;
                }
    
                // 获取索引值
                let index = property.node.value;
    
                // 获取索引值对应的节点, 并替换
                let arr_ele = elements[index];
                member_path.replaceWith(arr_ele)
            }
        }
    }
    
    
    traverse(ast, visitor);
    
    let code = generator(ast).code;
    
    fs.writeFile('./demoNew.js', code, (err) => { });
  • 相关阅读:
    逻辑学的基本运算
    第一性原理:First principle thinking是什么?
    人类认识的基本技能
    编程的本质:简化+抽象+再现
    区块链
    信号、系统、传递、树
    MVVM
    数据驱动 状态驱动
    事件与状态机 事件驱动编程
    数据一致性举例:登录系统
  • 原文地址:https://www.cnblogs.com/angdh/p/14405766.html
Copyright © 2011-2022 走看看