【W(wǎng)ebpack】AST衫樊、babel、依賴

babel

babel的原理

1利花、parse:把代碼變成AST
2科侈、traverse:遍歷AST進(jìn)行修改;
3炒事、generate:把AST變成代碼2

看下AST到底是什么東西

node -r ts-node/register --inspect-brk xxx.ts: 加上--inspect-brk就可以用Chrome 開發(fā)者工具來調(diào)試 Node 程序臀栈;不加--inspect-brk就直接運(yùn)行在終端里;
這時直接打開一個控制臺挠乳,等一下权薯,就會看到左邊出現(xiàn)nodejs的logo,點(diǎn)擊它睡扬,得到圖1盟蚣,已經(jīng)翻譯成js代碼了;

圖1.png

AST.png

圖2.png

圖3.png

根據(jù)上面幾張圖卖怜,我們可以大概知道AST是怎么來存儲值的了屎开;

把let變成var

import { parse } from '@babel/parser';
import traverse from '@babel/traverse';
import generate from '@babel/generator';

const code = `let a = 'let'; let b = 5;`
const ast = parse(code, {sourceType: 'module'})  //這一步會得到一個AST

traverse(ast, {
    enter: item => {
        if(item.node.type === 'VariableDeclaration'){
            if(item.node.kind === 'let'){
                item.node.kind = 'var'
            }
        }
    }
})

const result = generate(ast, {}, code)
console.log(result.code);
image.png

這時我們再看parse>traverse>generate這三步,大概就明白是什么意思了马靠;

那可以把代碼自動轉(zhuǎn)成es5嗎

答:當(dāng)然可以奄抽,使用@babel/core@babel/preset-env 即可

  • 上面我們把let變成var是通過@babel/traverse的traverse先對AST進(jìn)行遍歷修改,再通過@babel/generator的generate把修改后的AST變成代碼甩鳄;
  • 這次試驗中逞度,我們就不單獨(dú)使用@babel/traverse@babel/generator了,我們使用@babel/core妙啃,它里面包含了traverse和generate的功能档泽;
  • @babel/preset-env的功能是把代碼從es6變成es5;
  • 下圖中babel.transformFromAstSync()可以把AST變成代碼揖赴,相當(dāng)于traversegenerate兩個步驟了茁瘦;
import { parse } from '@babel/parser';
import * as babel from '@babel/core';
import * as fs from 'fs';

const code = fs.readFileSync('./test.js').toString()
const ast = parse(code, {sourceType: 'module'})  //這一步會得到一個AST
const result = babel.transformFromAstSync(ast, code, {
    presets: ['@babel/preset-env']
})

fs.writeFileSync('./test.es5.js', result.code)

分析index.js中的依賴

  • 怎么去識別import呢,通過AST的item.node.type === 'ImportDeclaration'

遞歸地分析嵌套依賴

總結(jié)

AST相關(guān)

1储笑、parse:把代碼變成AST甜熔;
2、traverse:遍歷AST進(jìn)行修改突倍;
3腔稀、generate:把AST變成代碼2盆昙;

工具

使用babel可以把一些高級代碼翻譯成es5

  • @babel/parser
  • @babel/traverse
  • @babel/generator
  • @babel/core 它包含前面三個
  • @babel/preset-env 內(nèi)置了很多規(guī)則

代碼技巧

  • 使用哈希表來存儲數(shù)據(jù)(哈希表是數(shù)據(jù)結(jié)構(gòu)中的術(shù)語,在JS中一個對象可以看成是一個哈希表)焊虏;
  • 通過檢測key來避免重復(fù)記錄依賴淡喜;

循環(huán)依賴

  • 循環(huán)依賴就是a.js引用了b.js,b.js又引用了a.js诵闭,就這么一直循環(huán)下去....
  • 有的循環(huán)依賴可以正常執(zhí)行炼团;
  • 有的循環(huán)依賴不可以;
  • 但是都可以做靜態(tài)分析(靜態(tài)分析:不需要執(zhí)行代碼疏尿,只去做字面上的分析)瘟芝;
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市褥琐,隨后出現(xiàn)的幾起案子锌俱,更是在濱河造成了極大的恐慌,老刑警劉巖敌呈,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贸宏,死亡現(xiàn)場離奇詭異,居然都是意外死亡磕洪,警方通過查閱死者的電腦和手機(jī)吭练,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來析显,“玉大人鲫咽,你說我怎么就攤上這事〗虚牛” “怎么了浑侥?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵姊舵,是天一觀的道長晰绎。 經(jīng)常有香客問我,道長括丁,這世上最難降的妖魔是什么荞下? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮史飞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己枉圃,他們只是感情好齐帚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吐绵,像睡著了一般迹淌。 火紅的嫁衣襯著肌膚如雪河绽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天唉窃,我揣著相機(jī)與錄音耙饰,去河邊找鬼。 笑死纹份,一個胖子當(dāng)著我的面吹牛苟跪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔓涧,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼件已,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蠢笋?” 一聲冷哼從身側(cè)響起拨齐,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昨寞,沒想到半個月后瞻惋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡援岩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年歼狼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片享怀。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡羽峰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出添瓷,到底是詐尸還是另有隱情梅屉,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布鳞贷,位于F島的核電站坯汤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搀愧。R本人自食惡果不足惜惰聂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咱筛。 院中可真熱鬧搓幌,春花似錦、人聲如沸迅箩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饲趋。三九已至拐揭,卻和暖如春罢缸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背投队。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工枫疆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敷鸦。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓息楔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扒披。 傳聞我的和親對象是個殘疾皇子值依,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容