首先要说明的一点:目前大多数移动应用都是杂交种。好了,我们继续。
Mozilla 开发者 James Long 坚持认为,无论现在还是将来,Web App 永远,无法,与 Native App 相匹敌。虽然 Long 先生的预言散发着一股浓厚的挑衅意味,不过也有可能是对的。
但与此同时,我们也渐渐发现,围绕 Web 与 Native App 孰优孰劣的争论其实毫无必要。
市场调研公司 Forrester 的研究称,看待这一问题应当以史为鉴。「PC 客户端曾在很长一段时间内起着主导作用,但最终被 Web 版所取代。历史也将在移动端上重演。」或许吧。
不过,如果 Facebook 刚发布的前端界面开发工具 ReactJS 透露出什么风声的话,那就是——网页也好,本地也罢,未来应用开发的趋势是两者的结合,即 Hybrid App(混合模式移动应用)。并且,所谓的「未来」,其实早已到来了。
正如 Long 所说,Web App 的问题在于其 DOM(文档对象模型)「太慢了」,并且绝无改观的可能。对那些认为 DOM 将变快的人,Long 是这么说的:
(根本)无需证明。没有任何迹象表明 DOM 会变快,就算真实现了,可能要过好几光年才能应用在移动端。要让它在速度上产生质的飞跃,单从技术层面上是无法实现的。就好比你要渲染一个包含一百万个多边形的模型,那么你真正要做的是减少多边形数量,而非优化算法。
这也正是 React Native 所做的:干脆把 DOM 扔到一边。
阅读应用 Flipboard 最近就这么干了一回。公司在解释这么做的目的时表示,「你根本无法用 DOM 来构建一个每秒 60 帧的滚动列表视图。」简单直接。
又或如独立博主 John Gruber 所说,「Flipboard 利用 HTML5 的 <canvas> 元素打造了自家 Web App 框架,由此也绕过了 DOM 与传统 CSS 的限制。
我们并不想讨论 Flipboard 和其他一些公司「政治正确」的观点,我们只考虑「工作效率」这回事。事实证明,开发混合模式应用是最有效的方法,一直以来都是如此。
而事实是,当我们谈论 Native App 时,其实我们说的已经是 Hybrid App 了,因为大多数应用中都有着 HTML 的影子。这倒不是我们认为应该支持哪一方,而是牛逼的开发者都这么干。
拿 Instagram 举个例子吧。
虽然看上去是 Native App,但 Instagram 时间线其实只做了一个 WebView。这并没有引起大家争论,而且确实也没必要争论。Instagram 的开发者并不想卷入撕逼大战,他们只是想努力做个好应用。混合开发模式帮了他们的大忙。
Facebook CEO 马克·扎克伯格曾经声称 HTML5 是 Facebook「犯过的最大错误」(这话本身的准确性还有待商榷),但很明显,旗下的 Instagram 并没听他的话。
所以问题的关键是,我们不应该把视线聚焦在应用开发模式,而是要关注如何打造好的应用。
当开发者 Nic Raboy 将关注的重点由如何(how)开发,转为开发何种(what)应用时,他便领悟到了这点:
我写的应用大多都能获得好评。只要上 Google Play 看看,你就会发现没人关注应用是 Native 还是 Hybrid。所以重点在这:很多喷子会黑开发者,说 Hybrid App 无论在界面还是表现上都不如 Native App,但这黑点完全不对。如果开发者或设计师本身不给力,那应用就活该被嫌弃,跟它用哪种开发模式完全没关系。
所以,如果说 Web 开发技术容易学习,这没错;Hybrid App 省钱省时间,这也没错(如果你了解 Native App 的开发成本,就会更同意这点);Hybrid App 也能体验超凡,这也没错。以上这些都没错。
而且也真的不重要。
因为开发者们只想在最短时间里开发出最好的应用。绝大多数时候,这意味着选择混合模式。
如今的普遍方法是在所谓 Native App 中封装一个 WebView,实际访问的仍旧是 Web App。而在 React JS 面世后,情况可能会有所不同。
VisionMobile 最近这样写道:
Facebook 最近发布的 React Natives 让我们得以一窥移动应用的未来:它具有 Native App 的表现,类似 Web App 的界面;而且基本由 JavaScript 写成。
在 React Native 的世界里,我们没准可以把宝全押在 Web 上。
无论应用在技术层面上如何实现,真理只有一个:混合。这也是如今移动应用的主流开发方式,虽然我们表面上仍称之为本地(Native)。或许 React Native 将部分改变我们开发的过程,但并不会改变使用混合模式的本质。
所以 Web 党和本地党的争论,本质上只是开发市场的问题。随它去吧。
原文地址: readwrite