Angular 15更新后,Typescript的目标警告

回答 2 浏览 4556 2023-01-08

我把我的Angular应用程序更新到了Angular 15。它构建得很好--除非有一些警告,如:

TypeScript compiler options "target" and "useDefineForClassFields" are set to "ES2022" and "false" respectively by the Angular CLI.

我的tsconfig.json将目标设定为ES6

{
  ...
  "compilerOptions": {
      "target": "ES6",
      ...
  }
}

文件中说:

Internally the Angular CLI now always set the TypeScript target to ES2022 and useDefineForClassFields to false unless the target is set to ES2022 or later in the TypeScript configuration.

https://github.com/angular/angular-cli/blob/main/CHANGELOG.md

而我的.browserslistrc看起来一个月都是一样的,从一开始就没有任何变化:

last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR

因此,我怎样才能摆脱这个警告呢?

Konrad 提问于2023-01-08
2 个回答
#1楼
得票数 8

要理解这个警告,我们首先需要了解Angular构建的工作原理。

首先,TypeScript构建需要运行。在这一步,通过tsconfig.json中的设置,你的TypeScript代码被编译成JavaScript。如果你将target设置为ES6,在Angular 15之前,TypeScript构建会产生ES6代码。

之后,Angular使用Babel来使生成的JavaScript代码向后兼容旧的浏览器版本,请参阅docs。它通过browserslist配置来获取您希望支持的浏览器列表,并在必要时为缺少的功能添加polyfills。

在Angular支持IE11的时候,这个问题要复杂得多。有一次,Angular CLI甚至为IE11生成了一个额外的bundle,这被称为differential loading。但现在Angular放弃了对IE11的支持,他们可以再次简化事情,并向现代的bundle发展,这可能是他们在v15中变化的原因。

所以在我看来,没有充分的理由将你的tsconfig.json中的target设置为像ES6这样的旧版本。现在的浏览器支持更多的EcmaScript功能,使用最新的EcmaScript版本会使你的包的大小更小。Babel无论如何都会填补缺失的功能,所以你不必担心。只要按照他们的建议将目标设置为ES2022即可。

JSON Derulo 提问于2023-01-12
JSON Derulo 修改于2023-01-12
你知道有什么例子说明用ES2020和ES2022编译的项目最终会有什么不同吗?babel polyfills是否更多的是对浏览器API进行修补,而TS的编译则必须以不同的方式重写东西?Simon_Weaver 2023-02-22
在Angular 15之前,我一直在使用ES6目标,这样就可以重写Safari 13.3的兼容性。我现在已经确定放弃了,但如果这意味着我可能会破坏一些Safari 14(或任何版本)的用户,那么我不一定能跳到ES2022。Simon_Weaver 2023-02-22
@Simon_Weaver babel对TypeScript的编译没有任何影响。它应该也能填充缺失的浏览器API和功能,包括nullish凝聚,只要相应地配置你的browserslist。此外,Angular只支持Safari的两个最新的主要版本。我们已经在Safari 16上了,所以无论如何13和14已经不支持了。JSON Derulo 2023-02-22
谢谢,但在'正式'支持14和通过使用较低的target(或更宽松的浏览器文件)来支持14是有区别的。这正是我直到昨天还在做的事情,以支持旧版Safari中的???.--我们仍然从Safari 13和14的人那里赚钱!这就是我的工作!这只是在一个应用程序中很难驾驭每个选项的确切影响,但我个人认为自己在一段时间内不会使用ES2022。Simon_Weaver 2023-02-22
#2楼 已采纳
得票数 7

我也有同样的问题,并通过在我的tsconfig中加入"target": "ES2022""useDefineForClassFields": false成功地消除了这个警告。这是否是一个好主意,要等比我更有见识的人来评论。我担心,当2022变成2023(或接下来的什么)时,这将以你现在的方式失败。当然,如果Angular无论如何都要覆盖它的话,最好是能完全不使用它(就像我一样)。但我可能对这个问题掌握得不全面。

在你的案例中,你应该可以用ES6(我理解为与ES2015相同)来做(或至少是尝试)同样的事情。根据你引用的文档,无论你的要求如何,Angular都是这样做的,所以如果你只得到警告而没有错误,你的代码应该是没有问题的。如果你需要将事情进一步限制在ES6级别,似乎你需要用你的.broswerslistrc文件来做这件事,这可能也已经很好。

我认为这里的问题是,这个警告没有帮助,至少对像你和我这样的人来说,他们是收到了这个警告,却不知道该怎么做。还有它后面的网络链接("要控制ECMA版本和功能,请使用Browerslist配置。更多信息,见https://angular.io/guide/build#configuring-browser-compatibility ")似乎对解决这个警告没有特别的帮助,告诉我们应该做什么,但没有告诉我们如何做才能摆脱这个警告。

user1203108 提问于2023-01-08
user1203108 修改于2023-01-08
Angular使用Babel来确保与.browserslistrc中定义的浏览器向后兼容。因此,使用现代的tsconfig目标是安全的,缺失功能的polyfills将由Babel添加。更多细节,请看我的回答。JSON Derulo 2023-01-12