发布 Dart 3.4
前言
原文
Dart 3.4 今天发布!此版本展示了 Dart 和 Flutter 共同在 Flutter 3.22 / Dart 3.4 / IO24 文章中的努力,因此请确保在那里获取全部信息。本文介绍了我们对 WebAssembly 的支持,然后详细介绍了今年 Dart 语言的一个主要路线图项目:macro。
WebAssembly 更新
今天,我们很高兴地宣布,最新的 Flutter 3.22 稳定版本为 Flutter Web 应用程序提供了完整的 WebAssembly(Wasm)支持!
这是跨越 Dart 和 Flutter 的多年投资。如果您一直在关注这些发展,您会看到我们的增量发展:
- 标准化 WasmGC 提案,
- 添加全新的 Dart 编译器后端以生成 WasmGC 代码,和
- 升级我们的 Web 和 JavaScript 互操作性功能,以最好地支持 Wasm。
我们将继续投资于 WebAssembly。我们的下一个努力将实现纯 Dart 应用程序对 Wasm 的全面支持,并完成一些缺失的功能(例如延迟加载)。Dart 中用于 Wasm 编译的端到端工具仍在开发中,但您可以通过一些临时步骤在稳定版中尝试预览。稍后,我们还希望支持 Dart 在 JS 环境之外的 Wasm,例如标准的 Wasm 运行时,如 wasmtime 和 wasmer。
Dart macro:提高开发抽象级别
我们投入了多年的时间来设计 Dart macro系统。为了改善 Dart 的开发体验,macro提供了一种元编程解决方案,就像代码生成一样。这个解决方案内置在 Dart 语言中,为开发人员提供最大的性能、效率和生产力。现在,我们准备提供这种体验的预览!
Dart 开发人员长期以来的一个痛点是序列化和反序列化 JSON 数据这种微不足道但又繁琐的模式。在 Dart 中,为了性能原因,它不支持运行时反射,因此要构建一个可重用且足够强大的解决方案是一个挑战。作为替代方案,我们依赖于代码生成解决方案,比如 JsonSerializable
。这些解决方案依赖于在代码本身之前运行的外部工具,使开发体验变得复杂。
今天,我们宣布了一个关于 JSON 序列化和反序列化的全新方法的预览: JsonCodable
macro。
macro是一种通过在编译时内省其他代码生成更多代码的代码类型。例如,这里有一个应用了新的 JsonCodable macro的 Dart 类 Vehicle:
@JsonCodable()
class Vehicle {
final String description;
final int wheels;
Vehicle(this.description, this.wheels);
}
void main() {
final jsonString = Vehicle('bicycle', 2).toJson();
print('Vehicle serialized: $jsonString');
}
那么,它是如何工作的? toJson()
方法(以及伴随的 fromJson()
构造函数)是从哪里来的?这是我们设计的一个旨在简化开发者体验的新macro系统的实验性实现。当 Dart 编译器看到 @JsonCodable()
注解时,它立即实时定位 JsonCodable macro的定义并开始执行。这会导致macro:
- 创建一个新的“增强类”;一种新的语言构造,可以向现有类添加新的声明。
- 阅读开发者对
Vehicle
类的定义,以确定它有两个字段,description
和wheels
。 - 向增强类添加一个新的
toJson
方法签名。 - 填写
toJson
方法的主体,以处理描述和车轮字段的序列化。
所有这一切都是在没有延迟的情况下发生的。集成体验支持我们现有的开发人员工作流程,例如热重载,正如这个演示所示:
屏幕录像展示了使用macro的体验:最初不存在 toJson 代码补全,但在将 @JsonCodable 添加到类之后,toJson 代码补全立即显示出来。
长期 macro 目标
最终目标是使社区能够创建自己的macro。这提高了 Dart 编程的抽象级别。以数据类为例,这是 Dart 语言中得票最高的功能。我们考虑在 Dart 中添加对数据类的内置支持,但了解到关于这样一个结构应该支持什么的意见存在显著差异,以便为自己设定一个标准。字段应该是 immutable
吗?它应该支持 equals 吗? hashCode
呢?也许 toString
?我们得出结论,支持macro系统将是更好的方法。社区可以创建自己的抽象类型,从而实现更具可扩展性的实验和多样性。
设计和实现如此强大的macro系统是一项重大的任务。我们决心以一种不会对核心 Dart 开发者使用案例产生不利性能影响的方式来完成。这些使用案例包括代码辅助和自动完成、代码分析和热重载。考虑到这一点,我们采取了分阶段的方法:
- 在今天的发布中,我们提供了一个单个macro
JsonCodable
的预览,以便用户开始熟悉使用macro的开发者体验。 - 如果这个macro的推出顺利进行,那么我们希望在以后的版本中将 JSON macro升级为稳定版本。
- 与此同时,我们正在努力完成底层macro系统的设计和实现。一旦我们对其性能和稳定性感到自信,最终目标将是让 Dart 开发者社区能够定义自己的macro。
还有很多工作要完成这些阶段。与此同时,您可以阅读文档以了解有关 Dart macro系统的更多信息,并尝试今天的 JsonCodable macro预览。
其他改进
与往常一样,此版本包含所有持续开发工作,以提供可能的最佳 Dart 版本。在此版本中,我们进行了以下改进:
- 解决了超过 50% 的分析器代码完成错误。(请继续提交问题!)
- 改进了条件表达式、if-null 表达式和 switch 表达式的类型分析与语言规范的对齐(更新日志)。
- 从 dart:cli 库中删除了不完整和不一致的工具,以偿还 Dart VM 中的技术债务。
- 解决了一些不足之处,以改进新的
dart:js_interop
库。
查看更新日志以获取完整故事!不要忘记阅读此版本的 Dart 和 Flutter 联合博客文章,以获取我们共同努力的完整故事!
感谢阅读本文
如果有什么建议,请在评论中让我知道。我很乐意改进。
flutter 学习路径
- Flutter 优秀插件推荐 https://flutter.ducafecat.com
- Flutter 基础篇1 - Dart 语言学习 https://ducafecat.com/course/dart-learn
- Flutter 基础篇2 - 快速上手 https://ducafecat.com/course/flutter-quickstart-learn
- Flutter 实战1 - Getx Woo 电商APP https://ducafecat.com/course/flutter-woo
- Flutter 实战2 - 上架指南 Apple Store、Google Play https://ducafecat.com/course/flutter-upload-apple-google
- Flutter 基础篇3 - 仿微信朋友圈 https://ducafecat.com/course/flutter-wechat
- Flutter 实战3 - 腾讯即时通讯 第一篇 https://ducafecat.com/course/flutter-tim
- Flutter 实战4 - 腾讯即时通讯 第二篇 https://ducafecat.com/course/flutter-tim-s2
© 猫哥 ducafecat.com
end