对于移动端开发来说,跨平台是一个始终跳不能避免的话题。
而在跨平台移动的技术选择上来说,最流行两个就是React Native与Flutter了。
这两种方式都有它们各自己的优点与缺点。对于跨平台移动开发究竟是该React Native还是Flutter对大众来说是个比较难的选择。
当然,我这篇文章不是来对比这两个技术的,而是来介绍另一个新的移动跨平台技术的选择 -- KMM
KMM
KMM的全称是:Kotlin Multiplatform Mobile,它是jetbrains公司的产品。是一个业务跨平台的移动端开发框架。
在KMM的官网上,它对自己的最简明的一句介绍是:
Share the logic of your iOS and Android apps while keeping the UX native
用中文来理解就是:
不同平台共享业务逻辑的同时又保持各自原生的UI实现
这就是它最大的与众不同之处。那它到底是个什么东西呢,我简单说明下。
跨平台移动开发的思路
对于跨平台移动开发技术来说,以现在流行的来说,总体上来说有以下几种思路:
基于JS来实现跨平台开发
许多年以前,有一个预言:
Any application that can be written in JavaScript, will eventually be written in JavaScript. (任何可以用 JavaScript 来写的应用,最终都将用 JavaScript 来写)
审视今天的技术现状,它已经不是一种预言,某种程序上已经是一种事实。
今天用JS来开发,在任何方向都是值得考虑的选项了,抛开前端它的本家不说,后端有NodeJS,跨平台桌面开发有Electron,跨平台移动开发也有React Native。
只要你懂JavaScript,你就能使用React Native来开发移动应用。React Native的思路是将JS实现转换成原生实现,相当于中间有一层翻译层的存在。
底层重新构建式的跨平台开发
使用React Native仍然有许多困难需要克服,最显著的就是性能以及与原生实现的一些难以兼容的地方,这也是React Native开发中经常需要自己实现原生实现的原因所在。
想要在缺少原生开发能力的前提下,纯粹依赖与使用React Native,是一件比较有挑战的事。
所以,就出现了Flutter这样的解决方案,它的思路与RN完全不同,它抛弃了原生开发技术,基于skia引擎完全重新构建了一套自己的控件与实现。
这意味着它与原生是一个实现模式,性能上更佳。而且使用Flutter你可以真正抛弃原生开发,因为它完全不依赖原生的技术与控件。
选择Flutter,最大的问题在于你选择了另一个生态,无论是从语言还是从各种支持框架,与主流流行的技术几乎没有任何重叠之处。
这个选择对于不缺钱不怕招不到人的大公司可能是可以克服的问题,但大于其它大多数公司来说,这是个阻碍。
保持原生开发,而使业务重用
无论是React Native还是Flutter,它们的缺点都是非常明显的,这使得在移动开发中,它们始终无法取代原生开发,甚至直到今天,原生开发或hibird开发仍然才是主流。
原生开发的优势不言而喻,无论是在人员,技术生态还是性能上都远优于跨平台开发。但原生开发这种一个APP,两端分别开发,始终在成本上是企业非常想避免的事
(虽然实际上原生开发的成本并不一定比跨平台开发多,只是大家感觉跨平台开发似乎只需要一半的成本,但这并不是事实)
于是KMM则完全从另一种思路来解决这个问题。
在移动端开发中,一个显著的特征是:
不同端的业务逻辑是几乎完全一致的,只是它们的实现技术与载体不同而已
所以,KMM则基于上述这个思路,创新式的引入了另一种模式:
在保持原生开发的基础上,使业务模块重用
与众不同的实现
我画了一个图来说明KMM究竟是怎么一个思路。
KMM的实现思路是重用业务。
在Android中开发业务实现,KMM会将你的业务生成iOS类库。你在iOS开发的时候,相当于依赖了一个类库,这个类库提供了本身你业务的很多方法。
在业务重用过程中,数据库SQLite与网络都是支持的,也就是你的业务实现可以使用数据存储查询以及网络等。
而数据存储与网络其实是移动开发中极为重要的两个关键依赖。
关于KMM的技术点,建议访问官网以查阅,我在这篇文章也不详细阐述了。这篇文章只是一个介绍。
KMM官网:https://kotlinlang.org/lp/mobile/
myddd-kmm-scoffold示例项目发布
我一直在关注与调研移动开发的技术,对iOS的SwiftUI,Android的Jetpack Compose都非常感兴趣,做了前端开发之后,就会发现声明式UI是更好的方式。而无论是SwfitUI或是Jetpack Compose都转向了声明式UI。
而KMM也是我关注的一个移动开发技术方向,因为它一方面重用了业务,另一方面又维持了原生开发,似乎是个挺不错的实现思路。
最近五一假期时,基于KMM做了一个可运行的示例项目。这个项目主要是:
- • 最小化的示例及说明如何基于KMM进行开发
- • 示例是一个最小骨架的尝试,包括APP的UI,从服务器获取数据,将数据存储到数据库都包含在内
- • 实现了Android与iOS两端的开发
最终的效果参照如下:
现将这个项目的源码纳入myddd中开源出来。
访问这个项目的源码,请访问myddd在github或gitee的开源主页以了解更多。
- • github: https://github.com/mydddorg
- • Gitee: https://github.com/mydddorg
未来
对于KMM这个技术,我也仍然在学习与尝试中,如果未来证明它的可行性,会考虑把它纳入myddd中,作为myddd在移动端实现的技术选择。
如果你对它感兴趣,可以持续关注我的myddd。
关于我
我是御剑,一个致力于实践与传播编码之道的全栈式程序员。
访问微言码道
(https://taoofcoding.tech)以阅读更多我写的文章;
访问myddd
(https://myddd.org)以了解我在维护的全栈式领域驱动开源框架。