怎麼給新手科普Babel:polyfill/preset-env/plugin-transform-runtime

原文:www.yuque.com/xiezhongfu/…node

@babel/polyfill

更多內容參見: babeljs.io/docs/en/bab…webpack

Babel 7.4.0 開始,這個包已通過時了,源碼直接引入了 corejs 和 regenerator
git

image.png

圖片源地址: github.com/babel/babel…

  • 應用代碼裏可使用,工具庫就不該該使用(下文會介紹@babel/plugin-transform-runtime)
  • 模擬了 ES6+ 環境(不包括:Stage 0/1/2/3)
  • 在程序的入口處添加,一勞永逸
  • 由於是在各 prototype 上添加 poliyfill 方法,會致使全局污染

進化方案

  1. @babel/preset-env + useBuiltIns (下文會介紹)
  2. 你本身手動單獨導入你須要的 polyfill 子包

共有 2 個替代方案,推薦使用第1個,第1個方案其實就是第二個方案的自動化版本。怎麼自動化呢?根據運行目標環境自動選擇須要哪些 polyfill 子包。具體見下。github

@babel/preset-env

更多內容參見: babeljs.io/docs/en/pre… babeljs.io/docs/en/bab…web

@babel/preset-env 基於一些牛逼的項目:browserslist,compat-table,electron-to-chromium,......
@babel/preset-env 自動適配設定的目標環境須要的 js 特性,Babel 轉換插件(不包含 stage-0/1/2/3的插件),corejs 的 poliyfill。自動適配能夠有選擇性的污染全局,固然也能夠不分青紅皁白所有轉換到ES5,具體參見:babeljs.io/docs/en/bab…json

你須要掌握在 webpack 中如何自定義配置 @babel/preset-env,掌握  @babel/preset-env + useBuiltIns 替代 @babel/polyfill 的配置。 babel

方案1

  • 安裝 @babel/polyfill
  • 在 .babelrc 中配置useBuiltIns: 'usage'

方案2

  • 安裝 @babel/polyfill
  • 在應用入口處引入@babel/polyfill
  • 在 .babelrc 中配置useBuiltIns: 'entry'

方案3

  • 安裝 @babel/polyfill
  • 在 .babelrc 中配置useBuiltIns: 'false' ,這是默認行爲
  • 在 webpack 配置的入口處添加 @babel/polyfill

@babel/plugin-transform-runtime

更多內容參見: babeljs.io/docs/en/bab… github.com/babel/babel…electron

術語解釋

helper:好比 Babel 使用 _extend 函數把一個對象的屬性複製到另外一個對象上,這裏的 _extend 就是 helper函數

有了前兩個技術方案,爲何還會出個 @babel/plugin-transform-runtime 呢?工具

  • 你不想污染全局
  • 你想在一個工具庫中使用
  • 默認 helper 函數會在須要的文件中都被聲明或定義一次,不只浪費並且無法跨文件支持

@babel/plugin-transform-runtime 提供了一個沙盒環境,使用一些高版本 js 特性時會指向到 corejs,沒有污染全局,可是由於沒有在 prototype 上作 polyfill,一些高版本 js 的實例方法就無法使用了,好比:Array.prototype.includes 。

@babel/plugin-transform-runtime 讓全部的 helper 函數都指向 @babel/runtime 組件,這樣節省空間還能跨文件支持,方便統一管理。這也就要求 @babel/runtime 須要預先安裝。

配置

在 .babelrc 配置文件裏,帶着默認參數的配置

{
  "plugins": [
    [
      "@babel/plugin-transform-runtime",
      {
        "absoluteRuntime": false,
        "corejs": false,
        "helpers": true,
        "regenerator": true,
        "useESModules": false
      }
    ]
  ]
}
複製代碼

corejs

從 "corejs": false 這個默認參數能夠看出,@babel/plugin-transform-runtime 假定全部的 polyfill 須要用戶本身提供:

image.png

圖片來源: github.com/babel/babel…

總結下:

  • 配置 corejs 爲 3,須要預先安裝 @babel/runtime-corejs3
  • 配置 corejs 爲 2,須要預先安裝 @babel/runtime-corejs2
  • 配置 corejs 爲 false,須要預先安裝 @babel/runtime

absoluteRuntime

Babel 默認會從 node_modules  加載已經配置安裝的 @babel/runtime 某個版本。absoluteRuntime 參數就是修改這個默認行爲的,能夠具體指定從哪裏加載相應的 @babel/runtime。

其餘配置項的解釋參見:babeljs.io/docs/en/bab…

相關文章
相關標籤/搜索