Why I Am Not at React Native Developer(节译)

翻译自这里 Why I'm not a React Native Developer

Introduction

很多人把 RN 作为下一个移动 app 的开发平台。切换开发平台有可能会有巨大的消耗也可能会改变你日常的工作流程。同时平台也可能会改变你开发使用的软件,需要你掌握一些特殊的工具和工作流,把你绑定到一个新的开发生态里面。

Facebook 自己想要完全切换到 RN 来代替原来的 Native 开发。RN 开发团队也在努力做这个事情,他们搞了一个软件开发平台来代替传统的 Xcode/Swift/ObjC 开发模式。RN 团队到底对这个是一个怎么的态度,貌似还不太明确。

我自己搞了几个月开发之后,我感觉这个平台不是我想要的一个,也不推荐其他人往里跳。

Declarative style

在 RN 里面,UI 是一堆包含状态(state)的函数(function)和属性(props)。

下面是个例子,假设我们需要在左上角有一个小正方形,如果用户连接了就显示红色,没连接显示绿色。

在这种编程类型下,你指定所有更新 UI 需要的步骤。我们需要监听 isConnectd 来更新 view。我们告诉 iOS 如何计算状态。

比较一下 RN 的模式。

RN 让你在 render() 方法里面描述你的 UI。React 框架来保证 state 的变化会触发 re-rendering。对于数据的修改,会自动触发 UI 的改变。

我想这是一种思考 UI 的很好的方式。这也是 MVC 模式的一种进化,View 只需要负责展示,不需要负责管理数据。

Faster iterations

RN 里面开发的时候,框架会在本地启动一个 server。你只需要编译一次,然后在 iOS 模拟器或者真机上面运行,RN 会保证你在 js 里面做的任何修改都会反馈到 app 里面。

你有两个选择:

  • Live Reloading。使用 CMD + R 快捷键。
  • Hot Reload。只更新你编辑的部分。比如你在编辑一个 table view 的一个 cell,你的修改会立刻可以看到,不用每次都从开始界面一步一步找过去。当前页面的状态也会一直保留,这就是所见即所得的编程体验。Xcode 没有这个。

这个比之前在 native 里面快太多了,在 native 里面有时候还需要在 ViewController 里面加一些 debug 方法,以便快速的找到需要的界面。

Cross-platform

跨平台。

Uncertain roadmap

担心 RN 团队没有对这个项目的长期的保证。

不像我们使用一些第三方库,如果那个库出点问题我们的项目也不至于出啥大问题。而 RN 是一整个软件开发平台,如果 facebook 停止维护 RN,我们的软件可能就停滞了,目前也没有一个 RN 替代。如果要自己搞,那还需要区了解 RN 的代码,React.js 的代码,RN CLI 工具,和 JavaScriptCore。社区会继续搞么?也许吧,可能不是我们熟悉的速度。

Github 上面 RN 大概 2 周就会发布一个新版本。

Patently daunting

Patently silent

October 2017 update: Facebook Relicensing

Javascript

我们应该从 RN 切换到 Swifh 一个比较重要的原因是「技术倒退」,你应该抛弃 JavsScript,这是一门

  • 有缺陷的
  • 不安全的
  • 进化缓慢的语言

下面的例子都是基于 ES2016。

Javascript’s inadequacy

司机都喜欢开集成了很多安全措施的车。不是因为它们能让你开起来更简单,而是因为它们会降低你遇到事故的几率。

类似的,一门编程语言也应该提供一些能避免编程错误的安全措施。

ARC 刚加入 Object-C 的时候,我们可以选择关闭他,但是为啥不推荐呢,因为编译器可以比你更加准确的知道一个对象的生命周期。「编译器比你聪明」。

Type errors

JavaScript 里面一个变量可以在任何时间编程任意类型。

Lack of optionals

Objective-C 里面(以及其他语言里面)大量的错误是调用一个 nil 的对象上面的方法。

Swift 里面,会强制你做 nil 检查,如果你知道一个对象可能会是 nil。

Lack of function signature

JavaScript 里面函数没有返回类型。

Immutability

JavaScript 里面对不可变数据的支持很弱。

You can’t trust arrays

Poor error handling

No support for decimals

Dodgy maths

Unsafe initialisation

Optional curly braces after an if

Ambiguous curly braces

Switch fallthrough

What’s nothing?

Poor expressivity

Exceedingly slow evolution

ES2016 提供了一些新的功能

  • The includes method for arrays.
  • The ** operator

Flow to the rescue!

Flow 是 Facebook 提出来解决上面那些问题的。这是一个 JavaScript 的静态类型检查工具。

回忆一下那些例子。

Flow’s like flossing

Flow 修复了 JavaScript 那些问题了么?没有。

Flow 开发工程师虽然做了很多努力,但是他依然只是 JavaScript 的一个超集,基于一个很弱的根基。

github 上面大量的项目都没有使用 Flow。也没有一个 RN 的例子讲到了 flow。

The Javascript Ecosystem: balls and chains

JavaScript 的缺点让所有人都印象深刻,除了 JavaScript 开发。对于他们来说,上面提到的问题并没有那么糟糕。这是因为 JavaScript 开发并不觉得 js 语言有什么欠缺。

你说没有 immutability,那我们写一个库支持他,你说没有类型检查,那我们写一个库。

"自由挖掘"是指选择一门健全的语言。这么挖并没有很好的利用好精力。JS 总是让你开发一些其他语言默认就支持的东西。

Chains

有条大鱼需要 JavaScript 来处理。这门语言考虑 billions 选择升级或者不升级他们流量起和网站的网络用户。这使得这门语言的开发不健全。

还记得 typeof(null) == 'object' 么,已经有提案把 null 对象改成 null 了,但是「考虑到这会导致现有的大量网站出问题。」这个提案被否决了。ES6 里面 null 依然是个 object。

JavaScript 的进化,需要考虑:

  • 大量的旧版本流量起用户
  • 一群不同的浏览器厂商
  • 大量的网站和它们的开发

Wider angles

Dependencies

RN 项目有 648 项依赖(我刚看了一下是 603)。你的项目基于其他 600 多人的努力。这也就是说,你的项目也依赖于这 600 多自愿者能持续维护他们的项目。

Better alternatives

广告时间。