React Native并非原生
英文原文:React.native isn't
当我们就 Apple 的“MVC 非 MVC”讨论术语泛滥问题时,非死book 于上个月正式开源的 React Native 似乎亦是如此。主张“Learn once, write everywhere”,让开发者用 JavaScript 开发移动原生应用,此景虽好,但事实并非如此。React Native 其中很大一部分利用了原生架构,却也包含了一些非原生架构:
- 用视图作为 drawing result,而不是 drawing source;
- 平行的组件层级结构(component hierarchy);
- 使用 ListView,而不是 UITableView;
- 不使用 UIButton 创建按钮;
- 不使用响应链,但是找到了相似的替代品;
- 最后,使用 JavaScript 语言来编写。
以上列出的种种多多少少体现了 React Native 的一些优势,但 React Native 本质上并非原生。另外,React 与不久前刚发布的 Components 框架的基本原理跟苹果关于 MVC 模式的误解实在是不谋而合:
图中所示:控制器(Controller)持续通过视图(View)显示数据并不能体现 MVC 的具体含义,除非将其理解为“Massive View Controller”。
在 Components 和 React Native 中,用 View(UIView/NSView)将“实现 UI 的可变状态”替换为“模型(单一)功能”,发挥 drawRect::的作用。以后面临的问题不再是创建新的完整框架,而是通过视图显示数据。解决方法是,将画板上的 Custom View 拖到 UI 上,执行 drawRect::。绘制视图(以及/或者将组件设置为视图状态突变)比 drawRect::更凸显状态性,而非削弱。
再强调一下,这个解决方案还不错,只是没有循规蹈矩罢了。据我所知,目前热捧 React Native 的主要是一些 Web 开发者,他们如今无需学习 Objective-C/Swift 或 Java,就能开发“原生”应用了。不过,React Native 究竟是否体验与宣传如一还尚未定论。
最后,“react”貌似是指“单向响应数据流”——更让人摸不着头脑的行内话,我想以后会常常遇到。