zoukankan      html  css  js  c++  java
  • [Javascript AST] 1. Continue: Write a simple Babel plugin

    We want to write a Babel Plugin, which move 'const versionRegex = /(/d+).(/d+).(/d+)/gi' out of function scope and put it into global scope.

    Code:

    function getVersion(versionString) {
     const versionRegex = /(d+).(d+).(d+)/gi
     var x = /foo/.text('thing')
     const [, major, minor, patch] = versionRegex.exec(versionString)
     return {major, minor, patch}
    }

    AST:

    export default function (babel) {
      const { types: t } = babel;
      
      return {
        name: "ast-transform", // not required
        visitor: {
          RegExpLiteral(path) {
            // We only want to locate 
            // const versionRegex = /(d+).(d+).(d+)/gi
            // NOT
            // var x = /foo/.text('thing')
            // for versionRegex, because it is a VariableDeclarator, it has init prop
            // for /foo/, it is under MemeberExpression's object prop
            if(path.parentKey !== 'init') {
              return;
            } 
            
            // Now we locate const versionRegex = /(d+).(d+).(d+)/gi
            // we want to generate a unqi id for id
            const program = path.find(parent => parent.isProgram())
            const variableDeclarator = path.find(parent => parent.isVariableDeclarator())
            const variableDeclaration = path.find(parent => parent.isVariableDeclaration())
            const {
                node: {
                    id: {name: originalName}
                }
            } = variableDeclarator
            const newName = program.scope.generateUidIdentifier(originalName)
            console.log(variableDeclaration)
            // rename the versionRegex
            path.scope.rename(newName.name, originalName)
            
            // move the regex out of function scope
            // create new versionRegex variable out of function scope
            // and assign the value to it
            const newVariableDeclaration = t.variableDeclaration(variableDeclaration.node.kind, [
                t.variableDeclarator(newName, path.node)
            ])
            program.node.body.unshift(newVariableDeclaration)
            // last remove the old one
            variableDeclarator.remove()
    
            
          }
        }
      };
    }

  • 相关阅读:
    Mysql查看所有表的数据量
    Mysql存储过程查询数据插入别的表里。
    MYSQL查看最大连接数和修改最大连接数
    Centos7 安装字体库&中文字体
    docker-部署elk-6.1.3
    confluence输入数学公式之mathjax
    elasticsearch安装ansj分词器
    mongorestore 一次踩雷
    let‘s encrypt之nginx-https没有小锁
    微服务预想
  • 原文地址:https://www.cnblogs.com/Answer1215/p/7583317.html
Copyright © 2011-2022 走看看