[Flutter翻译]跨平台vs本地应用程序

151 阅读9分钟

本文由 简悦SimpRead 转码,原文地址 www.christianfindlay.com

阅读关于你应该用跨平台还是原生工具包来构建应用程序的文章

偶尔,我也会在Twitter上就跨平台与原生应用进行辩论。这是一个困难的对话,因为人们对此有非常强烈的意见。原生应用程序的支持者指出,原生应用程序往往比使用跨平台工具包构建的应用程序更小,性能更强。这是一个公平的观点,但这并不是故事的结局。下面是我的想法,我希望能对这个问题有所启发。

跨平台的简史

跨平台并不是一个新的现象,尽管我们经常把它说得像个新东西。如果你在90年代末使用过互联网,你会经历过Java Applets。这些是在浏览器中运行的小型跨平台应用程序。从长远来看,Applets并没有取得很大的成功,但底层的Java技术却很成功。你可以建立一个用户界面并在任何桌面上运行,并期望它在任何地方都有相同的外观和行为。我们今天仍然在使用这种技术。如果你使用Jetbrains的IntelliJ IDEA或任何衍生产品,如Android StudioRider,你正在使用一个用原始Java Swing库构建的跨平台应用程序。这就是我们在过去建立Java Applets时使用的同一个库。 

许多跨平台的工具包在浏览器内部和外部不断涌现。一些值得注意的工具包是Adobe FlashMicrosoft Silverlight。这些工具包的主要问题是:1)安全和2)缺乏电话支持。这些工具包并没有完全存活下来,但许多技术以不同的形式持续存在。 

今天,我们有许多跨平台的工具包可供选择,其中大多数是面向手机的:Flutter, React Native, .NET (Uno Platform, AvaloniaUI, MAUI 以及其他。一些人试图利用操作系统的原生外观、感觉和行为,另一些人则试图在不同的平台上呈现一个像素级的完美体验。 

问题

应用程序的开发是困难的。如果你有一个成功的应用程序,你有可能至少要写两个:一个用于网络,一个用于手机。我看到的问题是,企业经常在此基础上扩展,编写三个或更多的应用程序。每个应用程序都是一个长期的维护责任,而且每个应用程序都需要专门的技能。如果你创建任何应用程序,除非你愿意花费大量的时间和金钱来使其完美,否则不能保证你会建立一个美丽而稳定的应用程序。 

如果我们慷慨一点,我们可以说,任何应用程序都有大约50%的机会取悦用户并保持稳定。如果我们建立两个应用程序,这个百分比就会下降到25%。如果我们建立三个,那就下降到12.5%。这就是八分之一的机会,至少有一个应用程序会有问题,惹恼用户,或有反复出现的错误。一个企业有很大的机会做出一个或两个好的应用程序。你每增加一个应用,就会增加一个应用拖垮其他应用所创造的商誉的可能性。 

代码是一种责任。你拥有的代码越多,你适应变化的速度就越慢,出错的可能性就越大。软件企业的目标是对代码库的复杂性和规模施加向下的压力。这并不意味着企业会牺牲质量。这意味着,如果质量是以复杂性和维护为代价的,那么决策过程将对这些事情进行权衡。

如果你建立原生应用程序,你就会增加你需要维护的代码库的数量。你可能喜欢Swift,但如果你建立一个Swift应用,就需要其他人来建立Kotlin版本。无法回避的事实是,你需要针对至少两个手机平台,可能还有桌面平台。  

如果你问你的团队中的某人是否是Kotlin或Swift的专家,你会在某个地方得到决定性的举手。有人会喜欢用这种语言构建,并有动力用这种工具包来构建。当你考虑到开发人员经常低估创建--更不用说维护一个应用程序所需的时间时,你可以看到,构建多个应用程序充满了危险。

跨平台的单一来源的救援?

不,这个问题是无法克服的。有许多操作系统,而每个系统都有不同的要求。例如,我写的是跨平台的USB和HID框架。不同平台的USB连接是完全不同的。如果你想在多个平台上连接到一个USB设备,你将面临一场恶梦。我可以根据经验说,在这上面放一个跨平台的层是非常困难的。 

这仅仅是冰山一角。本地工具包为操作系统提供了一个紧密的配合,并为该平台提供了最好的工具。操作系统的开发者在提供开发体验时,会鼓励开发者为他们的平台进行开发。用原生的Kotlin构建一个Android应用,很可能会产生一个小的、性能良好的应用,而且工具会很好。

知道了这些,我们是不是应该用原生工具包来构建所有的应用程序呢?

答案当然是:这取决于。

残酷的事实是,你有两个选择:维护更多的应用程序,或者退回到有一些妥协的单源工具包上。如果你使用一个跨平台的单源工具包,很可能它不会像本地工具包那样完美。但是,软件是关于取舍的。我们根据现实而不是理想世界来做决定。 

决策过程

你有无限的资源和时间吗?如果是这样,选择很简单:构建本地。你可以为每个平台雇佣最好的开发人员,而且在一定程度上,你可以雇佣更多的人,直到这个或这些团队能够可靠地生产高质量的产品。即使如此,也不能保证你的应用程序套件中不会出现一个坏苹果,但从理论上讲,如果有足够的时间和资金,你应该能够将这些应用程序从它们的不良状态中拉出来。

其他企业(包括Facebook、Instagram、微软、宝马、谷歌、eBay、阿里巴巴、腾讯和无数其他企业)的商业主张很明确:把你的时间和资源放在建立一个运行良好的单一来源的应用程序上。所有这些公司都使用跨平台的工具包,而且它们显然运作良好。如果他们不这样做,这些巨头公司就不会使用它们。 

看看使用Flutter(自我渲染)和React Native(更多的原生-UI)的公司名单吧。

你的企业没有无限的时间和资源。你最近开始的那个应用程序将成为你未来维护的负担。你将不得不为每个应用程序雇用至少一个人去维护它们。如果你选择一个跨平台的工具包,你就可以把时间和金钱投入到使那个应用程序尽可能的完美。 

你会做出一些妥协。你可能会发现,该应用程序没有完美的本地外观和感觉。它可能比原生版本略大,但总是有办法减少应用程序的大小,提高性能,取悦你的用户。即使使用原生工具箱,也很容易建立让用户讨厌的垃圾应用。然而,一个或两个优秀的开发者生产一个高质量的应用程序的可能性远远大于多个团队生产多个高质量的应用程序的可能性。 

一些需要思考的问题

关于跨平台应用程序的一个普遍概念是,用户界面必然偏离原生的外观和感觉。这并不正确。首先,像MAUI和React Native这样的工具包使用原生控件,使之很容易实现原生的外观和感觉。Flutter确实采取了一种不同的方法。Flutter确实承担了渲染UI的重任,但有很多工具可以让等待指示器和滚动惯性等东西看起来和感觉都和原生平台一样。Flutter在使你的应用程序感觉像一个原生应用程序方面有很大的作用,但如果这还不够,你可以在你的Flutter用户界面中使用原生UI,并在必要时回落到原生代码。 

简而言之,当人们抱怨跨平台工具包没有原生的外观和感觉时,他们往往是在攻击一个稻草人。 

除此之外,一致的外观和感觉是极其重要的。人们往往低估了让一个应用程序的外观和行为相似的价值。例如,我见过一些应用程序在安卓和iOS之间以不同的方式进行货币兑换。这通常是不可接受的,而跨平台工具包可以解决这个问题。 

一致性是一个品牌问题! 你希望你的用户无论在哪里决定使用你的应用程序,都能认出它。

总结

这并不是要贬低本地工具包。它们有自己的位置,如果你想建立一个操作系统特定的应用程序,你应该使用本地工具包。这是关于维护应用程序的现实。如果你想用原生工具包建立你的应用程序两次,请仔细考虑,并了解涉及多少风险和努力。不要回避这样一个事实:本地工具包意味着至少多了一个代码库。

没有人会争辩说,让一个跨平台的应用顺利运行比在原生平台上做同样的事情更容易。但是,如果你曾经试图创建两个看起来一样的原生应用程序,然后同时维护它们,你永远不会认为它需要的资源更少。

图片 by Pixabay from Pexels


www.deepl.com 翻译