使用 Dart 构建大型应用程序 我们是谁? 选择 Dart 支持库 结论

2025-06-10

使用 Dart 构建大型应用程序

我们是谁?

选择 Dart

支持库

结论

Quire不是第一个用 Dart 编写的 Web 应用程序,也不会是最后一个,但它可能是第一个在客户端和服务器端都严重依赖 Dart 的应用程序。

镖

这是一个有趣的任务管理器,核心采用树形结构。项目本身包含 53992 行代码,1620KB Dart 代码,并基于一些来自社区的开源库构建。

我们是谁?

在开始这个项目之前,我们是一个名为 Rikulo 团队的 Dart 爱好者,我们已经发布了多个 Dart 库,包括 UI 框架、UI 库、Web 服务器、消息服务器、数据库客户端等。

2011 年 Dart 首次发布时,我们都对 Dart 的未来价值充满期待,并立即开始在小规模项目中使用 Dart。最终,我们构建了一个主要使用 Dart 的完整应用程序。在这里,我们想谦虚地分享一些经验,希望能为大家提供一些使用 Dart 进行开发的信息。

选择 Dart

选择 Dart 的理由有很多。其中,对我们来说最重要的有:

  • Dart 强大的类型系统守护着我们,避免无数细微的错误。官方 IDE Dart 编辑器能够快速反馈类型错误,并自动补全代码,同时简化了代码追踪。
  • 我们认为基于类的继承模型比基于原型的继承模型更加直观。
  • Dart 提供了在客户端和服务器端使用相同语言的机会,共享相同的数据模型和代码库。
  • Dart 修复了 JavaScript 中的大部分问题。Dart 在这方面并不完美,但它确实解决了 99% 的旧问题。
  • Dart 拥有一些目前流行的 JavaScript Harmony 特性:Future(承诺)、Arrow Function 等。
  • Dart 拥有强大的团队支持,拥有众多高质量的官方库和组织良好的 API。Dart 仍在不断发展,但其规范已经相当稳定。
  • 在服务器端,我们更喜欢事件循环模型而不是多线程模型。
  • Dart 在编译为 JavaScript 时会执行摇树操作。(见下文。)

选择 Dart 也有一些缺点:

  • Dart 社区比 JavaScript 社区小得多。
  • Dart 和 JavaScript 之间的通信并不简单。
  • 在强类型语言中填充 API 更加困难。
  • Dart 编辑器的性能对于大型项目来说还不是最佳的(目前)。

Dart 拥有强大的类型支持,因此其代码比 JavaScript 更加健壮。此外,Dart 的语法比 Java 简洁,有时(例如,使用函数表达式时)甚至比原生 JavaScript 更简洁。总体而言,使用 Dart 非常舒适,但以下几点除外:

  • Final 字段必须在初始化程序中初始化,早于构造函数主体。
  • Mixin 规范还不够成熟,在 2.0 之前不会修复。
  • 函数声明时没有泛型类型参数,只能在类中使用。(当然,这会增加编译器的工作量。)

客户端

在 Dart VM 登陆 Chrome 之前,你通常希望将产品编译为 JavaScript 来交付。市面上有很多语言可以编译为 JavaScript,但 Dart 凭借一些额外的优势脱颖而出。

  • 在开发过程中,我们在 Dartium 上原生运行 Dart。Dartium 是一款从 Chormium 分支出来的浏览器,内置了 Dart 虚拟机。我们无需在这次迭代中进行编译,从而避免了无数次的中断。
  • 在测试和生产环境中,我们将它们编译为 JavaScript,并在所有主流浏览器中运行。Dart-to-JavaScript 编译器会执行摇树优化 (tree shake),从而从结果中移除未使用的代码。这极大地减少了 JavaScript 代码的大小。

服务器端

服务器端的 Dart 从来都不是 Dart 社区的热门话题,但我们认为 Dart 是服务器端编程语言的有力候选者,因为:

  • Web 服务由于其异步特性,可以与事件循环模型(通过多线程)很好地配合。
  • 服务器端代码比客户端代码需要更高的健壮性和安全性。强类型语言在这方面非常有用。

支持库

Quire 构建了大约 30 个库导入,其中 10 个来自社区,其余的则由 Dart 团队发布。如果你是 Dart 专家,你可能会猜到里面还有 AngularDART 和 Polymer.dart,但实际上它们都没有。

我们不使用AngularDART,因为:

  • 我们需要精细的 DOM 控制。
  • 我们采用独特的架构准则来设计客户端结构,其范式与Angular的逻辑不同。
  • 当我们调查 AngularDART 时,它在编译的 JavaScript 代码大小上产生了很大的开销,但这种情况已经得到了很大的改善。

我们也没有使用Polymer.dart,因为:

  • 由于封装和事件重定向,ShadowDOM 无法与面向选择器的框架(例如 Bootstrap)协作。
  • 您无法从 ShadowDOM 外部注入样式。如果第三方组件集由 Polymer 构成,用户几乎不可能更改其外观。更新:自 2013 年 12 月起,您可以从外部修改内部样式。请参阅Shadow DOM 201

DQuery 和 Bootjack

我们客户端堆栈的基石是 DQuery 和 Bootjack,它们都是 Rikulo 团队发布的开源项目:

  • DQuery是 jQuery 到 Dart 的部分移植,专注于 jQuery 的事件委托系统。
  • Bootjack是 Bootstrap 3 的完整移植,具有几乎相同的 CSS 和 API。

我们按照这种方式构建了我们的应用程序堆栈,以利用我们在 JavaScript 世界的知识和技能。

溪流

Stream是我们的 Web 服务器,纯 Dart 编写,具备路由、过滤器、服务器端 MVC 等功能。Stream 与事件循环模型无缝协作。编写请求处理程序其实就是将一系列非阻塞例程串联起来。与传统的多线程模型相比,它不仅效率更高,使用起来也更轻松。我们还扩展了 Web 服务,使用 nginx 处理 HTTPS 请求,并将请求委托给 Stream。基于这种架构,我们可以单独启动和停止 Dart 虚拟机,并在不中断用户活动的情况下升级服务器。

结论

我们非常享受与 Dart 合作的时光,并期待 Dart 社区取得更多激动人心的进展。最后,如果您对 Dart 的潜力充满好奇,欢迎试用我们的项目管理软件Quire它是免费的!

鏂囩珷鏉ユ簮锛�https://dev.to/zoebourque/building-a-large-application-with-dart-17l4
PREV
您如何看待简约的 UI?
NEXT
最适合开发人员的项目管理软件