Promise polyfill在通过Webpack babel loader添加时不适用于FireFox和IE11

Promise polyfill在通过Webpack babel loader添加时不适用于FireFox和IE11,webpack,babeljs,apollo-client,polyfills,babel-loader,Webpack,Babeljs,Apollo Client,Polyfills,Babel Loader,我在promise polyfill上遇到了下面的一个特殊问题,Babel的预设环境应该为浏览器兼容性添加这个问题 我有一个Foo.ts文件,它使用async/await语法来处理承诺。包含React的web应用程序经过babel loader处理、捆绑并由Webpack dev server启动后,在Chrome、Safari、Edge(Mac)中成功运行,但在FireFox、IE11和Edge(Windows)中失败 错误如下所示,它被识别为来自npm包@apollo/client,而Foo

我在promise polyfill上遇到了下面的一个特殊问题,Babel的预设环境应该为浏览器兼容性添加这个问题

我有一个
Foo.ts
文件,它使用
async/await
语法来处理承诺。包含React的web应用程序经过
babel loader
处理、捆绑并由Webpack dev server启动后,在Chrome、Safari、Edge(Mac)中成功运行,但在FireFox、IE11和Edge(Windows)中失败

错误如下所示,它被识别为来自npm包
@apollo/client
,而
Foo.ts
依赖于此。这是否表明polyfill承诺缺失

TypeError: "this.fetchQuery(...).finally is not a function"
babel loader的网页包配置如下所示

模块:{
规则:[
{
测试:/\(jsx?;tsx?)$/,
排除:/node_模块\/.*/,,
使用:{
加载器:“巴别塔加载器”,
选项:{
预设:[
“@babel/preset react”,
“@babel/preset typescript”,
[
“@babel/preset env”,
{
useBuiltIns:“用法”,
corejs:'3.6',
是的,
},
],
],
插件:['react-hot-loader/babel'],
},
},
},
]
}
当dev服务器启动时,在控制台输出中,我可以看到下面的一行,它表示promise polyfill已添加到
Foo.js

Added following core-js polyfills:
  es.promise { "chrome":"45", "edge":"12", "firefox":"45", "ie":"11", "safari":"10.1" }
因此,我对问题是如何发生的感到困惑

如果我手动添加
import'core js/es/promise/finally'
Foo.ts
,一切正常

我想知道这里可能缺少什么,以及为什么
babel loader
没有成功添加polyfill

Foo.ts
中涉及
@apollo/client
的代码部分如下所示。在进行babel转换之前,它由tsc编译为ES2015目标

试试看{
const response:ApolloQueryResult=等待this.apolloClient.query(
{
查询
fetchPolicy:'无缓存',
错误策略:“全部”,
变量,
},
);
返回响应数据;
}捕获(e){
控制台错误(e);
投掷e;
}
环境信息

  • Firefox:68.8.0esr
  • @巴别塔/预设环境:7.9.5
  • 核心js:3.6.5
  • 网页:4.29.6
  • 巴别塔加载器:8.0.5

进一步挖掘后,我认为问题是由于
@babel/preset env
无法为Firefox注入正确的
es.promise
polyfill造成的。我使用以下配置进行了测试,该配置将目标运行环境仅隔离到Firefox。这个问题只在Firefox版本设置为68及更低版本时出现

      targets: {
        firefox: '68',
      },
目前,我的解决办法是:

  • 配置
    @babel/preset env
    故意排除
    es.promise
    polyfill
  • 通过网页包的入口点配置添加它,因为它仍然是需要的

  • 我发布了一份问题报告以寻求更多建议。
    exclude: ['es.promise'],
    
    entry: ['core-js/es/promise', 'index.ts'],