关于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

相关文章
相关标签/搜索