Dart/Flutter 现在有宏/元编程
Dart 正在引入一套实验性的宏和元编程系统,类似 Java 的注解处理器,目标是取代 Flutter 和服务端 Dart 项目中常见的大量样板式代码生成。参与者围绕宏在性能和开发体验上的潜在收益,与宏复杂度、编译期开销和可维护性等常见担忧展开讨论。讨论还扩展到 Dart 在语言生态中的位置——它在工具链、类型系统以及基于 Flutter 的跨平台 UI 方面的优势,与非 Flutter 库生态的不足、Flutter 的性能问题(尤其是 Web 和嵌入式平台视图),以及相较于 Kotlin/Compose 和 TypeScript 等替代方案时,对 Google 长期投入的担忧。
宏特性与状态
- 链接的仓库只是一个演示;权威规范在 Dart 语言仓库中。
- 宏仍处于实验性/alpha 阶段,尚未 GA,但已经在 SDK master 分支中。
- 它们在编译时运行,更接近 Java 的注解处理器,而不是运行时反射。
- 旨在取代当今大量的代码生成,并与编译器/AST 更好地集成。
代码生成、反射与工具链
- 当前 Dart/Flutter 工作流高度依赖代码生成(
.g.dart、build_runner),有些人觉得这很笨重,而且在 CI 中很容易过时。 - 宏应当在编译前以内存方式运行,并避免提交生成文件,从而有望提升性能和开发体验。
- 对宏的一般担忧包括:宏重度代码可能难以阅读、编译时间更长,以及“两个语言”的问题。
- 反驳观点:Dart 宏用普通 Dart 编写;并不存在单独的宏语言。
Dart 的语言角色
- 它因即时编译、强静态类型、空安全和工具链而受到称赞。
- 与其他方案相比:
- 对比 Rust/Go:Dart 有 GC 和异常。
- 对比 JavaScript/TypeScript:Dart 是静态类型的,没有 JS 的历史包袱和怪癖。
- 许多人认为 Dart 的主要价值在于与 Flutter 的紧密集成,不过也有人将其用于全栈和服务器端。
生态、Web 与即将到来的特性
- 普遍看法是:生态足以满足许多需求,但仍弱于 JS、Python 或 JVM 语言,尤其是在 Flutter 之外。
- 有人希望 Dart 成为 Web 应用中 TypeScript 的严肃替代品;也有人怀疑它无法超越 TS 的类型表达能力。
- 还提到了新的 Web API、Wasm 支持,以及共享内存多线程提案,认为这些方向很有前景。
Flutter 性能与 UX
- 对性能存在强烈分歧:
- 许多人报告在移动端/桌面端应用流畅高效,尤其是在使用 Impeller 渲染器时。
- 另一些人则描述了较高的 CPU 占用(例如 Cupertino 文本输入框、Web 演示、广告或 webviews 之类的平台视图)以及卡顿的滚动,尤其是在 iOS 和 Web 上。
- 共识是:Flutter Web 的成熟度和性能都不如原生目标;如果 Web 是主要平台,它并不理想。
替代方案与长期性担忧
- Kotlin/Compose Multiplatform 被讨论为一个正在崛起的竞争者,具备更好的原生视图互操作性,但它仍处于 alpha 阶段且较为粗糙。
- 一些人对 Google 对 Dart/Flutter 以及 Fuchsia 的长期投入表示担忧,而另一些人则认为最近的采用情况与“正在消亡”的叙事相矛盾。