Dart 3.4全新特性深度解析

发表时间: 2024-06-07 22:00

飞镖3.4今天出来了!此版本在Flutter 3.22 / Dart 3.4 / IO24帖子中展示了Dart和Flutter的共同努力,因此请务必在那里获得完整的独家新闻。这篇文章介绍了我们对WebAssembly的支持,然后详细介绍了今年Dart语言的主要路线图项目之一:macros。

WebAssembly更新

今天,我们很高兴地宣布,最新的Flutter 3.22稳定版本可以为Flutter Web应用程序提供对WebAssembly(Wasm)的全面支持!

这是Dart & Flutter的多年投资。如果您一直在关注这些发展,那么您已经看到了我们的渐进式发展:

  • 标准化WasmGC提案,
  • 添加一个全新的Dart编译器后端来生成WasmGC代码,以及
  • 改进我们的网络和JavaScript互操作产品,以最好地支持Wasm。

我们将继续投资WebAssembly。我们的下一步工作将在纯Dart应用程序中全面支持Wasm,并完成一些缺失的功能(例如延迟加载)。Dart中Wasm编译的端到端工具仍在开发中,但您现在可以尝试稳定的预览,并采取一些临时步骤。稍后,我们还希望在JS环境之外支持Dart中的Wasm,例如标准的Wasm运行时,如wasmtime和wasmer。

飞镖宏:提高开发抽象水平

我们投入了多年来设计Dart宏系统。为了改善Dart的开发体验,宏提供了一个元编程解决方案,如代码生成。该解决方案内置在Dart语言中,为开发人员提供最大的性能、效率和生产力。现在,我们准备提供这种体验的预览!

Dart开发人员长期以来的一个痛点是序列化和反序列化JSON数据的琐碎但乏味的模式。制作一个可重用、足够强大的解决方案是Dart的一个挑战,因为出于性能原因,它不支持运行时反射。作为替代方案,我们依靠像JsonSerializable代码生成解决方案。这些依赖于在代码本身之前运行的外部工具,使开发人员的体验复杂化。

今天,我们宣布JSON序列化和反序列化的激进新方法的预览:JsonCodable宏。

宏是一种代码,通过在编译时内省其他代码来生成更多代码。例如,这里有一个应用了新的JsonCodable宏的Dart级车辆:

@JsonCodable()类车辆{  最终字符串描述;  最终的int车轮;车辆(this.description,this.wheels);}void main() {  final jsonString = Vehicle('bicycle', 2).toJson();  print('车辆序列化: $jsonString');}

那么,它是如何工作的呢?toJson()方法(和companifromJsonfromJson()构造函数)从何而来?这是我们新宏系统的实验实现,旨在简化开发人员的体验。当Dart编译器看到@JsonCodable()注释时,它会立即实时找到JsonCodable宏的定义并开始执行它。这导致宏:

  1. 创建一个新的“增强类”;一种新的语言结构,可以向现有类添加新的声明。
  2. 阅读开发人员对Vehicle类别的定义,以确定它有两个字段,descriptionwheels
  3. 将新的toJson方法签名添加到增强类中。
  4. 填写toJson方法的正文,以处理描述和轮子字段的序列化。

所有这些都毫不拖延地发生了。集成体验支持我们现有的开发人员工作流程,例如热重新加载,正如本截屏视频所示:

显示使用宏体验的截屏视频:最初不存在toJson代码完成,但在将@JsonCodable添加到类中后,toJson代码完成会立即显示。

长期宏观目标

最终目标是使社区能够创建自己的宏。这提高了Dart编程的抽象水平。以数据类为例,投票率最高的Dart语言功能。我们考虑在Dart中添加对数据类的内置支持,但了解到,对于这种结构应该支持什么来建立标准,意见差异很大。字段应该是immutable吗?它应该支持平等吗?hashCode呢?也许也是toString?我们的结论是,支持宏观系统将是更好的方法。社区可以创建自己的抽象,允许更可扩展的实验和多样性。

设计和实施这样一个强大的宏观系统是一项艰巨的任务。我们决心以不会对核心Dart开发人员用例产生不利性能影响的方式进行,例如代码协助和完成、代码分析和热重新加载。考虑到这一点,我们正在采取一种分阶段的方法:

  • 在今天的版本中,我们正在预览单个宏JsonCodable,以便用户可以开始熟悉开发人员使用宏的体验。
  • 如果此宏的推出进展顺利,那么我们希望在以后的版本中将JSON宏升级为稳定。
  • 同时,我们正在完成底层宏系统的设计和实现。一旦我们对其性能和稳定性充满信心,最终目标将是使Dart开发人员社区能够定义自己的宏。

还有很多工作要做才能完成这些阶段。与此同时,您可以阅读文档以了解有关Dart宏系统的更多信息,并立即尝试JsonCodable宏的预览。

其他改进

一如既往,此版本包含提供Dart最佳版本的所有持续发展。在这个版本中,我们进行了以下改进:

  • 解决了超过50%的分析器代码完成错误。(请继续归档问题!)
  • 改进了条件表达式、if-null表达式和switch表达式与语言规范(changelog)的类型分析的对齐。
  • 从dart:cli库中删除了不完整且不一致的工具,以偿还Dart VM中的技术债务。
  • 解决了改进新dart:js_interop库的一些不足之处。