全栈新星 -- Dart
谁是Dart?
Dart是google于2011发布的计算机语言。感兴趣的同学,还可以去infoq上看看当年的session(Dart: A Structured Web Programming Language)。不过,即使不看内容,仅从标题就能猜到,Dart当年的志向是为了改变web开发的现状,主要是要解决 javascript的一些问题。但是,当时间来到2020年,Dart就已经不再是当年的Dart了(Dart2.0是一个里程碑式的进步)。且不论说,Flutter现在有多火(从移动到Web端,再到桌面端)。Dart自身也经历了无数次的颠覆性迭代,几乎现代编程语言该有的特征,Dart几乎都有了。比如说,async/await异步模式编程,完全内存隔离的isolate多线程编程范式,函数式编程范式,面向对象的编程范式,静态数据类型系统,JIT+AOT的编译优化,等等等等。比对当前的主流编程语言:Java/C/C++/Javascript/Python/Go/Rust。。。,至少可以说,丝毫不落下风。那么是否语言本身的完备,就足以称其为全栈了呢?当然不能。要做全栈,肯定要有些真本事才行。
谁是全栈?
提起全栈这个词,我猜大家第一个想到的,应该是Javascript吧?当年nodejs横空出世的时候,全栈是最火的词了。但是,时至今日,是否还是热度不减呢?先且不说Nodejs之父已经另起炉灶,用Rust重新撸了个Deno。就连Nodejs的最佳应用场所,也从web后端开发变成了web开发框架的脚手架(CLI)。不夸张地讲,绝大部分人从http://nodejs.org下载了node之后,通常都是用NPM安装各个框架的CLI,Angular/Vue/React,无一不是。
其他能做全栈或者想做全栈的语言,可能还包括Kotlin(目前已经从后端和app,逐步向前端扩展,但是步伐有些缓慢,自家出的Ktor一直不温不火,关键是没有强悍的ORM,现在有些倾向于推荐Kotlin on spring 或者Kotlin on vert.x)。rust社群里,也有呼声要向全栈发展(如果通过WASM跑在浏览器里也算数的话,当然无可厚非。其实,那个Yew框架也蛮有意思的,就是用起来的酸爽,真是谁用谁知道)。其他的流行语言,要么偏前端,要么偏后端。说一句:一个能打的都没有。应该也不会激起民愤。^_^
Dart崛起
而Dart的生态,已经逐渐成型。虽然还不敢说超越Javascript,但是后起之势非常迅猛。
首先就是,flutter框架已经横扫APP圈,Android和iOS两大平台的生态已经日臻完善。国内好多大厂的APP都在从Flutter与原生混合开发的模式,向纯Flutter开发转化。
Flutter for web也已经合并到稳定版本。
前段时间,Linux平台的桌面版Flutter应用,也因为ubuntu平台的高调官宣让大家熟知。其实,桌面版的Flutter应用,是首先从Mac OS开始的,也是最成熟的。据说,windows版的桌面应用也正在加紧开发。畅想一下,基于Dart的Flutter一旦实现前端全平台的制霸。那么,Dart离全栈最佳开发语言,还差多少?我想,大概还差一个Java的距离吧。不过,这个距离其实也不算远。
虽然,现在去Dart的官网看,Dart语言仍然被定义为:
Dart is a client-optimized language for fast apps on any platform。
但Dart从没放弃过server端的开发,Dart-Native就是一个制霸后端的神器。
Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.
显然,server从未缺席。而撑起后端开发的,绝不能仅仅依靠语言本身。象Rust/Golang都是非常优秀的编程语言,但是离Java的距离,还真不是一般的远。Why?就因为没有一个成熟得象Spring一样的框架。
在这方面,Python都比Rust和Go做的好。Django的ORM以及SQLAlchmy都是非常方便且强大的ORM框架,让后端开发可以风生水起。而Dart想在后端有所作为,自然也不能缺了一个强大的后端框架。而它就是Aqueduct。一个由专业的定制化软件开发供应商(StableKernel)发起并维护的web后端开源框架。
Aqueduct
如果你想了解Aqueduct,可以先瞥一眼它的Core Concepts。我简单地列一下要点:
资源视角:Aqueduct是Restful 的忠实拥趸。所有的http请求都被视为一个资源请求。缺省的http content type 是Json格式。这和传统的web框架(比如SpringMVC或者Django)比,是不是省心了很多。
路由/控制器:Aqueduct通过显式编程模式,将url映射做了简单明了的处理。整个应用的所有请求都通过Entry Point里的路由定义实现。当项目大了的时候,要比写的到处都是的url字符串映射(比如Spring里的标注,或者Python Flask里的装饰器或blueprint)好很多。一个路由对应一个URL路径。而控制器包括资源控制器和路由中间件。中间件实现请求过滤,比如安全(认证/授权),日志,异常处理。而资源控制器实现服务请求的业务实现代码。
数据绑定:请求和返回值的数据序列化(例如Json的编码/解码),都可以通过Bind标签自动完成。这虽然是很多web框架的标配,但是通过语言的标注绑定,还是实现得非常优雅,值得一试。
ORM:不仅能够将Dart的model 类直接映射成数据库的表,而且还提供了数据迁移的版本控制。通过
aqueduct db generate
和
aqueduct db upgrade
aqueduct可以自动生成代码对应的数据库表结构,并能够识别每个版本之间的数据模型的差异,并自动生成对应的升级/降级的脚本。
OAuth2.0:Auqeduct原生支持Oauth2.0框架,当然不喜欢的话,也可以自己通过中间件实现。但是,如果采用OAuth的话,几乎是不写一行代码,就能立刻拥有认证和授权能力,是不是很赞?
文档化:Aqueduct原生支持Open API 3.0(前身是Swagger Doc)。仅一句命令:
aqueduct document
就可以得到标准的html格式的Open API文档,是不是很爽?
野望 -- 看好Dart的理由
1.Dart的金主
没人会怀疑Google在新技术推广上的实力。
Android就是最好的实证;
还有Chrome,改变浏览器格局的大杀器;
Kubenertes改变云计算的容器编排器/云原生操作系统;
Fuchsia,下一代微内核操作系统
。。。。
2. Dart的编程范式
Dart是我见过的编程范式最全的语言之一。虽然说是之一,其实真的能不相上下的语言也几乎没有谁。Java经过不断的迭代,基本上把函数式编程的弱项补的差不多了。但是在异步协程方面还是有待加强(Vert.x很不错,但是还比较小众,也比较轻量级)。Dotnet,恕我直言,就是一个支离破碎的大杂烩。期待微软在dotnet 5发布的时候,能够一统江湖,实现自己许下的愿望:七大平台统一。说实话,微软绝对有这个实力,而且近来在开源社区方面也是表现得越来越好,但是船大了不好调头。估计,向Linux/Mac移植就是一个不小的工作量,还有移动端和web端一直也都是其弱项。象新生代的Rust(连续多年Stackoverflow的最受欢迎语言)和Golang,因为语言的定位不同(系统级语言,而不是应用级语言),在面向对象方面,一直是浅尝则止。而全栈语言当然是应用级的开发语言,不是的话,也就没有前端/后端之说了。所以,一个同时兼顾应用建模能力(OOP)和开发效率(FOP)的完备语言,在目前的开源界,真的是屈指可数。
3. Dart的生态
生态很重要。没有生态的语言,没有未来。目前,能够和FLutter比生态的,几乎没有。假以时日,Aqueduct的生态蓬勃而起,Dart的全栈时代就真的到来了。这还不要说,Google一直在憋的大招:Fuchsia。如果Fuchsia能够象Android一样,甚至超越了Android。那Dart的明天必将更加辉煌。
所以,强烈看好Dart!
学习Dart,学习Flutter,学习Aqueduct,从今天开始!
评论