65.9K
CodeProject 正在变化。 阅读更多。
Home

Xamarin 与 Ionic:移动端、跨平台、大对决

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (43投票s)

2016 年 2 月 16 日

CPOL

7分钟阅读

viewsIcon

129029

Xamarin 与 Ionic:移动端、跨平台、大对决

是否曾面临需要在相互竞争的框架之间做出选择,需要做出一个您/您的客户不会后悔的决定?如果这些框架是用于构建跨平台移动应用,并且是 Xamarin 和 Ionic,那么希望本文能有所帮助。

背景是我最近有幸在两个连续的项目中使用了这些相互竞争的框架。项目 #1 使用了 Xamarin(更具体地说是 Xamarin Forms),这是基于 C# 的框架,用于构建完全原生、跨平台的应用。

项目 #2 使用了 Ionic,这是一个基于 Angular.js、Cordova/PhoneGap、HTML 和 JavaScript 的框架,用于构建看起来和行为都像原生应用,但实际上在嵌入式浏览器中运行的应用。

如果我必须推荐一个,我会考虑客户的预算、期望的最终产品和时间表。我会考虑开发速度、上手时间以及可维护性。基本上,我将根据以下六个标准进行评估。

1. 价格:Ionic++

最明显的框架区别就是价格。Ionic 免费的价格标签似乎是显而易见的。然而,Xamarin 每开发者每年 1000 美元的价格对于大多数公司来说是可以接受的,特别是如果有一个足够有说服力的理由的话。两个非常有说服力的理由是:

  • 我们只有 .NET 开发人员;以及
  • 我们的架构已经完全是 .NET 了

如果这些要点适用于您,那么价格很可能是有道理的,Xamarin 的选择也很明显。然而,如果您拥有混合的人才和技术,那么免费是很难被超越的。

更新:自 2016 年 3 月 18 日起 Xamarin 已免费。请忽略此区别点。所有剩余的点(最终产品、开发速度、可维护性)在 2017 年 3 月仍然有效。

2. 最终产品:Xamarin++

您的客户将无法准确说出为什么他们更喜欢竞争对手的原生应用,但您最终更有可能输掉。

意外:一个基于 HTML 的应用程序,无论外观如何精美,永远无法像原生应用程序那样看起来、感觉和运行。

Ionic 的外观和感觉有多大的不同?如果您坚持使用默认控件并且不进行过度定制,我保证您的用户不会注意到。然而,当面临选择时,您的客户将无法准确说出为什么他们更喜欢竞争对手的原生应用,但您最终更有可能输掉。

我们很幸运有一位全职设计专业人士为 Ionic 项目提供协助,而他的一些(相当耗时的)建议如果当初选择了 Xamarin 将不会成为问题。此外,UI 总是感觉有点卡顿,即使理论上使用了 GPU 加速 的 CSS3 过渡。

简单来说,如果您想要为用户提供最好、最快、最真实的原生体验,Xamarin 是明确的赢家。

3. 开发速度:Ionic++

如果您需要尽快交付一个应用程序,Ionic 是您的朋友。

两种框架的开发速度在两个主要方面存在差异。首先是从编写一行代码到看到结果所需的时间。对于 Xamarin,将代码推送到 iOS 设备需要几秒钟的编译加上 10 到 15 秒的部署时间。哎哟。

相比之下,Ionic 使用 Ripple 模拟器 提供了零编译、亚秒级的反馈时间。这个功能本身就显著提高了开发速度。也许更重要的是,快速的反馈周期实际上让编码变得更有趣

第二个开发速度差异在于 UI 调试。Ripple 加上Chrome 工具使得在 Ionic 中调试 UI 变得异常简单。而使用 Xamarin,您只能非常有限地弄清楚运行时某个元素为何会出现在那个位置,更不用说调整它的属性了。简而言之,Ripple + Chrome 工具使得 Ionic 中的 UI 工作显著更容易。

总的来说,Ionic 提供了更出色的开发体验。如果您需要尽快交付一个应用程序,Ionic 是您的朋友。

4. 可维护性:Xamarin++

这是我要批评 JavaScript 的地方,对吗?好吧,在开始之前,我必须承认我一开始就做出了三个架构决策,这些决策使得处理 JavaScript 应用程序对我这样背景的人来说更容易接受,并且,嗯,坦率地说,有偏见。

TypeScript

尽管我欣赏 JavaScript,但我更看重重构、出色的 IDE 体验以及编译器提供的免费单元测试。TypeScript 重新带来了所有这些优点,并因此有可能处理大型代码库和/或更大、更多样化的团队。没有 TypeScript,我个人无法推荐 Ionic 用于任何超出相当简单或单人移动应用范围的项目。

Visual Studio + ReSharper

您以为 Visual Studio 和 ReSharper 只用于 .NET 应用?错了,它们在 Bower 和 NPM 包管理、代码导航、重构以及出色的静态分析方面给予了我们巨大的帮助,再加上您期望从 .NET 应用获得的完整的、出色的调试体验。微软以提供一个出色的 IDE 来支持一个历史上非微软的技术栈,彻底地让我们感到惊喜(敢说惊喜吗?)。

Wallaby.js

我们的应用程序有一个相当复杂的核心引擎,以及大量的单元测试。 Wallaby 允许我们在输入时、甚至在保存之前持续运行我们的单元测试。团队中的每个人都能立即知道他们是否破坏了某个测试,并将代码覆盖率放在每个人的首位。Karma 也可以,但我认为 Wallaby 使完全使用 JavaScript/TypeScript 变得愉快。

总体可维护性

虽然这三个决策使我们的 JavaScript 应用程序更具可维护性、可重构性,并且不易产生技术债务;但 Xamarin 仍然感觉更易于维护。Angular 在魔法字符串方面非常依赖,这是无法避免的。我和我的同事们在修改彼此的代码或重构现有代码时,当我们有一个真正的编译器检查我们 95% 的工作时,我们感到产生晦涩错误的恐惧感要小得多。

5. 单元测试体验:矛盾

一个好的框架需要出色的单元测试体验,如果您想将质量融入您的应用程序。不幸的是,尽管 Wallaby 非常棒,即使使用了 Karma,我也无法弄清楚如何在单元测试中设置断点调试和检查变量。另一方面,在 Xamarin 中,单元测试是一等公民。它简单而强大,并且配合 nCrunch,反馈速度几乎和 Wallaby 一样快。

为什么矛盾?因为我喜欢这个

// describe + it blocks offers a hard to match level of expressiveness
describe('when you calculate dimension effects for a question', () => {
  // notice this generic helper function relevant to most/all of the tests
  var makeDimensionEffects = () => { ... };
 
  // nested describe -> I LOVE THIS
 describe('with a transformation', () => {
    // this 2nd helper is relevant to only nested tests
    var makeQuestionWithTransformation =  = () => { ... };
 
   it('should error gracefully if blah blah blah', () => {
     expect('actual').toBe('expected');
   });
 });
 
});

即使有了 SpecFlow,而我又是 SpecFlow 的忠实粉丝,.NET 在提供相同的强大功能、灵活性和表现力方面仍然有所欠缺。

6. 上手时间:Xamarin++

上手时间的长短显然取决于您的背景。然而,使用 Xamarin 更容易陷入“成功陷阱”。从架构上讲,我们在 Ionic 中犯了一系列错误,这些错误后来给我们带来了很多麻烦(注意到我什么时候开始用第三人称谈论发生的不好的事情,很狡猾,对吧?)。这些错误主要表现为糟糕的内存管理,尽管我们还搞砸了我们的 ngCache 数据结构,导致在负载下性能不佳。

现在有人可能会争辩说,使用任何新框架都容易搞砸内存管理。然而,在 Ionic 所基于的 Angular 中,似乎特别容易产生内存泄漏。当我们完成了最小可行产品 (MVP) 并意识到我们实现了所有反模式时,我们遇到了一个真正的混乱需要从中恢复。

相反,我们的 Xamarin MVP 只有一个主要的内存问题,并且我们毫无问题地解决了它。显然,如果您团队中有任何具有 Angular 经验的人,这可以减轻这种担忧,但如果没有,并且您正在选择 Ionic,请做好心理准备。

摘要

那么,如果我今天必须推荐一个框架呢?显然,安全(也是正确的)答案是:取决于。它取决于团队、现有架构、谁来维护应用程序、预算和时间表,以及一系列其他问题。

然而,为了挑衅一下,我将避免给出安全答案。

对我而言:我重视质量高于速度。仅仅因为您可以使用免费工具(#1)构建东西,并且做得更快、更快乐(#3);这都不能替代构建一个真实、顶级、响应迅速的移动 UI(#2),在一个干净、可重构的代码库(#4)上,它将在发布时准备好进入市场(#6)。

但也许上市时间对您来说更重要。每个情况都不同。希望这有助于阐明哪种决定对您来说是正确的。

© . All rights reserved.