Skip to content

背景

作为前端程序员, 如果给你一个 APP 让你去做, 你会怎么做呢? 如不限于技术层次,优先想到的就是 Android 原生系统, 但是面对 Android 前端程序员无法上手以及去学习,单纯的想要从 Web 层次去想技术方案; 无非就是市场上的几种方案,h5, uni-app, React-Nativ, Flutter; 单做过 H5 移动端混合开发的都清楚, H5 的页面或者纯 H5 开发 APP,也是可以开发的, 但是最后使用人数并不理想, 达不到一个原生流畅的效果; 而 React-Native 对前端来说也许是一个优选的方案,使用效果以及框架基本上都是前端技术,熟悉 react 并且上手是很快的; 但如果功能较为复杂, React-Native 也会有一定的影响;但效果明显比 H5 流程的很多;

对于 Flutter 来讲呢,技术层面在国内并不热门,也有不少大厂也会选择 Flutter 作为开发 App 的首选; 但是学习成本是比较高的,对前端程序员来讲,可能会有点陌生甚至不熟悉;作为 dart 语法的 flutter 在性能以及各个方面要比前面的框架要有优越性;

混合开发的 WebView

混合开发 APP 当然离不开 WebView, 使用 WebView 开发的成交较低,开发效率也会提升一个等级, 也就是前端人员不陌生的;

对于跨端来讲,也许会用 WebView 的方式, 同时也是满足跨端的条件的;

为什么不推荐使用 WebView?

移动设备 APP 都是先下载后使用, 当你下载完成之后, 你页面资源以己经缓存了;而 webview 加载的是 web 页面, 也就会有 web 的特性, 打开 webview 之后,再去加载 web 资源 会在性能上有些影响;

uni-app/react-native

这是大多数人的选择,毕竟刚开始我的想法 uni-app 也是首选, 但是在了解之后,在 List-view 方面可能会有性能问题,毕竟 uni-app 是以 html, js 的方式作为渲染的; 自然会有性能问题;

像社区活动成都还是很高的, 毕竟是前端技术, 上手并不难,但如果想应用到设备中可能还是有点缺陷;但总体还是不错的选择, 如果没有其他技术方案替代的话, 可以考虑使用 uni-app;

react-native 的性能弥补了 uni-app 存在的缺陷;

从本质上来讲,以 RN 为例,跟 webview 不同的地方就在于,webview 是使用 html 的 dom 描述,由浏览器进行相应的渲染,因为是单线程的原因,在渲染的同时会阻断 js 的执行,而 RN 则不同,它的方案是将 html 转换为 js 可以识别的 ast 代码,再由 native 基于 ast 代码进行绘制,由于 native 是可以进行多线程并行的,所以在渲染跟执行的过程中并不会被阻断,这也就变相的解决了一些使用 webview 进行跨端的难题

但是这也相应有不少的缺陷

  1. 由于 js 跟 native 不是在同一个线程执行,那么相应的他们的通信会带来不少的损耗
  2. iOS/Android 他们的页面绘制方式不同,代表着要添加不同的组件来适应
  3. 依赖于 native,那么就表示他的 css 转义会变得更加困难,很多 css 也不一定能够完整的实现

当然,最大的问题依旧在于维护上

不依赖于 webview 代表着你的页面是不完全动态化的,至少你的组件是固定的,也就是在相同的页面使用情况下,如果想对组件进行修改,那么还是需要依赖于 native 提供新的组件能力,这样的话发版依旧会成为一个困扰的问题,而且维护的成本又进一步的上升的

Flutter

flutter 是我最近在接触和学习的技术之一;

因为接触时间较短,理解的并不是很深入;

可以说 RN 类型的框架他还是拥抱了部分 web 的生态,却又不是完全的拥抱,但是 flutter 这个框架从出生就是不打算继续借着 web 来发展

它本身是使用 skia 绘制到屏幕上的,也就是说,通过自建绘制能力,来保证多端的统一性,这样做的好处在于能够完全的减少双端差异的人力投入,也不需要使用 native 跟 js 进行 bridge 的交互从而得到对应的页面,讲到比较熟悉的一个古老方案就是 QT

方案的思想跟实现都是比较适合跨端能力的体现,但是问题在于他不依赖于前端生态,那么前端人员入手的时候会带来一定的困扰,所以目前市面上多出了很多基于 flutter 设计的前端实现方案,类似于 kraken、liteApp 等等

不可否认的是这种方案的思想是能最根本解决跨端带来的困扰,但是他的动态化能力偏弱,在部分领域依旧不是那么适用

这篇文章可以更加清晰的理解 Flutter: 每个 Flutter 开发者都应该知道的框架总览

对我而言, 选择 Flutter 的原因无非就是这个几点:

  1. 谷歌的 app 框架, 性能,流畅问题
  2. 新技术,除了前端跨端方案之外的一种特殊的方案;
  3. Flutter 的前景以及 Flutter 面向对象的开发方式;
  4. 间接的了解 Java, TypeScript 的语法;
  5. 好奇心,想深入了解这是什么,技术新奇

wangxiaoze | MIT License.