[Dart翻译]发布Dart 2.14

642 阅读11分钟

支持Apple Silicon,并通过默认lints、更好的工具和新的语言功能提高生产力

原文地址:medium.com/dartlang/an…

原文作者:medium.com/@mit.mit

发布时间:2021年9月9日 - 8分钟阅读

今天我们发布了2.14版的Dart SDK,这是我们正在进行的通过独特的可移植性、生产力和稳健性的组合来打造最佳应用平台的旅程中的下一个版本。这一次,我们对Apple Silicon有了更好的支持,还有一些生产力方面的提升,比如在你写代码时通过代码风格分析来捕捉错误的标准线,一个更快的pub工具,用级联来更好地格式化代码,以及一些小的语言功能。

image.png

带有总结2.14新特性的文字的插图

Dart SDK中对苹果硅的支持

自从苹果公司在2020年底宣布他们新的苹果硅处理器以来,我们一直在努力更新Dart SDK,以增加对新处理器的本地执行的支持。所需的变化已经在开发频道中出现了一段时间,在过去的一个月中在测试频道中出现了,从Dart 2.14.1开始,现在可以在Dart稳定频道中使用。当你下载macOS SDK时,请确保选择ARM64选项。注意,捆绑在Flutter SDK中的Dart SDK还没有这些改进。

支持包括在Apple Silicon上运行SDK/Dart VM本身,以及支持编译在Apple Silicon上运行的可执行文件(使用dart compile)。Dart命令行工具现在启动得更快,因为它们使用了原生的苹果硅支持。

为Dart和Flutter共享的标准lints

开发人员往往喜欢他们的代码遵循某种风格。这些规则中有许多并不只是风格上的偏好(比如众所周知的tab与空格的讨论),而是涵盖了可能导致错误或引入bug的编码风格。例如,Dart风格指南要求对所有控制流结构使用大括号,如if-else语句。这可以防止典型的dangling else问题,即在如何解释几个嵌套的if-else语句方面存在歧义。另一个例子是类型推理。虽然在声明具有初始值的变量时使用类型推理是很好的,但在声明未初始化的变量时指定类型是很重要的,以确保类型安全。

强制执行良好的代码风格的一个选择是有某种形式的人工执行,通常是通过代码审查。然而,通过静态分析来执行规则往往要有效得多,因为静态分析是在你写代码时运行的。

在Dart中,这种静态分析是高度可配置的,我们有数百种风格规则(也称为lints)。有了这些丰富的选项,选择启用哪些规则可能会让人有点不知所措。Dart团队维护着一份Dart风格指南,其中描述了我们认为的Dart代码的最佳写法和风格,但从历史上看,我们还没有一套与风格指南对应的官方linter规则。

许多开发人员--以及pub.dev网站的评分引擎--都使用了pedantic的一套linter规则。然而,Pedantic起源于谷歌内部的Dart风格指南,由于历史原因,它与一般的Dart风格指南不同。此外,Flutter框架从未使用过pedantic规则集,而是有自己的一套规范性规则。

这听起来可能有点乱,事实上也是如此。但随着今天的发布,我们很高兴地宣布,我们现在有了一套全新的实现风格指南的lint集合,而且Dart和Flutter SDKs已经更新,新项目默认使用这些规则集。这些规则集是

  • package:lints/core.yaml。Dart风格指南中的主要规则,我们认为所有Dart代码都应该遵循。pub.dev评分引擎已被更新,以使用这些规则而不是迂腐的。
  • package:lints/recommended.yaml。核心规则,加上额外的推荐规则。这套规则被推荐用于所有普通的Dart代码。
  • package:flutter_lints/flutter.yaml: 核心规则和推荐规则,加上额外的Flutter专用推荐规则。这套规则被推荐用于所有Flutter代码。

如果您有现有项目,我们强烈建议您升级到这些新的规则集。从 pedantic 升级只需要几个步骤

Dart格式化器和级联

我们对Dart格式化器如何用级联格式化代码进行了一些优化。以前,格式器在某些情况下会产生混乱的格式。例如,在这个例子中,doIt()是怎么被调用的?

var result = errorState ? foo : bad..doIt();

看起来它总是在bad上调用,但实际上级联适用于整个? 表达式,所以级联是在该表达式的结果上调用的,而不仅仅是在false子句上。新的格式化器清楚地表明了这一点。

var result = errorState ? foo : bad
  ..doIt();

其他的变化涉及到如何对有多个级联的行进行格式化,以及级联一般缩进到什么程度。我们还大大提高了包含级联的代码的格式化速度;在为协议缓冲区生成的Dart代码中,我们看到格式化速度提高了10倍。

关于所有的细节,请看跟踪问题

发布支持忽略的文件

目前,当你发布一个软件包到pub.dev社区仓库时,pub会抓取该文件夹中的所有文件,只有少数例外,跳过隐藏文件(那些以点:.开头的文件)和以.gitignore列出的文件。一些开发者要求能够控制哪些文件在.gitignore的列表之外被忽略。例如,你可能在一个tool/文件夹里有一些内部开发工具,你用来维护你的软件包,但这些工具与使用你的软件包的人没有关系。

Dart 2.14中更新的pub命令支持一个新的.pubignore文件,在这里你可以列出你不想上传到pub.dev的文件。这个文件使用与.gitignore文件相同的格式。详情请见软件包发布文档

Pub和dart test的性能

虽然pub可能最常用于管理代码的依赖性,但它也有第二个重要用途:为工具提供动力。其中一个例子是Dart测试工具,通过dart test命令暴露。这个命令实际上只是pub run test:test命令的一个包装,它运行package:test中的测试入口。在调用该入口之前,pub首先将其编译为可以更快地运行的本地代码。

在Dart 2.14之前,对pubspec的任何改动(包括与package:test无关的改动)都会使测试的构建无效,你会看到一堆像这样包含 "预编译可执行 "的输出。

$ dart test
Precompiling executable... (11.6s)
Precompiled test:test.
00:01 +1: All tests passed!

在Dart 2.14中,pub对何时无效的构建步骤更加智能,所以只有当版本改变时才会进行构建。此外,我们改进了使用并行化来执行构建步骤的方式,因此该步骤本身完成得更快。我们已经看到,在我们测试的一些软件包上,它只需要一半的时间。

新的语言特性

Dart 2.14还包含一些小的语言特性。这一次,我们把重点放在更具体的改进上,这些改进可能具有更狭隘的效用,但却能实现以前不支持的更专业的使用情况。

首先,我们增加了一个新的三重移位运算符(>>>)。这类似于现有的移位操作符(>>),但在>>执行算术移位的地方,>>>执行逻辑或无符号移位,其中零位被移到最重要的位,而不管被移位的数字是正还是负。

我们还删除了对类型参数的旧限制,该限制不允许使用通用函数类型作为类型参数。以下这些在2.14之前都是无效的,但现在是允许的。

late List<T Function<T>(T)> idFunctions;
var callback = [<T>(T value) => value];
late S Function<S extends T Function<T>(T)>(S) f;

最后,我们对注解类型做了一个小小的调整。(像@Deprecated这样的注解在Dart代码中通常用来捕获元数据)。) 以前注解不能传递类型参数,所以像@TypeHelper<int>(42, "The meaning") 这样的代码是不允许的。现在这一限制已经被移除。

包和核心库的变化

我们对Dart的核心包和库做了一些增强,包括。

  • dart:core: 为对象类添加了静态方法hash、hashAll和hashAllUnordered。这些方法可以用来以一致的方式组合多个对象的哈希代码(hashAll例子)。
  • dart:core: 原生的DateTime类现在可以更好地处理日光节约时间变化周围的本地时间,而这些变化并不精确到一小时--例如澳大利亚的豪勋爵岛,它使用的是30分钟的转变。
  • package:ffi。增加了对使用竞技场分配器管理内存的支持(示例)。竞技场是一种基于区域的内存管理形式,一旦竞技场/区域被退出,资源将被自动释放。
  • package:ffigen: 现在支持从C语言的类型定义生成Dart类型定义。

突破性变化

Dart 2.14还包含了一些较小的、之前公布的突破性变化。这些变化预计只会影响一些特殊的使用情况。

#46545: 删除了对ECMAScript5的支持

所有现代浏览器都支持最新的ECMAScript版本,所以两年前我们宣布了一项计划,即取消对ECMAScript 5(ES5)的支持。这使我们能够利用最新的ECMAScript的改进,生成更小的输出。在Dart 2.14中,这项工作已经完成,Dart网络编译器不再支持ES5。因此,老的浏览器--如IE11--不再被支持。

#46100:废弃stagehand、dartfmt和dart2native

在2020年10月的Dart 2.10博文中,我们宣布了将所有的Dart CLI开发工具合并为一个单一的、合并的dart工具(类似于flutter工具)的工作。作为这一演变的一部分,Dart 2.14废弃了以前的dartfmt和dart2native命令,并停用了stagehand。这些工具在统一的dart工具中都有相应的替换。

#45451: 废弃虚拟机本地扩展

我们已经废弃了Dart VM的Native Extensions,即我们从Dart代码中调用本地代码的旧机制。Dart FFI(外国函数接口)是我们目前用于这种情况的机制,我们正在积极改进,使其更加强大和易于使用。

空值安全更新

我们在三月的Dart 2.12版本中推出了完善的空值安全。空值安全是Dart最新的主要生产力特性,旨在帮助你避免空值错误--一类通常难以发现的错误。

自从我们上次更新以来,我们已经看到了现有软件包和应用程序迁移的巨大进展,以实现空值安全的健全检查优势。对于pub.dev上的软件包,前250名的软件包中100%都支持null safety,前1000名中94%都支持。这意味着更多的开发者可以在完全健全的null safety下运行他们的应用程序。分析显示,56%的flutter运行会话以完全健全的方式执行。感谢生态系统中的所有开发人员,感谢你们的迁移工作!

2.14 可用性和持续的发展势头

包含上述变化的增强型Dart SDK今天在Dart 2.14.1和Flutter 2.5 SDK中可用。我们希望您会喜欢这些新的改进和功能。

另外,我们想借此机会向伟大的Dart社区表示感谢。通过最近更新的一些编程语言调查,可以看到Dart的发展势头很强劲。备受尊敬的RedMonk排名中提到了 "Dart的显著上升",并首次将Dart列入前20名。StackOverflow的2021年开发者综合调查同样让人欣喜。据报道,Dart是开发人员最喜爱的第七种编程语言。我们真的很高兴看到Dart平台有持续的增长和发展势头。


www.deepl.com 翻译