2019-03-20
在本文中我们将介绍 React Native 核心团队成员,以及团队超高质量的在线 Q&A,收录了 51 个高质量问题,包括:是否迁移 TypeScript、React → RN 学习成本、推特网站是用 RN 写的、RN vs Flutter、重构计划、Fabric、啥时候发布1.0、学习方法、心路历程、Fabric/TurboModule/Codegen。
本文的源地址为 React Native core team,我将其翻译成中文。
React Native 核心团队的成员聚集在一起,解答大家的问题。
大家好,我们是 Facebook 的 React Native 团队,跟高兴能在这里解答大家的问题。
我们正在努力地重构 React Native 的底层,同时我们也在学习并改进由社区提出的最大的痛点。
我还想附加一个 discussions-and-proposals 源的链接。我建议看一下它,我们用它来讨论 React Native 大的变化,也用它接收来自社区的反馈。
让我们开始吧!很高兴能回答你的问题。
—— EliWhite
A:
我们现在还没有迁移到 TypeScript 的计划,但是我们知道 TypeScript 在社区中非常受欢迎。
现在,我们正在改进核心组件的类型化。我想这也会帮助社区改进 TypeScript 的绑定。
—— EliWhite
对 @EliWhite 补充一下,Flow 对 FB 很重要,它对我们也很有用,因此只要 React Native 绑定在 FB 内部项目,它的路线图就不会改变。
—— Rick
A:
React 非常棒,因为它可以在很多平台上使用。
看到 React Native 的社区壮大赶上非常赞。像 VR、Widnows、TV。看到人们从 React Native 支持的平台上,使用 React 的组件化构建思想发现了如此多的价值,这真是太棒了。
我想我们开始看到人们发现 RN 的模式也是构建 Web 应用的一种很好的方式。
Twitter 的网站(桌面和站移动站)都是使用 React Native Web 构建,在移动端完全没有 React Native。
这种多平台开发方法是 React 最初被发明的原因,所以我们当然对进一步探索这个领域感到非常兴奋。
—— EliWhite
A:
RN vs Flutter,我猜这取决于你的使用场景。
显然我们是开发 React Native 的,我们会推荐 RN,并我们现在正在活跃地进行架构重构,来解决 RN 天生的异步问题。
但是你的公司、APP 可能会有不同的使用场景 :smiley:
—— fkgozali
我认为 React Native 和 Flutter 目标略有不同,使用哪一个取决于你想要实现什么。
React Native 倾向于利用每个平台的原生能力。
—— yungsters
A:
React Native 最新版为 0.58,目前正在推广中!
你可以加入 releases 源来跟踪未来版本的发布状态。
在这个版本之后,我们计划回归到更加频繁的发版周期,因此 0.59 不会等太久。
—— hector
A:
如果你遇到了不好懂的错误信息,请提交 issues 让我们知道。
如果能提交 Pull Request 来改进错误消息那就更好了。
—— yungsters
今天发布的 0.58 中,有一个于此相关的,包含了一个重新设计的 RedBox 界面,它完全是由社区驱动的。
—— hector
A:
一定量的开着的 issue 数量是在预料之中的,但是我们当然希望这个数字远低于 600 个。
我正在草拟一份建议书,来更加及时地处理 issues 和 PRs,他将会被提交到 discussions-and-proposals —— 希望我们能从中得到好的反馈,并吸引更多的社区的人加入到处理 issue 和 PRs 中来。
首先,我们可能会专注于降低开放 PRs 的数量。
—— hector
A:
是的,我们听说社区支持是今年上半年的工作重点。@hector 和@ cpojer 都在关注这个问题。
—— Rick
A;
Facebook 并没有弃用 React Native —— 我们每半个月就会加大对它的投资,并对未来有宏伟的计划,比如 Fabric!
Sophie 关于 RN 未来的文章在这里:https://facebook.github.io/react-native/blog/2018/06/14/state-of-react-native-2018
从我们上次发布 React Native 的状态更新至今,已经有一段时间了。
—— sahrens
Facebook 并没有弃用 React Native。我们已经埋头苦干……好几年了。
参见 Sophie 的博客文章。
—— mehdi
A:
已经进行有一段时间了,但是我们在等完成 Fabric 重构之后再完成动画。
我们总体计划是,Fabric 的 API 将实现更好的手势操作和更好的动画效果。
—— mehdi
re: 动画—— @kmagiera 有几个很棒的项目,我们很高兴,可能会将它合入核心(react-native-gesture-handler, react-native-reanimated)。
我们还需要让动画跟 Fabric 一起工作,因此还需要一些额外改动。
除此之外,我不知道有任何重大的动画重构计划。
—— sahrens
有了 Fabric 之后,我们会考虑全新的动画 API,但这项工作不太可能很快完成。
目前 Fabric 将支持现有的动画 API。
—— Valentin Shergin
A:
我们会开发我们现在为 Fabric 开发的东西。
—— fkgozali
A:
Fabric 最赞的特性是使你的应用能够多线程运行,但应用开发者不需要关心互斥等等。
同时,Fabric 使 React Native 在操作 DOM 时与 React 在互操作性方面更相似。
—— yungsters
A:
是的,大部分同步方法都会有异步化的变体。
但是我认为,从长远来看,默认情况下使用同步最有意义,特别是当人们使用 Suspense 提供即时反馈。
需要澄清的是,我指的是首次挂载的时候。
我想我们很可能推荐应用使用大多事件数异步化版本(比如滚动、触摸等)。
—— yungsters
A:
Facebook APP 继承了原生导航系统,这是为整个 FB APP 构建的。
我们的确有 RN 的原生导航抽象,不够它是 FB 专有的。
—— fkgozali
A:
对于小型项目,你可以跑一个 node API,将它连到 Firebase(可以用 REST 或者 GraphQL),几个小时就能完成,包括带有登录功能和基本的功能集合,这是一个很好的原型项目。
在 React 会议上有一个演讲,讲得非常好。
—— Rick
A:
有了 Fabric 之后,与原生 API 进行深度集成会变得更容易,并且也会有更多的机会在内核中构建构建深度回收、hittesting 和裁剪优化。
一旦 Fabric 完成,我们很有可能重新光顾长列表。
—— sahrens
A:
我认为最好的学习方法就是动手去构建!
—— Rick
有很多关于 React 生态的优秀内容,但是我发现最好的方式是尝试构建一些东西,然后当你遇到困难时,找一个教程或者例子来解决。
我猜不仅 React 是这样,这是一个普遍的好方法。
对于 React 来说,我发现在我感到困惑时,文档非常有帮助,也很清晰。
—— luna
在大家的回答上补充一下,不要想着一次性把整个技术栈全学会。
选择一个小的出发点,逐步建立起上下文。
—— PeteTheHeat
A:
实际上是 ReactVR——它基本上是将 React Native 渲染到 OpenGL。
我们也想过像 Flutter 这样关于 2D APP 相关。
但是由于许多原因,这看起来不是正确的方法。
其中最主要的原因是我们想构建与原生平台体验一致的应用,对于平台已经提供的东西,我们不想把他们重新再实现一遍。
因为这会花费很大的精力,同时当平台升级设计体验的时候,很难及时更新,这包括同时支持多个系统的样式,以便能够部署到新老设备上。
Flutter 在这个问题上投入了大量资源,相较于 RN 所采用的方法,两者投入的回报现在还不得而知。
—— sahrens
A:
哇……两倍或者三倍的团队规模,啊?
我们每一个主要的架构项目可能都有稍微激进一些的时间表,承担多处一两个人的工作(神秘的人月等等)。
向我前面提到的,Flutter 的工具链和文档非常赞。
我非常想投入精力提升 React Native 的开发体验和工具链。
最后但是同样重要的是,我在 Facebook 内部正在进行更积极的团队扩充。
—— yungsters
A:
RFC 流程非常棒。
这真的感觉我们正在以新的方式增强社区的能力,而且我们有了一个空间,可以就项目的技术和社会方面进行更长时间的讨论。
我很高兴听到你关于我们如何改进这一过程的意见。
—— cpojer
A:
Fabric 主要的不同在于,将会有大量的到 Native 侧的同步调用,现有的 Chrome 调试器集成方式需要调整。
背景参见:https://github.com/react-native-community/discussions-and-proposals/issues/7
—— fkgozali
A:
JSI 已经在项目中了。Fabric 和 TurboModules 会单独帆布,因为他们的 surface area 有很大区别。
并发 React 需要等 Fabric 实现完成之后。
—— fkgozali
A:
Metro 正在被 React Native 优化,不论是构建时间还是重新加载的速度。
有了 DeltaBundler 之后,它快了很多,这很让人兴奋。
也有一个 Facebook 的相对较大的 Web APP 刚刚迁移到了 Metro 上,你会想点击"查看代码"去找出是哪个 APP。
—— cpojer
A:
关于 Metro 最合适的人应该 @rafeca
—— cpojer
A:
RN 1.0.0,现在我们正在致力于完成项目的大的架构(Fabric/TurboModule/Codegen),一旦它们完成,并且稳定,我们就会评估 1.0 的发布。
—— fkgozali
A:
欢迎来到 FB!Marketplace是 React Native 的一个巨大用户群,他们在我们西雅图的办公室有重要的业务。
—— yungsters
你已经可以用 Metro 这么做了,它是一个任何东西的 JavaScript 打包器。
你可以按照你想要的任何方式设置它。
我们可能短期内无法提供这方面的指南,但是如果你在 RN 中使用了 Metro,将它用于 web 和 node 应该也不是很大的跨越。
—— cpojer
A:
请看 @cpojer 关于 Metro for web 的评论……
看看你能不能找到它的用法!
—— sahrens
@ericvicenti 请看我上面的回答。它已经在一个相当大的 Facebook 网站上使用。找找看!
—— cpojer
A:
我们正在积极地开发这些项目。预计上半年晚些时候会进入稳定。
—— fkgozali
A:
64 位支持最近已进入 master 分支——但是它没有在 RN 的最新版本中,因为发行版减少了,但是我想他会在 0.59 中发布
—— hector
A:
我想这取决于你们的 APP 想干什么——如果你们的用例很简单,不需要大量的自定义原生模块的话,你就不需要太多的 Android、iOS 专业知识。
在加入 RN 团队之前,我曾经参与了合作 APP Oculus Go 开发,在那里我们会招聘一些 iOS、Android 开发者来开发我们想要的自定义内容。但在那之前我们做了6-8个月。
—— janzer
A:
react-native-web 非常赞,我们把它的作者 @necolas 招过来了,现在他在 Instagram Web 团队工作。
我们很高兴能更好地使用它并继续支持它。
—— sahrens
A:
每一个重构的大的部分都有一个 GitHub issue,在 discussions and proposals repo 中。
Fabric: https://github.com/react-native-community/discussions-and-proposals/issues/4
TurboModules: https://github.com/react-native-community/discussions-and-proposals/issues/40
Codegen: https://github.com/react-native-community/discussions-and-proposals/issues/92
JSI: https://github.com/react-native-community/discussions-and-proposals/issues/91
感谢 @kelset 为我们整理链接。
—— EliWhite
A:
在过去的几个月中,我么尝试了许多新方法来与社区进行互动。
从获得大量的对组件 Flow 类型的贡献(https://github.com/facebook/react-native/issues/22990)到 twitch 直播这样的深度探索。
我认为,我们从根本上低估了人们对学习 React Native 内部实现的贡献与学习兴趣。
这对我们来说是非常棒的,鼓励我们做更多的事情。
—— EliWhite
A:
我们有几种类型的测试在内部运行:
这半年我们计划解决的主要问题是提供这些测试的稳定性,并且让内部测试框架和外部测试框架的差异抹平。
这样,内部的提交不会默默打破 OSS 测试,反之亦然。
—— PeteTheHeat
A:
我们一直在招聘!
—— mehdi
加入团队没有 PR 数量要求,但是你想提交 PR 我们也很开心!
不论怎么说,FB 一直在招聘 :smile:
—— hector
在我加入 Facebook 之前,我从来没用过 React Native :smiley:
—— EliWhite
A:
我们最近向社区询问 React Native 的最大问题是什么,参见:What do you dislike about React Native,https://github.com/react-native-community/discussions-and-proposals/issues/64
—— cpojer
关于我们如何对 Issue 优先级排序……它是一个微妙的权衡,考虑到:
—— yungsters
A:
Fabric 本身很可能对 APP 启动时间提高不大,除非你有大量的自定义 native view managers,但是我们规划中还有很多其他东西,可以帮助改善启动时间。
请持续关注!
—— sahrens
A:
是的,我们是这么认为的。
我们将 WebView 从 repo 中移出,现在它立刻就得到了大量的改进。
—— mehdi
A:
我之前的团队遇到一个类似的问题,试图构建一个 RN APP。
我们最终使用了 react-native-web,并且很缓慢地替换成使用 View, Text 的新基础组件。
由于工具链和部署的原因,它仍然感觉非常脱节,单这对于 web 和移动端共享组件来说,是迈出了伟大的第一步。
—— luna
A:
是的,新架构将提升在 Android 老设备上的性能。
—— David Vacca
在 Facebook,有大量的用户使用 Android,我们在最近的半年多里,把大量时间投入到这上面。
对于 Android,有一件事比 iOS 更加重要,那就是磁盘访问。
在 Android 上,磁盘读取要慢得多,而且每加载一个 Java 类都要付出代价。
我们花了大量时间来研究和优化 React Native 的启动路径,特别是在 2014 年的 Android 设备上,为了能让 Marketplace 对那些用户快速运行。
这些研究最终促使我们设计 TurboModules 项目,以及 Fabric 的一些特性。
这些特性在设计时就考虑了 Android,他们将被实现为 c++ 共享库,iOS 也会有同样的行为和性能提升。(注意:这是问答结束后的后续回答)
—— Eli White
A:
总是有有趣的问题。
坦白说,做一个一成不变的项目很快就会厌烦,当有真正的问题需要解决时,你会更容易获得动力,而不只是对问题进行重构。
—— mehdi
我喜欢社区。事实上,有那么多人有乐意花费个人时间与我们讨论问题,这正是我喜欢从事这样一个受欢迎的项目的原因。
—— EliWhite
A:
re: JSI/nativemodule,你指的是新的 TurboModule 系统吗?如果是的话,信息在这里:https://github.com/react-native-community/discussions-and-proposals/issues/40
如果你想直接使用 JSI,资料少一些,从这里能找到一些启发:https://github.com/react-native-community/discussions-and-proposals/issues/40#issuecomment-454138232
turbomodules 的代码在 master 里面已经有了,请查阅!不过,并不是所有的都在里面。
—— fkgozali
A:
生产环境性能分析是很重要的,我们在 FB 也会做。
没有办法去模拟不同的设备和网络连接在现实中的情况。
一些关键:要注意发送的数据量,以及对特定用户的分析频率。
—— PeteTheHeat
A:
我试用 Expo + Atom,但是我近期想试试 VS Code。
我知道这是一个很无聊的答案。您还考虑了哪些其他工具?
哦,我还用 mitmproxy。在分析服务器问题时很有用。
我还经常使用 React Dev tools,来理解界面的层级结构,以及理解为什么元素没有被重新渲染等等
—— mehdi
A:
关于测试有很多工作要做。
我一直专注于支持我们的内部快照测试。
在 OSS 中有 Detox,它是一个 e2e 框架。
—— PeteTheHeat
A:
这条推特涵盖了我们在 Facebook 上使用 React Native 最全面的公开列表:https://twitter.com/sophiebits/status/1003101478427357184
—— yungsters
A:
我不知道有人在他们的项目里这么干。
如果这是人们得出的解决方案,我不会觉得很好,我宁愿确保工具得到改进,使升级更加顺畅。
CLI 最近有了它自己的仓库:https://github.com/react-native-community/react-native-cli,因此现在是时候提交你的贡献来提升升级体验!
—— hector
A:
F8 APP 算吗?
—— hector
我开发了一个 crossfit wod 应用,同时还有一个用 RN 编写的 side project :thumbsup:
—— Rick
是的,我在加入 Facebook 之前,我已经开发了几年 RN 应用
—— David Vacca
我开发了一个帮助人们学日语的应用。真的只是为了自己用,所以从来没有发布它。
给 react-native-navigation 魔改了一下,能让我做一些很疯狂但是很酷的导航(坦白说它看起来更像是科幻电影而不是真正的 APP)
—— mehdi
我从来没有在 Facebook 工作之外写过 APP。
但是我给 Delta 应用提过几个 bug(非常高质量的加密 APP,顺便说一下),并带有一些普通用户无法提供的额外的调试信息 :stuck_out_tongue:
—— yungsters
我给自己写了一个跟踪电视节目的应用,提供什么时候更新。
他让我能够用 deep link 直接在手机上进入正确的那一集。
他还包括一个 roku 遥控器来控制电视。非常简洁,对我很有用。
—— EliWhite
A:
肯定不是一个全面的答案,但是我们在一些视频中讨论了架构:https://www.youtube.com/watch?v=83ffAY-CmL4
Chain React 2018: The State of React Native by Ram N
—— luna
A:
我们仍然在解决如何才能最好地合作的问题,但是我们彼此之间有着非常牢固的关系。
Facebook 和开源社区的每个人都真诚地希望共同努力,尽我们所能构建出 React Native 的最佳版本。
我认为我们需要在沟通和协作的结构和指导方针上做一些工作。
理想情况下,我们将以一个简单的讨论过程结束,鼓励人们对 React Native 或生态系统做出反应,并最终变得更具包容性,这样就会有更多的人加入我们。:smiley:
—— cpojer
我们计划让社区更多地参与关于 React Native 未来方向的讨论。
例如,discussions-and-proposals 源是我们去年首次发起的一项联合工作,它产出了一些非常有趣的讨论。
到目前为止,它帮助我们关注影响我们最活跃的贡献者的首要问题。
我想听听你们对此事的意见,以及我们能做得更好的地方
—— hector
A:
在这里回答问题的每个人都是全职在 React Native 团队中工作的。
—— yungsters
A:
Lucas —— EliWhite
Bowser —— Rick
Fox —— fkgozali
真正的问题。皮卡丘。但 Wii 健身教练正开始成为我的主力。—— yungsters
Wii 健身教练 —— mehdi
对此我又一个专门的 Twitter 帖子 https://twitter.com/cpojer/status/1077896781034409984 —— cpojer