问题描述
IE11下报如下错误:[vuex] vuex requires a Promise polyfill in this browser.
问题出现的环境背景及自己尝试过哪些方法
开发一直在 chrome 下没有发现出问题,今天在ie下测试发现报了兼容性错误,
类似symbol
不存在的错
于是就在项目中尝试添加 polyfill
根据官方文档:
// babel.config.js
module.exports = {
presets: [
['@vue/app', {
polyfills: [
'es6.promise',
'es6.symbol'
]
}]
]
}
这里有个坑!! presets: [[]]
,两个括号..
然后就出现了这个错误:[vuex] vuex requires a Promise polyfill in this browser.
然后翻了Stack Overflow
和 vue-cli github issue
发现 vue-cli issue 这个issue 跟我遇到的问题差不多,有两个解决方案:
1.
vue-class-component 的问题
vuejs/vue-class-component#283
暂时先回退 vue-class-component 到 6.2.0 可以解决问题
2.Fixed in vue-class-component v6.3.2
然后我很懵逼,这个 vue-class-component
包怎么才能升级或回退呢.我找遍整个项目都没有找到这个包~~
然后又找到这个 issue
解决方案是 添加 import "es6-promise/auto"
尝试后依然无效..
最后尝试 升级 "@vue/cli-plugin-babel": "^3.1.1",
依然没有解决问题!
还有一个解决方案是 :
entry: {
app: ["babel-polyfill", "./src/main.js"]
}
这个项目是用的 vue-cli3 构建的 多页应用,总不能在没个 入口都配置一遍吧...
我最终妥协了,为每个页面入口都配置了:{ entry: [ '@babel/polyfill', 'xxx/index.js' ]
结果被无情的拒绝:TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type object
我现在很绝望...
最终解决方案是:
babel.config.js
在入口文件最上方添加
import '@babel/polyfill'
实测能够兼容到
IE10
然后在
public/index.html
(模板)head
添加:<meta name="renderer" content="webkit|ie-comp|ie-stand">
首先强制浏览器使用webkit内核(极速内核)
如果浏览器没有webkit内核,则按照用户浏览器所支持的最新的ie的trident内核渲染页面(ie兼容内核)
否则按照当前浏览器的标准内核渲染(ie标准内核)
注:我认为这种方案比较hack.. 会包含了一些没有用到的
polyfill
所以最终的包大小可能会增加。vue-cli 3.x
有个现代模式
测试后发现ie
可以了,chrome
不行..这个下来需要继续测试。感谢 @努力学会微笑,及其他答友。