为什么应该开始使用 React Native 了

在讨论技术方案之前,我们先达成一个共识,如果你的 App 是开发给用户使用的,那么用户并不关心你用的是什么技术方案。因此技术选型,应当是平衡用户体验和开发效率,在这两者之间,应当是满足了用户体验后,再去谈开发效率。

不幸的是,在移动端用户对体验的要求是很高的,而且越来越高。之前我也说,每个 Android 开发者都应该有一个 iPhone,这样才能知道 App 的体验做到什么地步才算及格。这或许会让一些玻璃心的人感到很难受,但我认识的高水平的 Android 开发者,无一例外日常都是在使用 iPhone 或至少有 iPhone 手机。

在过去的半年里,我尝试了三个跨平台的开发工具,FuseQt,以及 React Native. 每个工具都有着巨大的潜力和进步,最终的结论是,Qt 适合开发桌面跨平台程序,React Native 适合用来做 App 开发的补充方案,我们先来谈一谈这三个工具。

Fuse 的尴尬

Fuse 希望既可以是原型工具,又可以由开发者进行生产使用,但这个定位是比较尴尬的,就好像瑞士军刀不能用来剁排骨,大砍刀不能用来做手术一样。

作为原型工具,他需要编译,不能像 Framer.js 那样直接通过网页传递,也不像他那样只用 CoffeeScript 就可以完成整个原型的设计,它太重。

作为开发工具,他的稳定性和性能会出现一些很难解决和控制的边缘 case,使得你不得不自己去封装原生组件,而封装原生组件同样会面对某些 API 不能调用,性能出现问题的边缘 case. 最终殚精竭虑,发现自己浪费了时间。

Qt 在移动端水土不服

Qt 几乎是最优秀的跨平台开发方案,有着数不清的成功案例,我能马上想到的是 Adobe,WPS 和 KDE。Qt 有非常优秀的 GUI 开发方案 QML,也可以用 JavaScript 来写逻辑层,但在移动端,有个问题是他很难解决的。

PC 上的交互是相对单一的,鼠标单击,键盘输入,Qt 提供一套通用型组件就可以够用,但在移动端上,这个问题变得复杂了,手机越来越依赖硬件的创新来实现多样性,很多你日常使用的交互 Feature 都深度结合到了原生控件上,长按复制,放大镜,词典,3D Touch 这些交互,使用原生控件都开箱既得,但 QML 就不行啦,因此 QML 和原生控件的差异会越来越大,都需要 Qt 团队或者开发者 Case by case 的去做适配,体验上和原生有一点不一样,就会被用户察觉,这使得 Qt 在 PC 时代的哲学面临了挑战,而 Qt 团队如果没有足够的精力跟进,也会让你备受摧残。

React Native 到来

严格来讲,React Native 不应该被当作一种跨平台解决方案来对待,React Native 给了你一种新的方式去开发 App,React Native 是一种生活方式。

React Native 想对了一件事,就是 UI 开发不应该跨平台,但逻辑层是可以跨平台的。而实际上,React Native 提供给你的,就是一套先进的逻辑层开发框架 + 一套灵活的 UI 开发框架。

React Native 如何处理 UI?

用 React Native 来写 UI 是一件快乐的事情,React Native 没有任何所谓的自己的控件,在 iOS 上,React Native 的每个控件都是调用的原生 API 来做的。

例如

<View>
  <Text> Hello World </Text>
</View>

那么就等于 iOS 上的 UIView 添加了一个 UILabel。你不会损失任何 API,但 React Native 却给你提供了更多的糖果使得你可以像 CSS 一样灵活的布局,渲染样式。

除此之外,当你修改 UI 的时候,React Native 支持 Live Reload,你不需要重新编译你的代码,你只需要 Save 一下 JavaScript 文件,界面就会实时更新,这简直节省了无数时间可以用来刷微博。

React Native 的逻辑层?

React 的逻辑层,是一个纯粹的 JavaScript ES6,JavaScript 虽然被骂了很久,但是他也在进化,相信假以时日,ES7 ES8 到来,这也会是一个非常优秀的语言。

其实在学习 React Native 之前,强烈建议先去学习 React,写写网页,先了解 React 是怎么运作的,以及 Redux 这个东西。相较于传统的 MVC 框架来说,React 这套理念会让你的效率倍增。

更何况,你还有 lodash 这种神器。

那么 React Native 到底怎么开始用?

我并不建议你直接用 React Native 重写你的 App,像 Swift 一样,你可以先用 React Native 来实现一部分页面

或许你用 React Native 写完 App 的登陆页面之后,你就会发现 React Native 的真正益处就在于,让那些体力活的 UI 构建变的越快而充满乐趣。