Babel入門

Babel 是一個工具集,主要用于將 ES6 版本的 JS 代碼轉為 ES5 等向后兼容的 JS 代碼:

  • 語法轉換(剪頭函數、async 語法、class、解構等)
  • 補齊 API(Promise、Map、Symbol 等,Array.find 等實例新方法)

常用包:

npm install --save-dev
    babel-loader // 供 WebPack 轉碼的 loader
    @babel/cli   // 命令行轉碼工具,依賴 core
    @babel/core  // 核心 npm 包
    @babel/preset-env  // 提供了 ES6 轉換 ES5 的語法轉換規則
    @babel/polyfill

配置文件(babel.config.js、.babelrc、.babelrc.js 或直接配置在 package.json 中的 babel 下):

module.exports = {
  // 預設,一組工具的集合
  presets: [
    // @babel/preset-env 的簡寫
    // ‘babel-preset-’可以不寫,‘@babel/preset-’不確定
    "@babel/env",
    "@babel/preset-react",
    "@babel/preset-typescript",
    ["@babel/需要參數的預設", { 參數: true }],
  ],
  // 插件
  plugins: [
    // babel-plugin-transform-decorators-legacy 的簡寫
    // ‘babel-plugin-’可以不寫。‘@babel/plugin-’不確定
    "transform-decorators-legacy",
  ],
};
  • 插件比預設先執行
  • 插件數組從前向后執行
  • 預設數組從后向前執行

預設

  • babel-preset-latest 是 Babel6 時代所有年代 preset 的集合(babel-preset-es2015、babel-preset-es2016、babel-preset-es2017),Babel7 下是 @babel/preset-env

  • @babel/preset-typescript TS 支持

  • @babel/preset-react@babel/preset-flow react 支持

插件

  • @babel/plugin-transform-runtime:復用 babel 注入的 helper 代碼

  • 從 babel7.4 開始,官方不推薦再使用 @babel/polyfill 了,因為它本身其實就是兩個 npm 包的集合:core-jsregenerator-runtime。官方推薦直接使用這兩個 npm 包。預設 @babel/preset-env中已經包含了這兩個包

polyfill

  • 單獨引入靜態的 polyfill.js

  • 引入 @babel/polyfill,它 由 core-js@2.X 與 regenerator-runtime 組合而成。

  • 引入 core-js/stableregenerator-runtime/runtime ,需要 npm install --save core-js regenerator-runtime 此時裝的是 core-js@3.X,2.X 下沒有 stable。

@babel/preset-env 配置

  1. browserslist
// package.json 或 .browserslistrc
"browserslist": [  // 指定代碼最終要運行環境
    "> 1%",        // 市場份額大于1%的瀏覽器
    "not ie <= 8"  // 不考慮IE8及以下
]

很多插件的配置是基于它的,比如 Autoprefixer、postcss 根據此自動增加 CSS 前綴。@babel/preset-env 在轉譯時也會讀取這個配置。

如果沒有此配置,Babel 會把所有 ES6 轉換 ES5

  1. targets:同 browserslist 配置,優先級高于 browserslist

  2. useBuiltInsfalse | usage | entry。"false" 手動引入,會將 polyfill 全部引入到最終的代碼里。"entry" 手動引入,根據目標環境引入。"usage" 自動引入,根據實際用到的 API 針對性引入。

    module.exports = {
        presets: [["@babel/env", { useBuiltIns: "usage" }]],
        plugins: []
    }
    
    npm install --save-dev @babel/cli @babel/core  @babel/preset-env
    npm install --save @babel/polyfill
    
  3. corejs2 | 3 此項當 useBuiltIns 不為 false 時生效。取值為 3 時需要單獨安裝 core-js@3

  4. modulesauto | amd | umd | systemjs | commonjs | cjs | false 是否把 ES6 的模塊化語法改成其它模塊化語法。ES6 模塊方便 Webpack 進行靜態分析(如 tree shaking 優化)

@babel/runtime 和 @babel/plugin-transform-runtime

@babel/runtime 用于把輔助函數們(polyfill 自己定義的 Promise 等)統一放入一個包里,以達到復用、減小最終包大小的目的。

@babel/plugin-transform-runtime:將最終包中的輔助函數們替換為 @babel/runtime 的統一包(打包后的引用地址為@babel/runtime/helpers/XXX)

npm install --save @babel/runtime
npm install --save-dev @babel/plugin-transform-runtime
// babel.config.js
{
    "presets": [
      "@babel/env"
    ],
    "plugins": [
      "@babel/plugin-transform-runtime"
    ]
}

@babel/plugin-transform-runtime 的第二個作用是**防止環境污染**:babel-polyfill 或 core-js/stable 與 regenerator-runtime/runtime 補齊 API 的方式是全局重新定義,環境原始的 API 會被覆蓋掉,稱為環境污染。此插件可以重命名 API,且不需要全局引入

使用此插件不再需要 babel-polyfill 或 core-js/stable 與 regenerator-runtime/runtime。

npm install --save @babel/runtime-corejs3
npm install --save-dev @babel/plugin-transform-runtime
    "plugins": [
      ["@babel/plugin-transform-runtime", {
        "corejs": 3
      }]
    ]

@babel/plugin-transform-runtime 的完整/默認配置:

    "plugins": [
      [
        "@babel/plugin-transform-runtime",
        {
          "helpers": true,          // 自動引入輔助函數包
          "corejs": false,                  // API轉換以避免污染全局環境
          "regenerator": true,          // Generator與async轉換API代碼
          "useESModules": false,        // 是否使用ES6的模塊化用法
          "absoluteRuntime": false,
          "version": "7.0.0-beta.0"
        }
      ]
    ]

關于版本,工具集圍繞 core 主包的版本號變化。包名為@babel/XX 的為 Babel7,包名為 babel-XX 的為 Babel6

參考: https://zhuanlan.zhihu.com/p/394781295

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容