vue-cli是否为IE11转译/填充/垫片async/await?标准模板代码兼容吗?
关于vue-cli与IE11下async/await兼容性的解答
问题一:vue-cli是否会针对IE11对async/await语法进行转译、polyfill(填充)或shim(垫片)处理?
答案是取决于你的项目配置,核心行为可以拆成两部分来看:
- 语法转译:如果你的项目
browserslist配置中包含IE11(比如创建项目时勾选了"支持IE11",或者手动修改package.json里的browserslist字段加入IE 11),vue-cli默认的babel预设@vue/app会自动把async/await转译为IE11能解析的ES5代码。毕竟async/await属于ES2017语法,IE11完全不认识,转译是让代码在IE11跑起来的基础。 - Polyfill支持:光转译语法还不够——async/await底层依赖ES6的Generator函数,而IE11同样不支持Generator。这时候vue-cli会自动引入
regenerator-runtime这个polyfill(只要你没修改默认的polyfill配置),它会为IE11补上Generator函数的运行环境,确保转译后的async/await代码能正常执行。
如果你的项目手动设置了useBuiltIns: false(在babel配置里),或者主动排除了相关polyfill,那IE11里还是会出问题,但标准的vue create模板默认不会这么配置。
问题二:使用标准vue create模板时,如下代码能否在IE11中正常运行?
async toggleSettings({ dispatch }) { if (await dispatch('confirm')) { // etc } }
这里要分两种场景:
- 默认的标准模板(未勾选IE11支持):不能正常运行。因为默认的
browserslist配置明确排除了IE11,vue-cli不会做任何针对IE11的转译和polyfill处理。这段代码里的async/await语法会直接被打包进产物,IE11遇到这些未转译的ES2017语法会直接抛出语法错误。 - 勾选了"支持IE11"的标准模板/手动修改
browserslist加入IE11:可以正常运行。此时vue-cli会自动完成前面提到的语法转译和regenerator-runtime的polyfill引入,转译后的代码能在IE11里正确执行async/await的逻辑。
另外补充一点:确保dispatch('confirm')返回的是一个Promise(你用了await,应该已经注意到这一点了),这个是代码逻辑的要求,和IE11兼容性无关。
内容的提问来源于stack exchange,提问作者softcode
相关产品推荐
相关产品推荐

