react出现的兼容性问题。
react兼容所有主流浏览器,但是对于IE9和IE10需要加入polyfill代码。但是需要在业务代码中显示引入,不太友好,所以探索了一下。
preset-env。
为高版本javascript提供兼容低版本浏览器的代码。
常用选项:
- browsers,指定需要兼容哪些浏览器的那些版本,浏览器列表,兼容性查询工具。注:就Babel的兼容性查询而言caniuse不可靠,这里是根据。
- include,如果使用useBuildIns位usage模式可能会在这里碰到坑,本来文档写的是可以强制引入没有检测到但是我们需要的polyfill代码,但是usage模式的引入早于include而且文档没有更新,看如下结论:
useBuildIns,包含三个值entry、usage、false。
- entry,在入口文件引入全部的polyfill。优点是彻底解决兼容问题,缺点是导致最终代码体积比较大。
- usage,根据代码的使用情况引入polyfill。优点是按需引入代码体积减小很多,缺点是node_modules中的高版本javascript检测不出来,引入不了polyfill。
- false,不添加polyfill也不解决兼容问题。
可以看到三个值都有一些缺点,需要一种既能按需引入又能解决node_modules中兼容问题的方案。
preset-env的无法对依赖包中的代码polyfill。
- 在webpack的babel-loader中配置include包含node_modules,但是导致打包时间超长( node_modules中的代码太多了),而且引入polyfill的时候不是引入到入口文件中导致引入重复的问题。
- 在babel的GitHub的issue中发现的一种方案,自己写插件,强制把需要的core-js模块引入到入口文件。
- polyfill.io与动态引入polyfill。
方案:在项目中插入脚本,把浏览器的UA信息附着到请求中,然后在服务端分析UA对应的浏览器,然后返回对应的polyfill。
polyfill.io是更优秀的方案,能解决浏览器兼容问题,而且对资源体积也不会浪费,缺点是对需要兼容的浏览器会引入所有polyfill。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。