# 3. 一些桌面端应用总结
# 总结一些桌面端框架
因为在业务上,我第一次正式接触大型项目,也遇到了很多不懂的名词/框架,然后在导师的指引下开始了对 eletrcon 和 nw.js 等框架的了解。在查询了网上资料之后,我决定要对一些桌面框架进行一下总结,以便我后续的学习。
# 1. Electron
Electron(原名为 Atom Shell[5] (opens new window))是GitHub (opens new window)开发的一个开源 (opens new window)框架 (opens new window)。它使用Node.js (opens new window)(作为后端)和Chromium(谷歌浏览器的开源项目)的渲染引擎 (opens new window)(作为前端)完成跨平台的桌面GUI (opens new window)应用程序 (opens new window)的开发。Electron现已被多个开源Web应用程序 (opens new window)用于前端与后端的开发,著名项目包括**GitHub的****Atom (opens new window)和微软 (opens new window)的Visual Studio Code。—维基百科 (opens new window)(其实可以看成一个浏览器)**
- 在看了维基百科的介绍之后,我有两个最直观的想法:一、VSCode 居然是用 eletron 写的!二、这个图标的设计和颜色很好看!(有点像写轮眼 hh,发给同学之后他也这么觉得)
下面正式介绍一下什么是 electron:Electron 是一个能让你使用传统前端技术(Nodejs, Javascript, HTML, CSS)开发的一个跨平台桌面应用的框架。这里所说的桌面应用指的是在Windows、OSX 及 Linux系统上运行的程序。
看看网友的总结:
---选自:Electron 系列文章-什么是 Electron? (opens new window)
# 2. NW.js
NW.js 也是基于**
Chromium
和Node.js
运行的, 以前也叫nodeWebkit**。这就给了你使用 HTML 和 JavaScript 来制作桌面应用的可能。在应用里你可以直接调用 Node.js 的各种 api 以及现有的第三方包。应用也是可以跨平台,微信 web 开发工具、钉钉的底层框架就是 NW.js。也就是说经过它的打包虽然看起来是一个电脑应用程序,但他实质上相当于一个 UI 浏览器,只不过是以一个轻量的应用程序呈现出来,因此完全支持浏览器的所有功能。
# 2.1. 比较一下 NW.js
----NW.js 和 Electron 优缺点分析对比 (opens new window)
# 3. Flutter
首先,我们要明确 Flutter 是什么:Flutter 是 Google 一个新的用于构建跨平台的手机 App 的 SDK。写一份代码,在 Android 和 iOS 平台上都可以运行。----Flutter 是什么? (opens new window)
-------------------下面引用自:桌面上的 Flutter:Electron 又多了个对手 (opens new window)
但是在现在,Flutter 可以通过一次编写,可在 Android、iOS、Windows、Mac 和 Linux 上进行原生部署,并通过 AngularDart 将所有的业务逻辑共享到 Web 上,也就是说,Flutter 也可以用作桌面端了。但是在介绍 Flutter 在桌面端的应用前,我想先介绍一下什么是 Flutter,以及他的特点是什么?
下文选自:什么是 Flutter? (opens new window)
# 3.1. Flutter 的特点:
# 3.1.1. 跨平台自绘引擎
Flutter 既不使用 WebView,也不使用平台(Android、iOS 等)的原生控件。相反,Flutter 使用自己的高性能渲染引擎来绘制 Widget。这样不仅可以保证在 Android 和 iOS 平台上 UI 的一致性,而且也可以避免对原生控件依赖而带来的限制及高昂的维护成本。
- Flutter2018 年才发行了第一个“稳定”版本,这意味着他其实还不成熟,目前大多数人只是将他用于移动端开发,但是根据网上一些资料显示,Flutter 有着非常大的发展前景,而且在国外一些网友看来,在将来 Fultter 将会取代 Electron。(因为 Electron 本身就是根据浏览器模型建立的框架,浏览器和电脑客户端本身还是有些区别的)
# 3.1.2. 高性能
Flutter 采用 GPU 渲染技术。
Flutter 高性能主要靠两点来保证:
- 首先,Flutter App 采用Dart 语言开发,Dart 在JIT(即时编译)模式下,速度与 JavaScript 基本持平;而且 Dart还支持 AOT(提前编译)模式,当以 AOT 模式运行时,JavaScript 便远远追不上了。速度的提升对高帧率下的视图数据计算很有帮助。
- 其次,Flutter 使用自己的渲染引擎来绘制 UI,布局数据等由 Dart 语言直接控制,所以在布局过程中不需要像 RN 那样通过 JavaScriptCore 在 JavaScript 和原生之间进行通信,这在一些滑动和拖动的场景下具有明显优势,因为在滑动和拖动过程中往往都会引起布局发生变化,所以 JavaScript 需要和原生之间不停的同步布局信息,这和在浏览器中要 JavaScript 频繁操作 DOM 所带来的问题是相同的,都会带来比较可观的性能开销。
# 3.1.3. Dart 和 JavaScript 的区别
我们看看 Flutter 为什么选择 Dart 语言?笔者根据官方解释以及自己对 Flutter 的理解总结了以下几条(由于其它跨平台框架都将 JavaScript 作为其开发语言,所以主要将 Dart 和 JavaScript 做一个对比):
- 开发效率高
- 基于 JIT 的快速开发周期:Flutter 在开发阶段采用 JIT 模式,这样就避免了每次改动都要进行编译,极大的节省了开发时间;(Dart 运行时支持)
- 基于 AOT 的发布包:Flutter 在发布时可以通过 AOT 生成高效的 ARM 代码以保证应用性能,而 JavaScript 则不具有这个能力。(编译器支持)
高性能
Flutter 旨在提供流畅、高保真的 UI 体验。为了实现这一点,Flutter 需要能够在每个动画帧中运行大量的代码,这意味着需要一种既能提供高性能的语言,又不会出现丢帧的周期性暂停,而 Dart 支持 AOT,在这一点上可以做的比 JavaScript 更好。
快速内存分配
Flutter 框架使用函数式流,这使得它在很大程度上依赖于底层的内存分配器。因此,拥有一个能够有效的处理琐碎任务的内存分配器将显得十分重要,如果 Dart 语言缺乏此功能,Flutter 将无法有效地工作。当然 Chrome V8 的 JavaScript 引擎在内存分配上也已经做的很好了,事实上 Dart 开发团队的很多成员都是来自 Chrome 团队的,所以在内存分配上 Dart 并不能作为超越 JavaScript 的优势,但对于 Flutter 来说,它需要这样的特性,而 Dart 也正好满足而已。
类型安全
由于 Dart 是类型安全的语言,支持静态类型检测,所以可以在编译前发现一些类型的错误,并排除潜在问题,这一点对于前端开发者来说可能会更具有吸引力。与之不同的,JavaScript 是一个弱类型语言,也因此前端社区出现了很多给 JavaScript 代码添加静态类型检测的扩展语言和工具,如:微软的 TypeScript 以及 Facebook 的 Flow。相比之下,Dart 本身就支持静态类型,就是它的一个重要优势。
Dart 团队的支持
由于有 Dart 团队的积极投入,Flutter 团队可以获得更多、更方便的支持,正如 Flutter 官网所诉:“我们正与 Dart 社区进行密切合作,以改进 Dart 在 Flutter 中的使用。例如,当我们最初使用 Dart 时,该语言并没有提供生成原生二进制文件的工具链(工具链对于实现可预测的高性能具有很大的帮助),但是现在它实现了,因为 Dart 团队专门为 Flutter 构建了它。同样,Dart VM 之前已经针对吞吐量进行了优化,但团队现在正在优化 VM 的延迟时间,这对于 Flutter 的工作负载更为重要。”
# 3.2. 对比一下 Electron 和 Flutter
为什么 Electron 不好?---Goodbye Electron, Hello Flutter (opens new window)
----Flutter 桌面 vs Electron:为什么选择 Flutter 作为您的下一个桌面应用程序 (opens new window)
——国外网友的看法就是,Electron 比较笨重,而在这篇文章---桌面上的 Flutter:Electron 又多了个对手 (opens new window),里面也详细比较了 Flutter 和 Electron 的运行时间。确实能很明显的感受到 Flutter 的高性能。
- 不过高性能是一方面,能否适应业务需求又是另外一方面了。在看了国内掘金、知乎、思否等网站的一些评论之后,网友普遍认为现在将 Flutter 应用于桌面端还过于早,毕竟现在 Flutter 的移动端还没做得很完善。不过将 Flutter 应用于桌面端确实是一个可以关注一下的事情。这里就简单一提,等以后真正接触了再来总结。