babel原理(babel+polyfill)

babel:
https://zhuanlan.zhihu.com/p/85915575
https://www.cnblogs.com/75115926/p/12627009.html
polyfill:
https://zhuanlan.zhihu.com/p/71640183
chatgpt

babel是一個(gè)轉(zhuǎn)譯器,它只是把同種語(yǔ)言的高版本規(guī)則翻譯成低版本規(guī)則
主要分為三個(gè)階段

  • 解析:將代碼字符串解析成抽象語(yǔ)法樹(shù)(AST)
  • 轉(zhuǎn)換:對(duì)抽象語(yǔ)法樹(shù)進(jìn)行轉(zhuǎn)換操作(使用插件,添加、刪除、修改AST節(jié)點(diǎn)),得到新的抽象語(yǔ)法樹(shù)
  • 再建:根據(jù)變換后的抽象語(yǔ)法樹(shù)再生成代碼字符串

babel只是轉(zhuǎn)譯新標(biāo)準(zhǔn)引入的語(yǔ)法,比如ES6的箭頭函數(shù)轉(zhuǎn)譯成ES5的函數(shù);而新標(biāo)準(zhǔn)引入的新的原生對(duì)象,部分原生對(duì)象新增的原型方法,新增的API等(如Proxy、Set等),這些babel是不會(huì)轉(zhuǎn)譯的。需要用戶自行引入polyfill來(lái)解決

Polyfill(補(bǔ)丁)解決上面,新標(biāo)準(zhǔn)引入的新的原生對(duì)象,部分原生對(duì)象新增的原型方法,新增的API等(如Proxy、Set等)

babel 最重要的包(其實(shí)由多個(gè)npm包組成,但下面的更重要)

  • @babel/core: babel的核心包,包含了babel的轉(zhuǎn)換引擎、插件管理器、AST等,是使用babel的必備包
  • @babel/preset-env: bable的預(yù)設(shè)包,提供了對(duì)不同js版本的支持,可以通過(guò)配置自動(dòng)轉(zhuǎn)換js版本
  • babel-loader: webpack中使用的babel插件,用于在webpack構(gòu)建時(shí)自動(dòng)轉(zhuǎn)換js代碼,常用語(yǔ)構(gòu)建react程序

babel 常用的插件

  • @babel/plugin-transform-arrow-functions:將es6箭頭函數(shù)轉(zhuǎn)化為傳統(tǒng)函數(shù)
  • @babel/preset-react:用于支持react應(yīng)用程序的預(yù)設(shè)包,提供了jsx轉(zhuǎn)換功能
  • @babel/polyfill:提供ES6+特性的墊片,可以在不支持這些特性的環(huán)境中使用
  • @babel/runtime:提供了運(yùn)行時(shí)輔助庫(kù),支持babel轉(zhuǎn)換的代碼在不同環(huán)境中運(yùn)行

在入口處導(dǎo)入polyfill,因?yàn)閜olyfill代碼需要在所有其他代碼前先被調(diào)用

polyfill和runtime區(qū)別

  • 作用范圍不同。runtime是在代碼轉(zhuǎn)換時(shí)使用,包含了運(yùn)行時(shí)輔助函數(shù),幫助轉(zhuǎn)換后的代碼在不同環(huán)境中運(yùn)行,polyfill在運(yùn)行時(shí)使用,包含了一些墊片,在不支持es6+語(yǔ)法的環(huán)境中,模擬這些語(yǔ)法
  • 體積不同。runtime更輕量級(jí)!!!它包含了轉(zhuǎn)換后代碼所需的輔助函數(shù),而polyfill包含了整個(gè)es6+語(yǔ)法的實(shí)現(xiàn)
  • 使用方式不同。runtime需要借助babel轉(zhuǎn)換功能,通過(guò)在代碼中插入轉(zhuǎn)換后的輔助函數(shù),實(shí)現(xiàn)功能,polyfill可以直接作為依賴引入,不需要任何轉(zhuǎn)換
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 背景 Javascript屬于web編程語(yǔ)言,本身語(yǔ)法設(shè)計(jì)存在缺陷,隨著ES5、ES6、ES7等各個(gè)版本的推出,語(yǔ)...
    薔薇心情閱讀 2,366評(píng)論 0 0
  • 前言 半年前也寫過(guò)一篇babel的簡(jiǎn)單使用文章,當(dāng)時(shí)看了下babel的文檔,但是很多地方還不理解,所以文章里沒(méi)有怎...
    mercurygear閱讀 46,329評(píng)論 9 100
  • 本文會(huì)對(duì)babel文檔[https://www.babeljs.cn/docs/]文檔從一個(gè)推導(dǎo)角度來(lái)闡述每個(gè)ba...
    joyer_li閱讀 727評(píng)論 0 0
  • babel官網(wǎng) babel 介紹 Babel 是一個(gè)通用的多用途 JavaScript 編譯器。通過(guò) Babel ...
    鋒享前端閱讀 1,931評(píng)論 0 10
  • Babel 是 JavaScript 的轉(zhuǎn)譯器。用于將 ES Next 的代碼轉(zhuǎn)換成瀏覽器或者其他環(huán)境支持的代碼。...
    一蓑煙雨任平生_cui閱讀 640評(píng)論 0 0

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