使用 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 团队发布的开源项目:
我们按照这种方式构建了我们的应用程序堆栈,以利用我们在 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