babel-polyfill的幾種使用方式

前言

preset與plugin的關係:html

  • preset中已經包含了一組用來轉換ES6+的語法的插件,若是隻使用少數新特性而非大多數新特性,能夠不使用preset而只使用對應的轉換插件
  • babel默認只轉換語法,而不轉換新的API,如需使用新的API,還須要使用對應的轉換插件或者polyfill

例如,默認狀況下babel能夠將箭頭函數class等語法轉換爲ES5兼容的形式,可是卻不能轉換MapSetPromise等新的全局對象,這時候就須要使用polyfill去模擬這些新特性node

1. 使用轉換插件: babel-plugin-transform-xxx

  • 使用方法
    • 缺啥補啥,在package.json添加所需的依賴babel-plugin-transform-xxx
    • .babelrc中的plugins項指定使用babel-plugin-transform-xxx插件
    • 代碼中不須要顯式import/require, .babelrc中不須要指定useBuiltIns, webpack.config.js中不須要作額外處理,一切由babel插件完成轉換
  • 優勢
    • 做用域是模塊,避免全局衝突
    • 按需引入,避免沒必要要引入形成及代碼臃腫
  • 缺點
    • 每一個模塊內單獨引用和定義polyfill函數,形成了重複定義,使代碼產生冗餘

配置完一個轉換插件後, 代碼中每一個使用這個API的地方的代碼都會被轉換成使用polyfill中實現的代碼webpack

2. 使用插件 babel-runtime 與 babel-plugin-tranform-runtime

相比方法1, 至關於抽離了公共模塊, 避免了重複引入, 從一個叫core.js的庫中引入所需polyfill(一個國外大神用ES3寫的ES5+ polyfill)web

  • 使用方法
    • package.json中添加依賴babel-plugin-tranform-runtime以及 babel-runtime
    • .babelrc中配置插件:"plugins": ["transform-runtime"]
    • 接下來, 代碼中能夠直接使用ES6+的新特性,無需import/require額外東西, webpack也不須要作額外配置
  • 優勢
    • 無全局污染
    • 依賴統一按需引入(polyfill是各個模塊共享的), 無重複引入, 無多餘引入
    • 適合用來編寫lib(第三方庫)類型的代碼
  • 缺點
    • polyfill的對象是臨時構造並被import/require的,並非真正掛載到全局
    • 因爲不是全局生效, 對於實例化對象的方法,如[].include(x), 依賴於Array.prototype.include仍沒法使用

3. 全局babel-polyfill(不使用useBuiltIns)

  • 使用方法
    • 法3.1: (瀏覽器環境)單獨在html的<head>標籤中引入babel-polyfill.js(CDN或本地文件都可)
    • 法3.2: 在package.json中添加babel-polyfill依賴, 在webpack配置文件增長入口: 如entry: ["babel-polyfill",'./src/app.js'], polyfill將會被打包進這個入口文件中, 並且是放在文件最開始的地方
    • 法3.3: 在package.json中添加babel-polyfill依賴, 在webpack入口文件頂部使用import/require引入,如`import 'babel-polyfill'``
  • 優勢
    • 一次性解決全部兼容性問題,並且是全局的,瀏覽器的console也可使用
  • 缺點
    • 一次性引入了ES6+的全部polyfill, 打包後的js文件體積會偏大
    • 對於現代的瀏覽器,有些不須要polyfill,形成流量浪費
    • 污染了全局對象
    • 不適合框架或庫的開發

4. 全局babel-polyfill(使用babel-preset-env插件和useBuiltIns屬性)

  • 使用方法
    • packge.json引入依賴babel-preset-env
    • .babelrc中使用配置preset-env
    • 指定useBuiltins選項爲true
    • 指定瀏覽器環境或node環境, 配置須要兼容的瀏覽器列表
    • webpack入口文件中使用import/require引入polyfill, 如import 'babel-polyfill'
    • 以上配置完成以後, babel會根據指定的瀏覽器兼容列表自動引入全部所需的polyfill, 無論你代碼中有沒有使用
  • .babelrc示例
{
  "presets": [ ["env", { "modules": false, "targets": { "browsers": ["ie >=9"] }, "useBuiltIns": true, "debug": true }] ] } 
  • 優勢
    • 按需(按照指定的瀏覽器環境所需)引入polyfill, 必定程度上減小了沒必要要polyfill的引入json

    • 配置簡單, 無需對webpack作額外的配置瀏覽器

    • 注意:babel

      • 不可與方法3混用,不然會引發衝突
      • 全局方式要保證polyfill在全部其它腳本以前被執行(首行import或者設置爲html的第一個<head>標籤)

5. polyfill.io

  • 一個CDN方式提供的polyfill, 可根據瀏覽器UserAgent自動返回合適的polyfill, 詳細內容自行google
做者:榮兒飛 連接:https://www.jianshu.com/p/3b27dfc6785c 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
相關文章
相關標籤/搜索