使用 React Native 构建 - Build.com 应用
Build.com 总部位于加利福尼亚州奇科,是最大的家居装修用品在线零售商之一。该团队拥有长达 18 年以网络为中心的强大业务,并于 2015 年开始考虑开发移动应用程序。由于我们团队规模小且缺乏原生开发经验,因此开发独特的 Android 和 iOS 应用程序并不现实。相反,我们决定冒险尝试当时非常新的 React Native 框架。我们最初的提交是在 2015 年 8 月 12 日,使用的是 React Native v0.8.0!我们于 2016 年 10 月 15 日在两个应用商店同时上线。在过去的两年中,我们不断升级和扩展该应用程序。我们目前使用的是 React Native 0.53.0 版本。
您可以在 https://www.build.com/app 上查看该应用。
功能
我们的应用程序功能齐全,包含您对电子商务应用程序的所有期望:产品列表、搜索和排序、配置复杂产品、收藏夹等。我们接受标准信用卡支付方式,以及 PayPal 和 Apple Pay(适用于我们的 iOS 用户)。
一些您可能没有想到的突出功能包括:
- 大约 40 种产品提供 3D 模型,有 90 种饰面可供选择
- 增强现实 (AR) 功能,让用户能够以 98% 的尺寸精度在家中看到灯具和水龙头的外观。Build.com React Native 应用在 Apple App Store 中被推荐用于 AR 购物!AR 现在可在 Android 和 iOS 上使用!
- 协作项目管理功能,允许人们为项目不同阶段整理购物清单并协作选择
我们正在开发许多新的和令人兴奋的功能,这些功能将继续改善我们的应用体验,包括 AR 沉浸式购物的下一阶段。
我们的开发工作流程
Build.com 允许每位开发人员选择最适合他们的工具。
- IDE 包括 Atom、IntelliJ、VS Code、Sublime、Eclipse 等。
- 对于单元测试,开发人员负责为任何新组件创建 Jest 单元测试,我们正在使用
jest-coverage-ratchet
增加应用程序旧部分的覆盖率。 - 我们使用 Jenkins 来构建我们的测试版和发布候选版本。这个过程对我们来说很有效,但仍然需要大量工作来创建发布说明和其他工件。
- 集成测试包括一个共享的测试人员池,他们在桌面、移动和网络上工作。我们的自动化工程师正在使用 Java 和 Appium 构建我们的自动化集成测试套件。
- 工作流程的其他部分包括详细的 eslint 配置、强制执行测试所需属性的自定义规则以及阻止违规更改的预提交钩子。
应用程序中使用的库
Build.com 应用程序依赖于许多常见的开源库,包括:Redux、Moment、Numeral、Enzyme 和一系列 React Native 桥接模块。我们还使用了一些分叉的开源库;分叉它们要么是因为它们被废弃了,要么是因为我们需要自定义功能。粗略统计显示大约有 115 个 JavaScript 和原生依赖项。我们希望探索能够移除未使用库的工具。
我们正在通过 TypeScript 添加静态类型,并研究可选链。这些功能可以帮助我们解决我们仍然看到的一些错误类别
- 数据类型错误
- 由于对象不包含我们期望的内容,数据未定义
开源贡献
由于我们高度依赖开源,我们的团队致力于回馈社区。Build.com 允许团队开源我们构建的库,并鼓励我们回馈我们使用的库。
我们发布并维护了许多 React Native 库
react-native-polyfill
react-native-simple-store
react-native-contact-picker
我们还为许多库做出了贡献,包括:React 和 React Native、react-native-schemes-manager
、react-native-swipeable
、react-native-gallery
、react-native-view-transformer
、react-native-navigation
。
我们的旅程
在过去几年中,我们看到了 React Native 及其生态系统的大幅增长。早期,React Native 的每个版本似乎都会修复一些错误,但会引入更多错误。例如,远程 JS 调试在 Android 上中断了几个月。值得庆幸的是,2017 年情况变得稳定得多。
导航库
我们面临的一个主要反复出现的挑战是导航库。很长一段时间以来,我们一直在使用 Expo 的 ex-nav 库。它对我们来说效果很好,但最终被弃用了。然而,当时我们正处于大量功能开发阶段,所以花时间更换导航库是不可行的。这意味着我们必须分叉该库并对其进行修补以支持 React 16 和 iPhone X。最终,我们成功迁移到 react-native-navigation
,希望它能得到持续的支持。
桥接模块
另一个巨大的挑战是桥接模块。当我们刚开始时,许多关键的桥接模块缺失。我的一位队友编写了 react-native-contact-picker
,因为我们需要在应用程序中访问 Android 联系人选择器。我们还看到许多桥接模块因 React Native 内部的变化而损坏。例如,React Native v40 中有一个破坏性更改,当我们升级应用程序时,我不得不提交 PR 来修复 3 或 4 个尚未更新的库。
展望未来
随着 React Native 的持续发展,我们对社区的愿望清单包括
- 稳定并改进导航库
- 维护对 React Native 生态系统中库的支持
- 改善向项目添加原生库和桥接模块的体验
React Native 社区的公司和个人在贡献时间和精力来改进我们都使用的工具方面表现出色。如果你还没有参与开源,我希望你能考虑改进你使用的一些库的代码或文档。有很多文章可以帮助你入门,而且它可能比你想象的要容易得多!