共计 965 个字符,预计需要花费 3 分钟才能阅读完成。
最近接手一个 React 项目,在 IE 下碰到了俩问题
IE11 报错如下:
跟踪一下之后,发现是一些其他的 npm 包里面用到了 startsWith 这个方法,可以自己 polyfill 一下:
if (!String.prototype.startsWith) {
String.prototype.startsWith = function (search, pos) {
return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search
}
}
不过加 prototype 的方法毕竟不好,可以通过引入 @babel/polyfill 解决,在入口文件中引入 import ‘@babel/polyfill’;
IE11 问题解决后,IE10 又出问题了。。。
犯了 stackoverflow 和 github 的很多帖子之后,在这个帖子里找到,发现是 Object.setPrototypeOf 的问题,Object.setPrototypeOf 说是支持了 IE9-11, 实际在源码里只实现了 11+(https://github.com/paulmillr/…
解决办法可以是在 polyfill url 后加上 excludes=Object.setPrototypeOf, 或者自己实现 Object.setPrototypeOf 方法,我这里引入了一个库 setprototypeof,然后在入口文件中加上 Object.setPrototypeOf = require(‘setprototypeof’);
其实这个库里的实现代码非常少, 可以简单看下
‘use strict’
/* eslint no-proto: 0 */
module.exports = Object.setPrototypeOf || ({__proto__: [] } instanceof Array ? setProtoOf : mixinProperties)
function setProtoOf (obj, proto) {
obj.__proto__ = proto
return obj
}
function mixinProperties (obj, proto) {
for (var prop in proto) {
if (!obj.hasOwnProperty(prop)) {
obj[prop] = proto[prop]
}
}
return obj
}