大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!
今天给大家带来的主题是“为何 Flutter 青睐 Dart 而不是宇宙最强的 JavaScript?”,同时对 Dart 和 JavaScript 做了一个简单的对比。话不多说,直接开始进入正题。
JavaScript 是一个具有一流功能的轻量级、解释型和即时编译型编程语言。 尽管它是作为 Web 网页脚本语言而广为人知,但许多非浏览器环境,如 Node.js、Deno、Bun 等也在使用它。甚至在传统服务器领域也有它的身影,例如:njs v0.7.12 扩展了 nginx 功能的 JavaScript/ECMAscript 语言的子集等。
技术上看,JavaScript 是一种基于原型的多范式动态语言,支持面向对象、命令式和声明式风格。
不管你喜不喜欢,JavaScript 目前已经无处不在,与日常开发息息相关。 但是,JavaScript 在其早期并没有引起这么大的关注,自从它与 node.js 一起进入服务器端后,它已经成长为在多个领域占据主导地位的巨头,无论是 Web 端还是手机端、IoT,甚至 AI。
随着各种 Web 前端框架,如: React.js、Angular 、Vue、Solidjs 等的兴起,JavaScript 不可否认已经处于其高光时刻,格外耀眼。伴随着 Facebook React Native 的推出,JavaScript 在混合移动应用程序(PHA)开发场景也是风光无限。同时,近年来随着众多主流浏览器对 WebAssembly 的支持加速,与 JavaScript 双剑合璧更是在众多语言中独占鳌头,实力不容小觑。
介绍了 JavaScript,让我们一起回到本文的主角,即 Dart 这门编程语言本身,顺便看看为何 Flutter 选择了 Dart 而不是宇宙最强的 JavaScript。
Dart 是一种客户端优化的编程语言,适用于多个平台上的快速应用程序。 Dart 由 Google 开发,用于构建移动、桌面、后端和 Web 应用程序。同时,Dart 是一种面向对象、用户定义和垃圾回收的语言,使用 C 风格的语法,可以选择性地转换编译成 JavaScript。目前 Dart (和 Flutter 一样)是完全开源的( BSD-3-Clause license),也符合 ECMA 标准。
Dart 在 2011 年初作为 JavaScript 的直接替代品出现,也爆发出了巨大的潜力。 尽管 Dart 是由谷歌开发的,但在当时并没法引起巨大的轰动,甚至可以说是籍籍无名。 直到 Flutter 的出现,Dart 很快成为混合移动开发应用程序的首选,知名度也是声名鹊起。
随着 2023 年 Dart 3 的发布,这个号称迄今为止最大的 Dart 版本,包含了三个主要改进:
至此,Dart 可以说是完成了一次全新的蜕变。目前 Dart 项目在 Github 上开源,有超过 9.1k 的 star、1.4k 的 fork、代码贡献者 500+,是一个值得长期关注的跨端开源项目。
根据 Dart 官方描述,Dart 目前适用于在任何平台上快速构建应用程序的客户端优化语言,具有以下特点:
Dart 灵活的编译器技术允许开发者以不同的方式运行 Dart 代码,一切只取决于目标平台和目标。
JavaScript 和 Dart 都是跨平台移动应用程序开发的绝佳选择,两者在 React Native 和 Flutter 大战中已经被无数开发者证明。 与 JavaScript 相比,Dart 是相当新的开发语言,但它具有一些非常优秀的特性和来自 Google 的强大支持。
接下来由我带着大家从几个维度对 JavaScript 与 Dart 进行下简单比较,让大家更好的了解这两门语言。
JavaScript 的学习曲线非常平缓,在网上有很多学习资源和常见问题的解决方案可供使用。 而且市场对 JavaScript 的需求量很大,比如:大量的前端框架、就业岗位,目前 JavaScript 俨然已经成为最受欢迎的现代编程语言。而且有标准委员会的加持(如w3c、T39等等),发展也是非常迅速,各种 JS 提案、浏览器特性纷至沓来。
Dart 虽然也有很好的开发文档,但对大多数新手来说, Dart 语言的特性非常让人困惑。 但是,具有 OOPS 背景的开发人员可以轻松掌握语法,因为 Dart 语法类似于 Java。 然而,由于缺乏社区支持和资源,开发者相比之下很难找到解决 Dart 中问题的方法。
JavaScript 拥有大量的三方包,并且自 NPM 注册表启动以来一直在快速增长。 目前,NPM 注册中心拥有超过 130 万个开源包并且还在不断的增长过程中,NPM 目前是世界上最大的三方包注册中心。
相比之下,Dart 虽然也越来越受欢迎,开源软件包数量也在稳步上升,但是要与 JavaScript 社区持平还需要很长的时间。
JavaScript 是一种解释型语言,很容易达到性能瓶颈,这就是为什么很多非常耗时的操作、计算要通过更加底层的其他语言加持的原因(比如通过 wasm)。而相比之下, Dart 的速度总体上几乎是 JavaScript 的两倍。
Dart 支持同时使用 AOT 和 JIT 进行编译,有助于以多种方式构建应用程序。使用 JIT 编译可以加快开发速度,并且可以在发布过程中使用 AOT 编译以实现更好的优化。这项技术目前已用于 Flutter 应用程序开发。下面是 JIT 和 AOT 的简单说明:
JavaScript 是一种动态类型语言,使开发人员能够执行任何代码,错误只能在运行时发现。当然,这个问题开发者可以通过使用 Typescript 、jsDoc、Flow 这样的类型系统来有效避免。
Dart 支持与 TypeScript 使用的类型系统等效的类型系统。 由于 Dart 是一种编译型语言,因此可以有效排除编译时错误,防止将错误本身带到线上环境从而给用户带来不好体验。从这点来看,Dart 比 JavaScript 更类型安全。
JavaScript 在 Web 开发领域占据主导地位,并在 React Native 和 Ionic 移动设备以及 Electron、Tauri、Gluon 等的桌面设备中也越来越受欢迎。 同时 ,Node.js 等作为后端解决方案也得到很多开发者的青睐,具有高可扩展性和快速 I/O 支持。
相比之下,Dart 因其移动开发框架 Flutter 而广受欢迎。 在 Web 和桌面平台上,自从用于 Web 的 Hummingbird 和用于开发桌面应用程序的 Flutter for Desktop 的出现以来,它的受欢迎程度也都在逐步增长。
下面示例展示了 Dart、JavaScript 两种语言的 hello world 示例,从示例代码来看,Dart 的入口会从 main 函数开始,这一点与 C 非常类似,而 JavaScript 更加松散没有诸多限制。
// JavaScript// 代码执行从代码的顶部开始console.log('Hello world!');// Dartmain() { // 代码执行从主函数开始 print('Hello world!');}
下图展示了 Dart、JavaScript 两种语言在 Stack Overflow 上的热度指数,从图上可以明显看出后者相对前者有明显的差异。
在看看 Google Trend 的数据,红色代表 JavaScript、蓝色代表 Dart,得出的结论与 Stack Overflow 上的热度指数高度一致。
本文主要和大家探讨为何 Flutter 会选择 Dart 而不是 JavaScript,相信通过本文的阅读,大家对 Dart 会有一个初步的了解。
因为篇幅问题,文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!
https://mobilecoderz.com/blog/javascript-vs-dart-a-quick-comparison-to-choose-dominating-one/
https://hackernoon.com/why-flutter-uses-dart-dd635a054ebf
https://github.com/dart-lang/sdk
https://www.inapps.net/dart-vs-javascript-detailed-comparison/
https://emeritus.org/blog/coding-dart-programming-language/