译注:Dart2.0的文档已经翻译发布有半年之久了,2018年11月Dart2.1的stable版本也发布了。2.0版本的文档地址在https://www.kancloud.cn/@marswill
今天,我们宣布Dart 2.1的稳定发行版,这是Dart 2的升级版,它提供了更小的代码大小、更快的类型检查、更好的类型错误可用性以及在构建用户体验时提高生产率的新语言特性。
Dart 2是对Dart平台的一个巨大升级。它完成了从我们早期的web根源到一种适用于跨移动和web快速开发丰富用户体验的主流编程语言的转换。Dart作为一种语言在提供虚拟机(VM)和编译本机代码和JavaScript方面有些独特。这支持不同平台对开发和生产的不同需求。
在转换到Dart 2的过程中,我们添加了一个完善的类型系统,以支持大型团队构建复杂的应用程序,支持生成针对移动设备优化的本地代码的新编译器,以及完全重写的web平台工具。Dart powers Flutter是我们快速增长的工具包,可以从一个代码库中为iOS和Android构建漂亮的本地体验;它也是一些谷歌最大项目使用的语言,比如谷歌Ads。
自从八月份Dart 2发布以来,我们一直致力于将整个生态系统引入Dart 2。我们将我们的dartlang.org网站改为在任何地方都使用Dart 2示例,并为Dart 1.x包的迁移提供了工具和文档。我们知道Dart 2的巨大变化涉及到现有Dart开发人员的迁移工作,我们非常感谢那些帮助我们为未来建立新基础的人。我们现在的重点转移到利用这些投资来提高性能和生产率。
新的Flutter开发人员在指定填充、设置字体大小等方面经常会遇到这样的分析错误:
从系统的角度来看,这些错误是有意义的:API需要一种类型(double),开发人员指定另一种类型的值(int)。然而,从可用性的角度来看,这似乎有点愚蠢:从int到double的转换很简单,为什么不直接这样做呢?Dart2.1现在推断,int可以被无声地赋值为double:
我们还改进了Dart对mixin的支持。如果您以前没有遇到过Dart mixin,那么值得一读Romain Rastel对Dart mixin的介绍。Dart 2.1为mixin引入了一种新的语法,其中包含了一个新的mixin关键字,您可以使用它来定义只能用作mixin的类。我们还添加了支持,以便mixin可以扩展其他类(以前它们只能扩展对象),并可以在超类中调用方法。
扩展非对象类的一个例子来自Flutter的动画api,其中SingleTickerProviderStateMixin——一个框架类,它提供了一个通过单个帧推进动画的标记器——声明了一个mixin,它实现了通用的TickerProvider接口。动画仅适用于有状态小部件(因为动画中的位置被认为是状态)。新的mixin支持允许我们声明只有扩展Flutter状态类的类才能使用mixin:
Dart 2’s sound type system protects you during development, telling you when you violate the contract specified by the types. For example, let’s say you’re creating a state class for Flutter. This class is expected to extend the framework State class. A State class expects to be passed the StatefulWidget that it contains the state for.
Dart 2健全的类型系统在开发过程种为你保驾护航,当你违反了约定的类型的时候告诉你。例如,假设您正在为Flutter创建一个state类。这个类将扩展框架状态类。状态类希望传递包含状态的StatefulWidget。
现在,如果您犯了一个编程错误,比如说,将它作为StatelessWidget传递给它,而不是StatefulWidget .类型信息使工具能够捕捉错误并立即向您发出警告:
这些编辑时类型检查是在Dart 2.0中添加的(由Dart分析器提供支持)。但是,在编译时执行Flutter发行版构建时,您可能会在另一个地方看到这些类型检查。这些检查在Dart 2.0中是不完整的,这可能会导致可用性问题,在这种情况下,糟糕的源代码可以编译而不会产生任何错误。在Dart 2.1中,这些检查是完整的,分析器和Dart编译器包含相同的检查。
运行在VM上的aot编译的代码Dart2通常比Dart1.x快,例如Flutter应用程序。但是,在一些边缘情况下,新类型系统添加的全面检查导致了20-40%的开销。在Dart 2.1中,我们大大降低了类型检查的成本,无论是对于aot编译的代码,还是对于在JIT (just-in-time)编译的VM中运行的代码。
一个具体的例子就是我们的开发工具(使用VM运行)。例如,对一个大的基准应用程序(基于Flutter Gallery的多个连接副本)进行代码分析需要大约41秒;现在需要25秒。
我们还改进了在web上运行的Dart代码的代码大小和编译时间。我们关注于Dart2js的输出大小,并看到了良好的结果,例如我们的一个示例的缩小输出大小减少了17%,编译时间提高了15%。
除了上述对Dart SDK的更改之外,我们还在核心SDK之外进行了一些令人兴奋的更改。
协议缓冲区(简称protobuf)是用于序列化结构化数据的平台无关机制。它们在谷歌内部得到了广泛的使用,而且在谷歌之外也得到了广泛的采用——例如作为gRPC的一部分。Dart现在是一种正式支持的protobuf语言,我们在core protocol buffers网站上增加了详细的文档,提供了教程和参考文档。
您可能听说过knative——一个基于Kubernetes的平台——支持构建、部署和管理无服务器工作负载。我们最近研究了在knative上提供Dart代码的支持,并创建了一个小示例。对于大多数Dart应用程序开发人员来说,这可能太低级了,但我们发现从平台的角度来看,这非常令人兴奋,并预期这将是一个关键的构建模块,可以更好地支持在谷歌云中提供Dart代码——例如为Flutter应用程序创建后端。
Dart SDK 2.1可从Dart主页获得。如果您是Flutter开发人员,那么Dart 2.1是即将发布的Flutter 1.0版本的一部分。
我们还更新了DartPad以运行Dart 2.1,并添加了int-to-double和mixin的示例。
版本 | 下载地址 |
---|---|
Dart2.1-windows-i32 | 下载 |
Dart2.1-windows-x64 | 下载 |
Dart2.1-linux-i32 | 下载 |
Dart2.1-linux-x64 | 下载 |
Dart2.1-mac-i32 | 下载 |
我们希望李永Dart 2的平台为基础发布更多的2.x系列发行版本。我们将根据框架合作伙伴和应用程序开发人员的需要进行这些工作。我们预计2019年将开展以下领域的研究:
就这些了。我们希望您喜欢Dart 2.1!