美文网首页
babel 与 AST

babel 与 AST

作者: 大脸猫_2e21 | 来源:发表于2022-04-01 15:44 被阅读0次

babel原理

  • parse把代码code 变成 ast
  • traverse 遍历ast 进行修改
  • generate 把ast变成代码code2
  • code ->> ast -->> ast2 --> code2
// 举个🌰
import { parse } from "@babel/parser"
import traverse from "@babel/traverse"
import generate from "@babel/generator"
// code ->> ast -->> ast2 -->> code2
const code = `let a = 'let'; let b = 2`
const ast = parse(code, { sourceType: 'module' })
//  code -->> ast
console.log(ast)  // ast 为什么表示源代码 因为是把源代码字符串表示成一个树形结构
// ast -->> ast2
// 将ast 里面所有变量声明的let 转换为 var 
// 如果采用正则 那么难以区分 变量声明的let 和 值'let'  
// 在将代码转换为ast以后 可以遍历ast 根据 node.type 去判断  是否为variableDeclaration (变量声明)
traverse(ast, {
    enter: item => {
       if( item.node.type  ==  'VariableDeclaration'){
           if(item.node.kind === 'let'){
               item.node.kind = 'var'
           }
       }
    }
})
//  将最新的ast 转换为代码
// ast2 -->> code2
const result = generate(ast, {}, code)
console.log(result.code)

为什么要用ast

  • 很难用正则表达式来替换
  • 需要识别每个单词的意思 才能做到只修改用于声明变量的let
  • 而ast可以明确的告诉你每个let 的意思

babel工具

  • babel 可以把高级代码翻译我ES5
  • @babel/parser
  • @babel/traverse
  • @babel/generator
  • @babel/core 包含前三者
  • @babel/preset-env 内置很多规则
  • 如果使用babel/core 则上面的🌰可以变为下面的形式
import { parse } from "@babel/parser"
import * as babel from '@babel/core'

const code = `let a = 'let'; let b = 2; const c = 3`
const ast = parse(code, { sourceType: 'module' })

const result = babel.transformFromAstSync(ast, code, {
    presets: ['@babel/preset-env']
})
console.log(result.code)

循环依赖

  • 有的循环依赖可以正常执行
  • 有的循环依赖不可以
  • 但都可以做静态分析

相关文章

  • AST、Babel、依赖

    babel 与 AST 先从Babel 说起 babel 的原理1、parse:把代码 code 变成 AST2、...

  • babel插件入门-AST

    目录 Babel简介 Babel运行原理 AST解析 AST转换 写一个Babel插件 Babel简介 Babel...

  • 一个bebel插件

    Babel它的原理,简单点说: Babel解析成AST,然后插件更改AST,最后由Babel输出代码

  • babel 与 AST

    babel原理 parse把代码code 变成 ast traverse 遍历ast 进行修改 generate ...

  • AST与babel

    AST 什么是ast ast又称抽象语法树,以树形结构描述代码,一般是json对象。与ast相关的操作通常有三...

  • 【Webpack】AST、babel、依赖

    babel babel的原理 1、parse:把代码变成AST2、traverse:遍历AST进行修改;3、gen...

  • vue3原理

    AST AST:抽象语法树,Abstract Syntax Tree。TypeScript、babel、webpa...

  • AST、Babel、依赖

    Babel babel 的原理 parse: 把代码 code 变成 ASTtraverse: 遍历 AST 进行...

  • babel 核心

    1.babel/core babel/core的作用 = babel/parser(词法分析+语法分析 = AST...

  • 深入webpack之babel 与 AST

    babel的原理 parse:把代码code变成AST traverse:遍历AST进行修改 generate:把...

网友评论

      本文标题:babel 与 AST

      本文链接:https://www.haomeiwen.com/subject/uvuajrtx.html