弃用 React Native ?
最近的技术圈尤为热闹,Google 发布了首个 Flutter 预览版、Vue.js 在 GitHub 上的 star 数量超过了 React.js,而如今全球著名的民宿预订平台 Airbnb 突然宣布要弃 React Native 坑而逃,回归原生技术开发,不得不说,这一举措着实让 React Native 备受打击,也让很多趟过坑的开发者感同身受。
20 日晚,Airbnb 在 Medium 上发博文宣布,“由于许多技术上和组织上的问题,我们决定放弃 React Native,将所有精力投入到原生应用上。”
Airbnb 的心路历程
Airbnb 团队以 5 篇博文表达了对 React Native 从入门到放弃的心路历程:
经过不断地评估新技术,最终于 2016 年初遇了 React Native 的美好,更多的工程师可以利用其跨平台的特性进行快速地开发、还能保持原生的质量、以及只需为 App 进行一次编码、同时提高了开发者的体验,基于以上的种种优点,促使 Airbnb 团队开始基于 React Native 大刀阔斧地布局。
详解了 React Native 作为一项技术的工作原理和优缺点。其在跨平台、统一设计语言系统(DLS)、React、迭代速度、基础架构、性能、Redux 等方面都有良好的优势,但 React Native 彼时仍不成熟、JavaScript 工具缺少安全性类型难以扩展、重构易出错。
React Native 如今已经难以满足 Airbnb 的快速开发、产品质量,以及虽说 React Native 功能代码几乎均可跨平台共享,但 Airbnb 的 App 中只有一小部分是基于 React Native,所以需要大量桥接基础架构,因此 Airbnb 宣布即将放弃 React Native 的使用。
这条消息来得很突然,因为 Airbnb 一直在为 React Native 贡献开源项目和工作流工具,就在上个月还在 React Europe 大会上发布了 Lona 工具,但没过多久就有了上文所述的话题……
React Native 从入门到放弃
Airbnb 是硅谷创业公司中最早使用 React Native 的公司之一,他们从 2016 年就开始使用,而彼时距离 2015 年 React Native 发布才仅仅过去了一年。那时,Airbnb 有原生的 iOS 和 Android 应用,在 Web 上则使用 React。由于有着丰富的 React 经验,他们决定采用 React Native 来加速原生应用的开发。这次移植造成的影响就是带来了大量的额外工作,而这个影响刚开始时并不明显。他们花费了大量时间去研究如何编写辅助功能(如原生桥梁、封装代码等)以便让 JavaScript 支持已有的原生功能。同时,每当 iOS、Android 或 React Native 升级时,这些库都要进行维护。这不仅是技术上的难题,也造成了毫无必要的组织问题。
由于最初的意图是“作为公司整体快速前进”,因此出于诸多原因(上文 Part 2 中所述),使用 React Native 已不再是个可行的策略。
但这是否意味着其他人也要拒绝 React Native?我看未必。Airbnb 的博文中提到的许多问题我们都遇到过。但对于 Airbnb 的规模(作为比较,笔者公司 In The Pocket 的移动应用一共有 100 名开发者,一个产品团队通常包含 4~10 名开发者)以及他们在产品和用户体验需求方面的投入的力量来说,他们的确有理由放弃 React Native。
“混合应用很难。”
尽管 React Native 是个 JavaScript 框架,但绝大多数 React Native 至少会两种平台(Android、iOS、React Native)。笔者使用 React Native 大约有一年半的经验。我们认识到,理解常见的原生开发模式(如导航等)非常有必要,而且某些时候不得不在代码中加入一些原生的东西。没错,这会带来不必要的复杂性,但最终,我们仍然希望尽量使用 JavaScript,尽管其实底层是原生的。
“我们不得不支持三个平台(以前是两个),这让我们感到很疲惫……”
Airbnb 有 220 个 React Native 的界面,但每个平台上还有 880 个原生界面面,这就是说只有 20% 的功能是 React Native 的。“我们遇到的大多数问题都是由混合模式造成的“。我们在将 React 与原生代码结合的过程中也认识到了这一点。但是,这些困难不应该成为选择 React Native 平台的阻力。
“许多功能都要求把各种技术结合到一起,此时迭代速度、代码质量和开发者经验都符合甚至超过了我们的目标值和期望。许多时候我们感觉我们站在了移动开发变革的最前沿。”
即使 Airbnb 已经决定要在移动产品中放弃 React Native,这也不应该对 React Native 的未来造成负面影响。Airbnb 的主要开源项目(Lottie、react-native-maps)已成为开发者日常生活的一部分,现在它们都被转交给了 React Native 社区。读完所有五篇博文之后我们可以认为,考虑到可维护性和可持续性,React Native 并不适合像 Airbnb 这种规模的应用。最终,他们证明了 React Native 是个极其强大的框架,能处理超大型应用。但任何工具都会有局限性。
但目前 React Native 社区仍然很活跃,Facebook 也刚刚宣布了他们在进行大规模的架构改动,让框架更灵活,并且与原生架构结合得更好,而 Expo 等公司也做出了许多突破性的库,如 react-native-gesture-handler 等。
所以说,虽然 Airbnb 弃用了 React Native,但整体而言,React Native 还活着。