混合与原生:这场争论已经持续了很长时间,并且还会继续下去。每种应用开发形式都有其优缺点,对这两种方法之间主要差异的分析表明,直接对比就像是比较苹果和橘子。许多混合应用开发者都明白,他们与原生开发者并不处在同一水平线上,但他们必须了解为什么这两种平台之间存在差异。我们应该在应用开发框架级别分析这些差异,而不是简单地将混合应用与原生应用进行比较。
原生应用开发
原生软件开发工具包(SDK)预先打包了编译和签名应用程序所需的工具 - 所有这些乏味的东西都“正常工作”。它们的预制模板和它们提供的通用代码决定了应用程序“如何”工作,这些都是隐藏在明处的非常有用的功能。
例如,苹果自己的开发环境 Xcode 是一套工具,可以更轻松地为苹果平台开发软件。当你启动 Xcode 时,它会提供一个用于创建新项目的模板列表。让我们创建一个 iOS 选项卡应用程序,看看原生应用开发者从一开始就拥有多少工具。
输入一些设置后,我很快就获得了一个可以运行的选项卡应用程序,并且在 Xcode 启动后不到一分钟就完成了。太棒了!简单部分已经完成了,现在是时候穿上连帽衫和耳机,专注于我创建畅销 iOS 应用的目标了。
让我们进一步深入研究,看看 Xcode 为我构建了什么,而我甚至不需要多想。应用程序填充了设备显示屏的 100%;选项卡与灰色背景对齐到底部;一个选项卡突出显示为蓝色,另一个为灰色,顶部有图标。事件监听器添加到选项卡按钮中,当我单击第二个选项卡时,它会变为蓝色,而另一个则变为灰色,同时切换第二个视图的内容。
经过进一步开发后,我的应用程序将为每个选项卡创建一个单独的导航堆栈;在需要时,后退按钮会显示出来;每个视图的标题将在标题中切换;并且当我浏览不同的视图时,会发生平滑的过渡。字体、颜色、渐变和样式将全部遵循该平台上应用程序的外观。通过扩展 Xcode 项目导航器中的文件夹,我注意到为我放置了大量文件。我不知道它们的作用,老实说,我并不在乎,但它们实际上非常重要:这些文件使我的应用程序开发如此无缝。
混合应用开发
但是,说实话,我是一名 Web 开发人员。我的组织里没有 Objective-C 和 Java 开发人员,他们已经准备好构建多个应用程序,其最终目标只是尝试构建相同的应用程序(但从头开始构建,并且完全不同)。我拥有现有的 HTML/CSS/JS 技能,我希望我的应用程序不仅能进入苹果 App Store,还能进入谷歌 Play 商店和其他所有商店。与将自己锁定在每个平台中,并必须学习和维护多种专有语言相比,混合应用开发更适合我的技能和时间限制。
不要让混合应用开发吓到你。简单来说,混合应用程序仍然只是 Web 浏览器,但没有 URL 栏和后退按钮。这意味着你可以使用 HTML/CSS/JS 构建一个完整的应用程序,但它仍然像原生应用程序一样工作,拥有所有相同的功能,例如访问蓝牙、GPS、相机、文件、设备运动等。混合应用程序提供了两全其美的优势。
让我们构建一个混合应用程序
对于我的用例,我决定混合应用程序非常完美,所以让我们启动...等等,没有针对混合应用程序的 Xcode!我在哪里可以获取所有让我的应用程序执行应用程序操作的文件?内置的 UI、酷炫的动画和流畅的过渡在哪里?混合应用开发的缺点是,从 Web 平台开始的人必须从头开始。这是狂野的西部,每个开发者都孤军奋战。
我非常喜欢 Web 平台。它提供了一组核心工具,不仅可以共享信息,还可以使用信息。但是,Web 平台仅提供了用于构建内容、设置内容样式、与内容交互以及在文档之间导航的基本构建块。Web 平台的核心没有提供像 iOS 和 Android 中那样的预打包库。在最低级别,Web 浏览器表示一个“视图”和一个导航/历史堆栈。这是原生应用程序拥有优势的另一个领域,而混合开发者会花费大量时间生成代码,让浏览器能够处理多个视图和多个堆栈。
混合应用程序开发者很快就会发现自己必须处理无数问题,才能让自己浮出水面:找出填充视窗 100% 的 CSS,将选项卡粘贴到底部并悬停内容,添加事件监听器,切换图标和视图的活动状态,跟踪每个选项卡的导航堆栈,实现触摸手势,生成一种通用的导航方式,在视图之间过渡,使用硬件加速动画进行过渡,删除 300 毫秒延迟,知道何时显示或隐藏后退按钮,更新和动画标题,与 Android 的后退按钮交互,平滑滚动数千个项目等。所有这些都包含在原生 SDK 中。随着应用程序的增长,看起来似乎重建自然的原生交互是一个持续的艰难挑战 - 所有这些都是原生开发者很少考虑的问题,因为对于他们来说,这些问题从一开始就被内置进去了。
我相信解决方案是使用一个框架/库来平衡竞争环境,为混合开发者提供类似于原生开发者的工具包。大多数开发者对自行编写所有内容感到自豪,当然,在某些用例中不需要框架或库。但是,当涉及到混合应用开发时,每个开发者都会为每个应用程序重新创建大量通用代码,而这对于原生开发者来说,已经是一种无需额外花费精力和时间的优势。
Cordova(Phonegap 的核心)是将 Web 平台转变为原生应用程序的主要开源软件。但就像 Web 平台一样,它只提供了基本构建块,而不是内置的框架来开始使用。
框架和库可以放大应用程序开发,让开发者能够专注于应用程序的工作方式,而不是应用程序工作原理的逻辑。
混合开发框架:混合应用开发的缺失 SDK
我将框架和库定义为任何能够提高生产力的软件包。根据我的经验,混合开发者主要的挫败感不在于创建应用程序,而在于让应用程序像应用程序一样工作,这是一个细微但又重要的区别。
随着专注于混合应用开发的开发框架的出现,开发者终于获得了那个缺失的 SDK,它平衡了与原生的竞争环境。拥抱 HTML/CSS/JS 的跨平台框架可以让 Web 开发人员将他们的技能应用于应用程序开发。为了提高生产力,混合应用开发框架不仅应该坚持标准,并提供漂亮的 CSS 和标记,而且还应该提供一个 MVC,以便团队能够进行严肃的大规模应用程序开发。

Sworkit 是一款使用 Ionic 框架构建的混合应用程序,它在 iOS App Store 中有特色。
像 Ionic 框架 这样的框架提供了一组用于创建应用程序的通用逻辑,而这组逻辑不是 Web 平台本身已经内置的(完全披露:我是 Ionic 的联合创始人,也是 AngularJS Material Design 的核心贡献者)。Ionic 没有发明另一个 MVC,而是选择构建在 AngularJS 之上,而 AngularJS 在过去几年中已成为热门前端框架中的领导者。Ionic 背靠着一个 庞大而活跃的社区、可靠的文档,以及自己的 命令行工具 来提高生产力(CLI 不是必需的,但强烈建议使用)。
Ionic 使用 AngularJS 指令创建用户界面,可以快速开发,但最重要的是,它高度可定制,因为它使用了 Sass 和简单的标记。如果你不熟悉 AngularJS,Ionic 提供了一种通过大量 示例 和 模板 快速学习它的方法。
谷歌的 Polymer 项目 和 Mozilla Brick 建立在尖端的 Web Components 规范之上。与 AngularJS 指令一样,Web Components 提供了一种通过简单的 HTML 标签抽象掉复杂代码的好方法。
其他久负盛名的混合开发框架还包括 Sencha Touch 和 Kendo UI,它们已经存在了更长时间,并提供了它们自己的强大的 MVC/MVVM。这两个框架都附带了大量内置组件和小部件,使开发者能够构建功能强大的应用程序,这些应用程序可以在 iOS、Android、BlackBerry、Windows Phone 等平台上运行。
我不认为 AngularJS、Ember 和 Backbone 这样的前端框架是混合应用开发框架。虽然我强烈推荐前端框架用于大规模应用程序开发,但它们专注于逻辑,而不是用户界面。
像 Twitter Bootstrap 和 Foundation 这样的框架提供了很棒的用户界面和响应式设计功能。但是,CSS 框架专注于 UI 和响应式设计模式;然而,仅仅 UI 仍然要求每个开发者重新创建原生应用程序的“工作方式”。
应用程序框架抽象了构建应用程序的复杂性,并为开发者提供了核心逻辑和 UI,类似于 iOS 和 Android 提供的。我认为拥抱网络标准和网络平台的核心很重要,这样它就可以轻松地从 Cordova 运行,并为多个平台(包括标准的网络浏览器)构建。
软件工程:仍然需要
混合应用程序开发框架在过去几年中取得了长足的进步,并且在未来拥有光明的前景。然而,开发混合应用程序仍然需要真正的软件工程,就像开发原生应用程序一样。与任何形式的网络开发一样,如果只投入几个小时到项目中,结果很少是高度抛光和生产就绪的作品。
混合应用程序的爱好者有时会给人的印象是,框架在开发过程中创造了一个充满独角兽和彩虹的梦幻乐园,这可能会误导新开发者。仅仅因为你可以在任何地方编写一次并部署,并不意味着你就可以免除软件开发规则。混合应用程序提供了许多好处,但就像生活中的很多事情一样,走捷径不会产生高质量的结果,所以请不要声称在付出最小的努力之后一切都结束了。
进行准确的比较
将没有框架的混合应用程序与原生应用程序进行比较是不公平的。为了准确地检查混合开发与原生开发,我们需要在框架级别分析每种方法(混合与框架与原生,例如 Ionic 框架与 iOS 或 Polymer 与 Android)。关于混合与原生:首先是研究你的用例,而不是在所有其他事物之上选择一个明确的抽象级别。最终都会变成 1 和 0,所以跳到另一个抽象级别(HTML/CSS/JS)可能是适合你的用例和组织的。
我经常觉得,关于混合应用程序开发的观点是在混合应用程序准备好大展身手之前就形成了。世界正在迅速转向更快的设备和浏览器,以及改进的网络标准,而且没有任何迹象表明其中任何一个会放缓。现在是利用你现有的网络开发技能,通过依靠混合 SDK 的肩膀来构建高质量应用程序的最佳时机。
关于 Adam Bradley
Ionic 框架的共同创建者,以及 AngularJS Material Design 团队成员。定期撰写和发表关于混合开发的文章。一位自豪的父亲、丈夫、退伍军人,也是狗的最佳朋友。常住美丽的爱荷华州麦迪逊。
关于 Robert Nyman [荣誉编辑]
Mozilla Hacks 的技术布道者和编辑。发表关于 HTML5、JavaScript 和开放网络的演讲和博客。Robert 是 HTML5 和开放网络的坚定支持者,从 1999 年开始就从事网络前端开发工作 - 在瑞典和纽约市。他还定期在 http://robertnyman.com 上写博客,并喜欢旅行和结识新朋友。
7 条评论