[Javascript] 編譯: Babel


Babel 外掛程式原理的理解與深入
https://segmentfault.com/a/1190000016359110

Babel是如何讀懂JS代碼的
https://zhuanlan.zhihu.com/p/27289600

剖析Babel——Babel總覽
http://www.alloyteam.com/2017/04/analysis-of-babel-babel-overview/

史上最清晰易懂的babel配置解析
https://segmentfault.com/a/1190000018721165

Babel 7 升級實踐
https://blog.hhking.cn/2019/04/02/babel-v7-update/

Polyfill 方案的過去、現在和未來
https://github.com/sorrycc/blog/issues/80

Babel 你太美。。。
https://juejin.im/post/5d47cfa3f265da03ba322720

@babel/plugin-transform-runtime
https://www.babeljs.cn/docs/babel-plugin-transform-runtime

( 開篇 )仿寫'Vue生態'系列___'你webpack溜麼?'
https://segmentfault.com/a/1190000020026163

Babel 工程化的實現
https://vivaxyblog.github.io/2019/11/19/how-babel-is-built-cn.html

解剖Babel —— 向前端架構師邁出一小步

babel轉譯過程分為三個階段。這三步具體是:
1.解析 Parse
將代碼解析生成抽象語法樹( 即AST ),也就是電腦理解我們代碼的方式(擴展:一般來說每個 js 引擎都有自己的 AST,比如熟知的 v8,chrome 流覽器會把 js 源碼轉換為抽象語法樹,再進一步轉換為位元組碼或機器代碼),而 babel 則是通過 babylon 實現的 。簡單來說就是一個對於 JS 代碼的一個編譯過程,進行了詞法分析與語法分析的過程。

2.轉換 Transform
對於 AST 進行變換一系列的操作,babel 接受得到 AST 並通過 babel-traverse 對其進行遍歷,在此過程中進行添加、更新及移除等操作。

3.生成 Generate
將變換後的 AST 再轉換為 JS 代碼, 使用到的模組是 babel-generator。

而 babel-core 模組則是將三者結合使得對外提供的API做了一個簡化。此外需要注意的是,babel 只是轉譯新標準引入的語法,比如ES6箭頭函數:而新標準引入的新的原生物件,部分原生物件新增的原型方法,新增的 API 等(Proxy、Set 等), 這些事不會轉譯的,需要引入對應的 polyfill 來解決。

babel預設情況下preset-env什麼都不需要配置,此時他轉換所有es6+的代碼,然而我們可以提供一個targets配置項指定運行環境,例如"targets": "ie >= 8",此時就只有ie8以上版本流覽器不支援的語法才會被轉換。

或是給preset-env添加一個useBuiltIns配置項,值可以是entry和usage,假如是entry,會在入口處把所有ie8以上流覽器不支持api的polyfill引入進來,也就是需再瞭解@babel/polyfill起因與運作範疇。

@babel/polyfill 主要針對es6+規範,增加包括新的語法和新的api,而因新增的語法是可以用babel來transform的,但是新的api只能被polyfill,因此需要我們安裝@babel/polyfill。

#Babel, polyfill, transform, compiler, AST, 編譯


留言