记录一次前端JS项目兼容IE的解决方案

268 阅读2分钟

最近新启动了一个项目,由于项目不算复杂,顺便就把前端这块也负责了,整体流程搞完之后,发现在IE浏览器无法正常运行,而项目又要求兼容IE,于是在网上寻找解决方案,这一找,发现搜索的内容结果基本都在四五年前,基本都过时了,不过有一点可以确定,要想兼容IE,必须用上 ‘Babel’(一个JavaScript编译器,一个工具链,主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中)

Babel各种插件的对应关系如下:

image.png

@babel/polyfill

@babel/polyfill是以前推荐的 polyfill 工具,集成了 regenerator-runtime + core-js2 + 管理配置选项,我们项目脚手架就是默认用的这种方式,该方式目前缺陷明显(很多新的ES6语法无法进行转换,例如Promise方法等,还需要额外引进插件(如promise-polyfill等),而不同的插件有可能导致相互影响,造成代码全局污染),官方在 Babel 7.4 之后不再推荐使用 @babel/polyfill,而 @babel/preset-env 和 plugin-transform-runtime 二者都可以通过 corejs 来处理 polyfill

@babel/polyfill废弃的主要原因有:

  • 此包仅仅是引入了 stable core-jsregenerator-runtime/runtime,其中后者可以使用插件 @babel/plugin-transform-regenerator 代替。
  • 此包不能从core-js@2 平滑过渡到 core-js@3。从7.4版本开始,虽然@babel/polyfill还会更新,但它内部的core-js包版将一直使用2.x,无法使用core-js 3.x中新增的补丁代码,例如数组的includes方法等。

因此官方建议直接安装 core-jsregenerator-runtime 这两个包。 由于项目采用的是Rollup打包,所以在rollup.config.jsplugins指定babel插件,如下所示( 这里要注意的是,Rollup 默认不会使用 Babel 来转换你的代码,除非你明确地在 Rollup 的配置中告诉它要这样做。开始的时候只是按照官方的方案在 babel.config.json 里进行了配置,但未生效,踩了一天的坑...

在此基础上,再结合使用@babel/plugin-transform-runtime会开启对 Babel 注入的辅助函数的复用,也就是将core-js(也就是提供polyfill的能力)交给@babel/plugin-transform-runtime处理,以节省代码体积,这些辅助函数被统一隔离在@babel/runtime中提供的helper模块中,避免全局代码污染。注意下,官方文档有说明,使用@babel/plugin-transform-runtime就不能再通过配置useBuiltIns选项来提供polyfill的能力去支持按需加载

image.png

image.png

image.png

最后附上Babel官方链接:www.babeljs.cn/docs/