浅析移动端跨平台开发

最近几年随着移动端开发日益成熟以及 Web 技术的快速发展,跨平台开发技术如雨后春笋一般冒出来,这是所有从业者不能忽视的现象。这种现象导致很多公司主动或被动去研究相关的技术。我也不例外,对它的研究应该是夹杂着被动和主动。作为原生开发者,本来对日常的开发工作驾轻就熟,恐怕内心本身不会有太多意愿去迁移到新的技术,至少我一开始是这种心态;另一方面,跨平台开发在行业内日益受到关注,倒逼开发者去了解它、研究它。对于变化,我们可能本能的抗拒,但内心理性的声音告诉我们:变化是永恒的不变,我们应该拥抱变化。

在经过一段时间的学习和研究,自己觉得对它的认识更加清晰和深刻,于是决定将它们记下来,以便日后记忆模糊了帮助回忆,也可以验证对于它发展的看法。我这里主要谈谈自己对它的看法,技术选择,以及这种技术的基本使用流程。

跨平台开发不是什么新概念,我觉得这是一种很自然的想法。因为我们总是想减轻自己的工作负担,公司则会想减少成本,提高效率,于是就会想能不能一套代码跑到多个平台,两套代码合并成一套,应该可以删除掉不少重复代码,开发和维护的代码量就少了,可能也不需要那么多开发人员了,应该来说还是很有吸引力的。

不过我觉得问题不像看起来那么简单。上面提到了很多跨平台开发的优点,但它也有自己的缺点。而且看到很多二变为一,很容易认为是在减少,加上业界大厂分享的成功经验,更是验证这种想法。但我想强调具体情况具体分析,这里有一个很重要的点,我们所在的公司开发人员水平和大厂肯定是不一样的,所以它能取得成功,我们不一定能玩得转。所以当两套代码合并成一套,在大厂可能确实减少了开发和维护工作,但我们自己的情况可能就不一定了,因为这对开发人员的技术水平要求要高不少,这是需要考虑的一个问题。当我们在一些项目上使用跨平台技术开发时,如果能本着实事求是的态度,相信会更容易成功。有了这些认识,接下来,我们具体来看看跨平台开发技术。

当我们想跨平台时,我们就会寻找平台的共同之处,应该来讲目光很容易聚焦到 Web 技术上。移动端都可以使用 Web 技术,而且它在桌面端已经实现,可以说是一个不错的选择,于是就可以尝试从这里突破。本质上其实就是 Web 应用,我们要做是将设备的能力提供给 Web,Cordova 则是这方面的一个代表。

我认为移动端 Web 应用的主要问题还是性能,虽然现在硬件性能很强悍,但是很多 Web 应用和原生的体验还是有不小差别,所以这时就要权衡了。那能不能有个完美的解决方案呢?既然性能有问题,我们是不可以想办法优化性能,让它和原生体验一样?我认为 React Native 是顺着这种思路出现的,它使用 javascript 编码,最终设备上运行的是原生代码,即然是运行原生代码,性能自然可以做到和原生一致。虽然性能问题是解决了,但它需要用 javascript 编写多套代码,而且开发人员也要懂原生开发,或者有原生开发支持,不然遇到问题恐怕不好解决。

除了 Cordova 和 React Native,Google 最近还推出 Flutter,由于技术栈差异很大,以及个人精力有限,暂时不打算研究。我决定在 Cordova 和 React Native 中选择。React Native 虽然性能不错,但各平台需要自己的代码,这和一份代码的初衷不符;另外它动态部署事件的能力也稍逊一筹,框架本身的发展和原生藕合很紧密。基于这些原因,我偏向选择 Cordova。

Cordova 让 Web 访问设备的能力比较方便,屏蔽了很多差异,但是它没有提供 UI 支持,如果我们想做出漂亮的界面,需要自己做,或者更好的办法是找一个好用的 UI 库。而且最好是搭配一个 SPA 框架,因为我们的应用通常不会只有一个界面,SPA 可以帮助我们在单个 WebView 里实现应用的功能。至此我们的脉络应该是比较清晰了,综合这些信息,我觉得 ionic 是个不错的选择。对于原生开发者,我们一开始可能对 Web 技术不是很熟悉,ionic 将相关技术整合在一起,这降低了学习的门槛。说到这里,我想起在前期,在搜索过程中,很多国产的跨平台技术映入眼帘,如 APICloud, DCloud,但我觉得技术群众基础也很重要,这样我们学的技术在其他公司能有用武之地,也容易招到合适的人才,综合考虑便没有选择这些技术。