反对 Apple Silicon,减少了默认的 lint、更好的工具和新的语言性能进步生产力。
本月,咱们公布了 Dart SDK 2.14 的正式版,新的版本旨在通过独特的可移植性、生产力和稳健性组合来打造构建应用程序的最佳平台。这一次,咱们对 Apple Silicon 提供了更好的反对,并提供了许多加强生产力的性能,例如用于通过代码款式剖析在你编写代码时捕捉谬误的规范 lint 代码规定、更快的公布工具、更好的级联代码格局以及一些小的语言个性更新。
自 Apple 在 2020 年末公布新的 Apple 芯片 处理器芯片以来,咱们始终致力于更新 Dart SDK 以减少对新处理器上的原生运行反对。所需的更新曾经在 dev 渠道中提供了一段时间,过来一个月,beta 渠道也提供了反对,从 Dart 2.14.1 开始,能够在 Dart stable 渠道中应用啦。当你 下载 一个 macOS 的 SDK 时,确保要抉择 ARM64 选项。请留神,与 Flutter SDK 中捆绑的 Dart SDK 还没有反对这些改良。
这些反对包含了在 Apple 芯片上运行 SDK 和 Dart 虚拟机,也反对了在 Apple 芯片上编译运行的可执行文件 (应用 dart compile 命令)。因为 Dart 命令行工具应用原生 Apple 芯片反对,因而它们的启动速度要快得多。
开发者们通常会更偏差让代码遵循某种格调。这些规定中有许多并不只是格调上的偏好 (比方家喻户晓的 tab 与空格的探讨),而且涵盖了可能导致谬误或引入谬误的编码格调。例如,Dart 格调指南要求对所有控制流构造应用花括号,如 if-else 语句。这能够避免经典的「悬空 else」问题,即在有多个嵌套的 if-else 语句时存在歧义。另一个例子则是类型推断,尽管在申明具备初始值的变量时,应用类型推断没有问题,但在 申明未初始化的变量 时手动指定类型就相当重要,这样能够确保类型平安。
保持良好代码格调当然也能够抉择某种人工审查的模式,也就是咱们相熟的 code review。然而,在编写代码时运行动态剖析来强制要求执行规定,通常要更为无效。
在 Dart 中,这种动态剖析是高度 可配置的,咱们有 数百条款式规定 (也称为 lints)。有了这么丰盛的选项,可能会导致咱们不晓得抉择要启用哪个规定。Dart 团队保护了一个 Dart 格调指南,它形容了咱们认为编写和设计 Dart 代码的最佳实际,在此之前咱们还没有提供正式的官网格调指南的 linter 规定。
许多开发者,也包含 pub.dev 网站的 评分 引擎都在应用一个名为 pedantic 的 lint 规定。然而,pedantic 起源于谷歌外部的 Dart 格调指南,因为历史起因,它与个别的 Dart 格调指南并不相同。因而,Flutter 框架从未应用过 pedantic 规定集,而是有本人的一套规范性规定。
这听起来可能有点乱,不过的确如此。然而在这次的版本公布中,咱们很快乐地发表,咱们当初领有了一套全新的 lint 汇合来实现款式指南,并且 Dart 和 Flutter SDK 已更新为默认状况下将这些规定集用于新我的项目。这些规定集包含:
- package:lints/core.yaml: Dart 格调指南中的次要规定,咱们认为所有 Dart 代码都应该遵循该规定。pub.dev 评分引擎已更新,应用这些规定代替 pedantic。
- package:lints/recommended.yaml: 外围规定,加上额定的举荐规定。这套规定被举荐用于所有个别的 Dart 代码。
- package:flutter_lints/flutter.yaml: 外围和举荐规定,加上额定的 Flutter 专用举荐规定。这套规定被举荐用于所有 Flutter 代码。
如果你现有的我的项目中应用了 pedantic,咱们强烈建议你降级到这些新规定集。从 pedantic 降级 只需几步。
咱们对 Dart 格式化器格式化 级联 代码的形式进行了一些优化。以前,格式化器在某些状况下会产生凌乱的格式化。例如,在这个例子中,doIt()
是怎么被调用的?
var result = errorState ? foo : bad..doIt();
看上去它总会被 bad
调用,但实际上级联实用于整个 ? 表达式,所以级联是在该表达式的后果上调用的,而不仅仅是在 false
子句上,新的格式化器会清晰地表明这一点:
var result = errorState ? foo : bad
..doIt();
其余的变动还波及如何对有多个级联的行进行格式化,以及级联个别缩进多远。咱们还大大提高了蕴含级联的代码的格式化速度;在为 协定缓冲区 生成的 Dart 代码中,咱们看到格式化速度 <highlight> 进步了 10 倍 </highlight>。
无关该问题的所有详细信息,请参阅和跟踪这个 Pull Request。
目前,当你 公布 一个 package 到 pub.dev 社区仓库时,pub
便会捕捉该文件夹中的所有文件,然而会跳过暗藏的文件 (那些以点 .
结尾的文件 ) 和 .gitignore
中列出的文件。一些开发者须要可能管制哪些文件在 .gitignore
的列表之外被疏忽。例如,你可能在一个 tool/
文件夹里有一些外部开发工具,你用来保护你的 package,但这些工具与应用你 package 的人没有关系。
Dart 2.14 中更新的 pub
命令反对新的 .pubignore
文件,你能够在其中列出不想上传到 pub.dev 的文件。此文件应用与 .gitignore
文件雷同的格局。详细信息,请参阅 package 公布文档。
尽管 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
对何时勾销构建步骤变得更加智能,因而只有当版本扭转时才会进行构建。此外,咱们改良了应用并行化来执行构建步骤的形式,因而该步骤自身会实现得更快。在咱们测试的一些 package 上,咱们看到它只用了一半的工夫。
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 package 和代码库进行了许多加强,包含:
dart:core
: 向 Object 类增加了静态方法hash
、hashAll
和hashAllUnordered
。这些可用于以统一的形式组合多个对象的哈希码 (hashAll 示例);dart:core
: 本机 DateTime 类当初能够更好地解决本地工夫,而不是准确到一小时的夏令时更改——例如澳大利亚豪勋爵岛,它有 30 分钟的时差偏移;- package:ffi: 增加了对应用 arena 分配器治理内存的反对 (示例)。Arenas 是一种 基于区域的内存治理 模式,一旦退出 arena/region 就会主动开释资源;
- package:ffigen: 当初反对从 C 类型定义生成 Dart 类型定义。
Dart 2.14 还蕴含一些较小的、曾经 提前发表过的 破坏性更新 (breaking changes)。预计这些变动只会影响一些特地的用例,这些破坏性更新如下:
#46545: 勾销对 ECMAScript5 的反对
所有的古代浏览器 都已反对最新的 ECMAScript 版本,所以两年前咱们 发表了 一项打算,不再反对 ECMAScript 5 (ES5)。这使咱们可能利用最新的 ECMAScript 的改良,生成更小的输入。在 Dart 2.14 中,这项工作曾经实现,Dart Web 编译器不再反对 ES5 了,因而,较旧的浏览器 (例如 IE11) 将不再反对。
#46100: 弃用 stagehand、dartfmt 和 dart2native
在 2020 年 10 月的 Dart 2.10 博客文章中,咱们发表了将所有 Dart CLI 开发人员工具组合成一个繁多的组 dart
命令工具 (相似于 flutter 命令工具) 的工作。作为这一演变的一部分,Dart 2.14 弃用了以前 dartfmt
和 dart2native
命令,并进行了 stagehand
。这些工具在 对立的 dart 命令工具中 都有等价的替代品。
#45451: 弃用 VM 原生扩大
咱们曾经弃用了 Dart VM 的原生扩大,这是咱们从 Dart 代码调用原生代码的旧机制。Dart FFI (内部性能接口) 是咱们以后用于这个用例的机制,咱们正在踊跃 倒退 它以使其性能更加弱小且易于应用。
咱们在 3 月份的 Dart 2.12 版本中推出了健全的空平安。空平安是 Dart 最新的次要生产力个性,旨在帮忙你防止空值谬误,这是一类通常难以发现的谬误。
自从咱们上次更新以来,咱们看到现有 package 和应用程序的迁徙获得了微小的停顿,以实现空平安 的健全查看劣势。对于 pub.dev 上的 package,前 250 名的 package 中 100% 都已反对了空平安,前 1000 名中有 94% 都反对。这意味着更多的开发者能够用齐全 健全的空平安 来运行他们的利用。剖析显示,56% 的 flutter run
命令以齐全健全的形式执行。感激生态系统中的所有开发者,感激你们的迁徙工作!
蕴含上述变动的增强型 Dart SDK 曾经能够在 Dart 2.14.1 和 Flutter 2.5 SDK 中应用。咱们心愿你会喜爱这些新的改良和性能。
感激 Dart 社区
另外,咱们想借此机会向 Dart 社区表示感谢。通过最近对编程语言考察的一些更新,能够看到 Dart 的势头很强劲。备受尊敬的 RedMonk 排名中 提到了 “Dart 的显著回升 ”,并首次将 Dart 列入前 20 名。StackOverflow 的 2021 年开发者综合考察 同样让人欣慰。据报道,Dart 是开发人员最青睐的第七种编程语言。咱们真的很快乐看到 Dart 平台有继续的增长和发展势头。
感激 flutter.cn 社区成员 (@AlexV525、@Vadaski、@MeandNi) 以及 Lynn 对本文的审校和奉献。