Dart是在Go之后从谷歌出现的,最近作为Flutter跨平台前端框架背后的语言,其受欢迎程度激增。这对那些对云原生基础设施感兴趣的人来说很重要,因为有一种对 "全栈Dart "的推动,Flutter开发者可以使用相同的语言来构建他们应用程序背后的服务。Dart支持超前(AOT)编译,这意味着它可以创建快速启动的轻量级二进制文件,使其很适合功能即服务(FaaS)环境。
Flutter是谷歌的UI工具包,用于从一个代码库中为移动、网络、桌面和嵌入式设备构建漂亮的、本地编译的应用程序。
自从Dart作为 "结构化网络编程的新编程语言 "推出以来,它一直以前端开发者为目标,并在Flutter跨平台框架中找到了吸引力。Flutter 1的应用程序可以被部署到安卓和iOS。有了Flutter 2,应用程序也可以为网络和桌面建立。Canonical选择Flutter作为新的Ubuntu桌面安装程序的基础。对于作者所在的@公司来说,选择Dart是因为它在服务器端具有类似于Erlang的功能,同时还能用Flutter构建全栈应用程序。鉴于Flutter背后的势头,以及它被谷歌使用,它似乎不太可能加入 "被谷歌杀死 "的墓碑。
尽管有React Native、Xamarin、Ionic和Cordova等其他框架的激烈竞争,Flutter的受欢迎程度仍在上升,这使得Dart在RedMonk编程语言排名中被推至第20位。2021年6月。
上一季度,我们讨论了Dart在长期停滞后的显著上升,这种上升几乎可以肯定归功于流行的Flutter框架,并提出了一个问题,即Dart是否已经完成了移动,或者它是否有足够的动力将其带入前20名。四分之一之后,我们得到了答案,Dart首次进入前20名,在这个过程中取代了Perl。这一成就在手,现在的问题是Dart是否能维持前20名的排名,如果是的话,它是否能继续在排行榜上前进。
谷歌在2021年I/O大会上发出的信息几乎是:"如果你学会了Dart来编写Flutter应用程序,为什么不使用它来实现谷歌云平台的后端服务呢?他们把这称为,"全栈Dart"。在随后的Flutter开发者活动中,如Geekle 2021,来自AWS和Azure的代表出现了,他们的信息归结为:"你也可以在我们的云上运行基于Dart的服务"。
"Dart是一种客户端优化的语言,适用于任何平台上的快速应用"
-dart.dev
Dart是一种强类型的、垃圾收集的、面向对象的语言,具有类似C语言的语法。因此,对于任何使用过Java或C#的人来说,它看起来非常熟悉,而且许多相同的模式(和反模式)都适用。
你好,世界
void main() { print('Hello, World!'); }
就像Java一样,创建对象很容易被使用一次,然后被扔掉,等待垃圾回收。
垃圾反模式
var args = ['parent-element', 'child-element']; # 创建一个要传递的参数对象 var value = getValue(args); # 创建一个结果对象并调用函数 if (value != null) { # 结果对象的空测试值 return value; # 返回结果对象 }
许多JavaScript程序员都会熟悉的async/await模型是用来支持异步编程的,这对基于事件的应用特别有用
异步函数示例
Future<String> createOrderMessage() async { var order = await fetchUserOrder(); return 'Your order is: $order'; } Future<String> fetchUserOrder() => // Imagine that this function is // more complex and slow.
Future.delayed(const Duration(seconds: 2), () => 'Large Latte', ); Future<void> main() async { print('Fetching user order...'); print( await createOrderMessage()); }
并发是通过隔离器实现的--"类似于线程但不共享内存的独立工作者,仅通过消息进行通信",但在部署到浏览器时除外,此时应使用HTML5 Web工作者来代替。该语言的这一方面让人联想到Erlang进程,而且实现行为者模型也很简单。
该语言和核心包采用3-Clause BSD许可,许多第三方包也使用该许可。
Dart的软件包管理器是pub.dev,应用程序的依赖关系在pubspec.yaml文件中定义,该文件可以引用发布的软件包和Git URL中的软件包。任何拥有谷歌账户的人都可以发布软件包,但该网站支持基于DNS的验证发布者的概念,为软件包提供一定程度的来源。软件包也会使用 "pub积分 "进行评分,评分标准包括:遵守文件惯例、文档、多平台支持、通过静态分析、依赖关系是否是最新的,以及是否支持健全的无效安全。
pub.dev公共API有一些端点,用于列出IDE中包名完成的顶级包,以及列出一个包的所有版本。
当在Dart虚拟机(VM)中运行应用程序时,它支持与其他基于VM的语言类似的及时编译(JIT)。这在启动时间和长期效率之间产生了通常的交易,因为虚拟机已经能够优化运行代码。Dart虚拟机包括一个剖析器,最初被称为 "Observatory",它可以与DevTools调试和性能套件一起使用。
JIT的替代方案是提前编译(AOT),Dart SDK为Arm、Arm64、x86或x64创建本地二进制文件,或为部署在浏览器上的应用程序创建JavaScript。AOT二进制文件的启动时间非常短,这使得它们很适合 "无服务器 "环境,如功能即服务(FaaS)。
然而,目前还没有任何FaaS平台原生支持Dart,这意味着应用程序必须被打包成容器,并在支持容器化应用程序的各种平台上运行。谷歌已经创建了Dart的功能框架,为构建FaaS提供一些脚手架。该框架被设计成可以在本地运行,也可以在Google Cloud Run、Google App Engine和基于Knative的环境中运行。它包括一个全栈实例,在后端运行一个Dart服务,在前端使用Flutter桌面/网络应用。
自2021年5月以来,DockerHub上已经有了一个官方的Dart镜像,其中包括Dart SDK的debian:buster-slim镜像。
Dart是一种动态链接的语言,所以不像Go,它不可能创建一个静态链接的二进制文件,可以放在一个 "从头开始 "的空容器中。为了获得类似的小容器,Dart镜像包括一个/runtime目录,其中包含了最小的平台库工作集。一个微不足道的 "Hello World "类型的应用程序适合于3.5-4.5MB,这取决于底层平台的架构。
FROM dart AS build WORKDIR /app COPY ./mydemoapp.dart . RUN dart pub get RUN dart compile exe /app/mydemoapp.dart -o /app/mydemoapp FROM scratch COPY --from=build /runtime/ / COPY --from=build /app/mydemoapp /app/mydemoapp ENTRYPOINT ["/app/mydemoapp" ]
Dart SDK可用于Windows(x86和x64)、Linux(x86、x64、Arm和Arm64)和MacOS(x64和Arm64)的开发。SDK可以为它所运行的平台创建本地二进制文件,但目前不支持交叉编译。因此,创建多架构的二进制文件需要多架构的构建基础设施,或使用仿真技术(如QEMU与Docker Buildx)。
官方的Dart镜像只支持linux:amd64,对Arm/Arm64的支持来自社区分叉。
Flutter支持交叉编译,因此Android的原生二进制文件、各种桌面的原生二进制文件以及Web应用程序都可以从任何支持的平台上构建和测试(尽管构建和发布iOS应用程序仍然需要Mac和Xcode)。
Dart正处于积极的开发阶段,新功能的出现使该语言更快、更安全、更灵活。
在2021年3月发布的Dart 2.12(与Flutter 2一起)中,健全的空值安全意味着类型默认为不可空值。这意味着在运行时出现的空引用错误,可以在编辑和编译过程中被识别出来。我们仍然可以通过在类型声明中添加"?"来声明可归零的变量,所以开发者可以控制他们如何使用这一特性。
// var i = 42; // 推断为一个int. String name = getFileName(); final b = Foo(); // 要表明一个变量可能有null的值,//只需在其类型声明中添加? int? aNullableInt = null;
引入健全的null安全被认为是对pub.dev中的软件包的一个突破性改变,谷歌建议主要的版本号应该被提升到null安全兼容的版本。几个月后,大多数流行的软件包(以及它们的底层依赖关系)都采用了健全的null安全,这表明生态系统是活跃的,能够接受变化。
Dart正在进行实验,以便能够编译成Web Assembly(WASM)模块,这在一定程度上依赖于WebAssemby/gc,以提供对垃圾收集语言的更好支持。
Dart也可以通过基于Wasmer运行时的:wasm包来使用WASM模块。这为Dart应用程序以独立于平台的方式使用C、C++、Rust等库打开了大门(这应该比由外国函数接口[ffi]提供的C互操作要灵活得多)。
如果你 不熟悉 Web Assembly,你可能想阅读Kevin Hoffman 在WTF上的 迷你系列 文章 (一、二),它提供了一个很好的简明概述。
在可用的开发者工具方面,Dart和Flutter有很多不错的选择。Flutter的入门指南引导用户使用基于JetBrain的IntelliJ IDEA的Android Studio。
通过使用Dart Code扩展,Dart和Flutter在VS Code中也有良好的支持。
另外,还可以使用DartPad在浏览器中编辑和测试应用程序,DartPad在Dart教程中被广泛使用。
正如我们所看到的,Dart具有广泛的功能。然而,也有一些令人沮丧的地方。
YAML被Dart广泛使用,尤其是在pubspec.yaml文件中定义依赖关系。YAML解析器是pub.dev上的一个包,它的出现让人失望。
这个库目前不支持转储到YAML。你应该使用dart:convert的json.encode来代替。
对于大多数客户端应用程序来说,仅仅解析YAML通常是没有问题的。但是不能转储YAML(支持V1.2版本和跳转)对于服务器端应用程序和命令行工具来说是个麻烦,而且往往意味着Python脚本或类似的东西需要被带入Dart构建管道,因为不能使用纯Dart方法。
Dart支持TLS 1.0和1.1,这两个版本现在已经过时了,但是还没有办法指定1.2为最小版本,这就使应用程序有可能受到降级攻击。在SDK repo上有许多问题正在寻求解决这个问题,#37173最近指出。"这是一个内部客户的P1"。
Dart SDK存档页面上有各种渠道(稳定版、测试版和开发版)的最新版本号,但没有简单的方法(如RSS订阅)来订阅更新。Dart公告谷歌小组只提供了稳定版的次要版本(不是补丁),而GitHub上的SDK发布页面则对开发版的发布过于嘈杂。也许最好的来源是dart-docker repo中的version.json。
Dart语言社区是作为更大的Flutter社区的一个子集而存在的,它跨越了通常选择的在线会议场所和通过各种活动的物理世界(因为事情回到了人际交往)。
Dart和Flutter是谷歌开发者专家(GDEs)的两个独立类别,尽管在实践中,它们之间有巨大的重叠。
最好的开始是Dart教程页面,它有关于基础知识、服务器端Dart和网络应用的部分。许多教程都使用了Dart Pad,这样就可以在浏览器中编辑和运行示例代码,这意味着不需要安装任何东西就可以开始使用。