關於ES6數組方法在低版本瀏覽器處理

1、背景

最近項目裏出現一個bug,低版本瀏覽器裏某個頁面報錯,Uncaught TypeError: Object [object Array] ha no method 'find'。
看到這個錯誤第一個反應是運用了ES6關於Array新API中的find函數。可是細想了下,明明用了Bable,爲啥不能編譯爲ES5。通過搜索資料找到了緣由,Babel 默認只轉碼 ES6 的新語法(syntax),而不轉換新的 API,好比 Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise 等全局對象,以及一些定義在全局對象上的方法(好比 Object.assign、Array.from)都不會轉碼。若是想讓這些方法運行,必須使用 babel-polyfill,爲當前環境提供一個墊片。html

2、全局babel-polyfill

使用babel-polyfill有如下幾種方式:node

  1. 單獨在html的<head>標籤中引入babel-polyfill.js(CDN或本地文件都可)
  2. 在package.json中添加babel-polyfill依賴, 在webpack配置文件增長入口: 如entry: ["babel-polyfill",'./src/app.js'], polyfill將會被打包進這個入口文件中, 並且是放在文件最開始的地方
  3. 在package.json中添加babel-polyfill依賴, 在webpack入口文件頂部使用import/require引入,如import 'babel-polyfill'`

優勢:

一次性解決全部兼容性問題,並且是全局的,瀏覽器的console也可使用webpack

缺點:

  1. 一次性引入了ES6+的全部polyfill, 打包後的js文件體積會偏大
  2. 對於現代的瀏覽器,有些不須要polyfill,形成流量浪費
  3. 污染了全局對象
  4. 不適合框架或庫的開發

3、優化解決辦法

方法一:polyfill.io

一個CDN方式提供的polyfill, 可根據瀏覽器UserAgent自動返回合適的polyfillweb

方法二:全局babel-polyfill(使用babel-preset-env插件和useBuiltIns屬性)

  1. packge.json引入依賴babel-preset-env
  2. .babelrc中使用配置preset-env
  3. 指定useBuiltins選項爲true
  4. 指定瀏覽器環境或node環境, 配置須要兼容的瀏覽器列表

在webpack入口文件中使用import/require引入polyfill, 如import 'babel-polyfill'
以上配置完成以後, babel會根據指定的瀏覽器兼容列表自動引入全部所需的polyfill, 無論你代碼中有沒有使用json

相關文章
相關標籤/搜索