babel 與 AST

babel原理

  • parse把代碼code 變成 ast
  • traverse 遍歷ast 進(jìn)行修改
  • generate 把a(bǔ)st變成代碼code2
  • code ->> ast -->> ast2 --> code2
// 舉個(gè)??
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 為什么表示源代碼 因?yàn)槭前言创a字符串表示成一個(gè)樹形結(jié)構(gòu)
// ast -->> ast2
// 將ast 里面所有變量聲明的let 轉(zhuǎn)換為 var 
// 如果采用正則 那么難以區(qū)分 變量聲明的let 和 值'let'  
// 在將代碼轉(zhuǎn)換為ast以后 可以遍歷ast 根據(jù) node.type 去判斷  是否為variableDeclaration (變量聲明)
traverse(ast, {
    enter: item => {
       if( item.node.type  ==  'VariableDeclaration'){
           if(item.node.kind === 'let'){
               item.node.kind = 'var'
           }
       }
    }
})
//  將最新的ast 轉(zhuǎn)換為代碼
// ast2 -->> code2
const result = generate(ast, {}, code)
console.log(result.code)

為什么要用ast

  • 很難用正則表達(dá)式來替換
  • 需要識別每個(gè)單詞的意思 才能做到只修改用于聲明變量的let
  • 而ast可以明確的告訴你每個(gè)let 的意思

babel工具

  • babel 可以把高級代碼翻譯我ES5
  • @babel/parser
  • @babel/traverse
  • @babel/generator
  • @babel/core 包含前三者
  • @babel/preset-env 內(nèi)置很多規(guī)則
  • 如果使用babel/core 則上面的??可以變?yōu)橄旅娴男问?/li>
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)

循環(huán)依賴

  • 有的循環(huán)依賴可以正常執(zhí)行
  • 有的循環(huán)依賴不可以
  • 但都可以做靜態(tài)分析
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Babel babel 的原理 parse: 把代碼 code 變成 ASTtraverse: 遍歷 AST 進(jìn)行...
    sweetBoy_9126閱讀 845評論 0 1
  • babel的原理 parse:把代碼code變成AST traverse:遍歷AST進(jìn)行修改 generate:把...
    左冬的博客閱讀 913評論 0 0
  • babel 與 AST 先從Babel 說起 babel 的原理1、parse:把代碼 code 變成 AST2、...
    littleyu閱讀 1,225評論 0 1
  • Babel 是 JavaScript 的轉(zhuǎn)譯器。用于將 ES Next 的代碼轉(zhuǎn)換成瀏覽器或者其他環(huán)境支持的代碼。...
    一蓑煙雨任平生_cui閱讀 640評論 0 0
  • 1.babel babel是個(gè)什么玩意? Babel本質(zhì)上是一個(gè)編輯器,也就是個(gè)“翻譯官”的角色,比如樹醬聽不懂西...
    涅槃快樂是金閱讀 444評論 0 1

友情鏈接更多精彩內(nèi)容