记录 react+antd 兼容 ie8 的一些坑
因为毕设要求兼容ie8,所以这几天先把整个开发框架搭出来了,我整理过后会发出来
配置主要参考了以下链接:
- https://github.com/xcatliu/react-ie8
- https://github.com/brickspert/react-family-ie8
- https://github.com/ant-design/antd-init
React
首先,ReactV15不支持ie8,所以我只能妥协使用0.14的版本,由于ie8一些功能的缺失,需要引入一些库:
es5-shim
:es5兼容库es3ify-loader
:解决es3语法兼容问题es6-promise
:promise的一个polyfillconsole-polyfill
:由于ie8的奇葩特性,在打开控制台时才会有console属性,所以console也需要一个polyfill
antd
接着,我引入了antd
,最开始我使用的时0.12.x版本
引入后报错,发现antd依赖的一个库Velocity.js在低版本的ie下需要jq辅助,遂在全局引入jq
继续测试时发现,在build之后,icon显示不正常,诡异的是,字体文件是向file://也就是本地文件请求,但应该通过http请求才对,查看源码,它的css文件中font-face的属性是src:url('//at.alicdn.com/xxxxx'),我自己写了一个css文件加上了https,覆盖了这个style,解决了这个问题。 最后,我把antd升级到了^1.11.6版本,其font-face的src: url('https://at.alicdn.com/xxxx'), 已经加上了https,就不用多管了。
router
本来我是想自己写一个router的,但图方便,还是看看router的兼容性怎么样
最开始,我直接引入了react-router-dom
@^4.2.2,报了Exception thrown and not caught的错,一看,是代码里出现了Object.defineProperty
,这个方法很坑,模拟不了,加什么polyfill都没用,司徒正美说通过VBScript实现了,我没深究,感兴趣的可以研究一下。出现Object.defineProperty
是因为babel把export * from 'xxx
这种格式的代码转化为Object.defineProperty
实现了。
我看了下react-router-dom
的源码,很规矩的先引入再输出,并没有连在一起,但在其依赖库的history中出现了这种代码:
export { createLocation, locationsAreEqual } from './LocationUtils'
最后被babel转成了Object.defineProperty
,
我当时想了两种解决方法,一是改源码,二是降级,最后我选择了降级,使用了react-router
@2.3.0,不过这个版本的react-router
写起来很难受,地址后面还要跟一串字符,体验很差。
一个简单的框架就搭起来了,但这才是刚刚开始,后续根据需求会考虑引入redux
等,我在ie8开发中遇到的坑也会持续更新在这篇文章中