iOS HotPatch的选择(Weex, React Native, JSPatch)--2016.6.24GMTC后感

JerryXia 发表于 , 阅读 (0)
weex依赖一点点React Native不依赖JSPatch依赖

这个问题来自于JSPatch场的提问。作者本人表示,没有runtime是搞不定swift的。有一天Apple强推Swift不支持OC,JSPatch就用不了了。weex可以很容易移除OC runtime的依赖的,而JSPatch是不可能做到不依赖runtime的。

但是讲道理的话这个风险比较小。也有可能Swift之后的版本提供了强大的反射。

学习曲线

RN>weex>JSPatch

RN的react.js就比较难以理解,再加上flux,reflux,redux这些,可能就更难了。

weex很多核心代码就是直接借鉴的vue.js。vue相对于react来说还是比较容易的。

JSPatch直接就是用JS映射原生对象,除了语法不一样,其实就相当于写OC。稍微有一点JS基础的就能写。另外作者提供了强大的辅助工具JSPatchX(JS写oc代码自动补全),使得写JS变的更容易。

与Native交互

从方便性和灵活度的角度考虑,应该是:JSPatch>weex>RN

RN的方式是通过新建一个manager包装调用真正对象,通过宏把这个manager暴露给JS调用。只有实例,所以没有静态方法,没有单例的概念。如果要调用单例必须通过manager包装,使得实例最终做的还是单例的事。

const myRNUtilManager = React.NativeModules.MyRNUtilManager  myRNUtilManager.doSomething()  const myUserSingleManager = React.NativeModules.MyUserSingleManager  

weex的方式具体不清楚,据讲师说会使用weex up这个东西。想通过一种方式自动注册,不需要像RN那样使用manager+宏的方式。(好像目前还没有)

JSPatch的方式就不用多说了,直接调用。

语言

RN=weex>JSPatch

三者都可以使用ES6。

RN和weex都是HTML/CSS/JS,开发效率很高,对于前端来说写起来很爽很快。另外HTML可以用jade,CSS可以用Stylus, Less, Sass主流的库。但对于移动端的程序员来说就有点困难了。但是说实话学习成本很低。

JSPatch和写OC并没有很大的区别。该裸写autolayout的地方还是得裸写。

开发的效率

weex>RN>JSPatch

weex核是vue.js相对于react.js来说更简单些。HTML/CSS/JS开发效率肯定优于native开发的。

RN的jsx本质也是HTML/CSS/JS。开发效率肯定优于native开发的。

RN和weex都用了css3的flexbox来布局,相对比较简单。

JSPatch相当于还是写native。native开发相对比较慢。并且大量的代码写autolayout也是繁重的工作。虽然有JSPatchX帮忙,但是我依然觉得没有weex和RN高效。

以上也有一个前提就是团队中的人需要懂得前端开发的基础知识。不过我觉得HTML/CSS/JS还是很容学的。

开发时的调试

RN=weex=JSPatch

都是用Chrome进行调试。

开发时的Hot Reload

RN=weex=JSPatch

RN可以Hot Reload,而且除了模拟器之外,真机也可以Hot Reload。只需要改一下URL就行了。

weex未知,没用过。但是讲师说是可以的。

JSPatch通过PlayGround也可以做到Hot Reload,也可以做真机Hot Reload。也是只需要修改一些URL就可以了。

代码下发

RN=weex>JSPatch

除了自己实现服务外。

weex 据讲师说将来会用阿里百川的服务。我想该服务应该是定制的吧,而且会是增量推。但是说不定要收费噢。也应该可以用code push。只不过不是定制的可能会有些麻烦。

RN 已经有RN版Code Push了,还是比较成熟的。Code Push唯一缺点就是目前不支持增量。也可以使用AppHub。

JSPatch 已经有自己的成熟的相当于官方代码下发服务。缺点就是收费,但是不贵。它是按量收费,对于刚刚起步的创业团队来说根本就是免费的。因为收费所以我给了RN和weex大于JSPatch。

代码下发的安全性

RN=weex=JSPatch

JSPatch的服务是RSA签名验证。还能自定义RSA密钥。应该是非常安全的。

weex和RN都可以使用Code Push背后是微软,安全性应该很有保障。weex也可以用阿里百川的服务,背后是阿里,安全性肯定有保障。

线上异常的溯源

JSPatch>RN>weex

JSPatch其实就是映射了native,所以线上异常很容易被苹果自带功能或者第三方如umeng捕获并且上传服务器供开发者查看。因为是映射也很容找到具体错误是js哪个文件中的哪行代码。

RN需要打包bundle时导出source map。代码中需要捕获异常,利用第三方库打log,这个log会自动上传服务器。RN的异常会报出line和column通过这个再结合之前导出的source map就可以溯源。但是整个一个流程比较麻烦。

weex的线上异常的溯源据讲师讲目前是没有的。

性能

JSPatch>weex>RN

JSPatch通过作者的优化,性能已经达到很高的水准。

据阿里的人说weex的内测表现优于RN。这主要也是因为他们之间目标的不同。一个是想替换H5,一个则是想替代App。

JSPatch>weex=RN

JSPatch坑比较少,有坑也可能是一些c代码不能调,宏需要展开写。但是一般都不会涉及到这部分问题。

weex还没开正式开源不好说。

RN现在公认的坑比较多,iOS算比较少的。

维护

weex>RN>JSPatch

JSPatch基本就是作者一个人项目,而且是私人业余项目。

weex有一个庞大的team做维护再加上这么多活跃在社区的中国人。并且weex非常重视提交上来的issue。

RN团队精力不够,但是肯定优于JSPatch。

设计目标谁更适合Hot Patch

JSPatch>weex>RN

JSPatch这个名字就很明显了,就是要做patch的。而且作者已经在这上面花了很多精力开发。

RN设计目标是要替代native app的模式的。而且标榜着learn once, run everywhere.

weex的目标是替换H5,更灵活些。想要做到三端一体。

文档

JSPatch>RN>weex

JSPatch的文档很齐全。也受益它本身很简单。

RN的文档其实比较少的,很多人坑要踩。很多解决方案需要自己去搜索拼装解决。

weex之所以给了最后一名是因为目前还没有正式开源。差评。

平台

这个分不出高下,见仁见智,看需求

JSPatch只能在iOS平台上。android上有自己的热补丁技术,很自由,可以直接写native,不需要写JS。

RN是有明显的platform判断API的,所以它的肯定会有if iOS else这样的代码出现。有时候需求就是要不一样,有时候需求又希望一样。但是这种代码的出现,会使得App逻辑变得复杂,容易出错,更难懂。

weex的目标是三端一体。有参会者专门问了如何做platform判断和适配。讲师给出的答案是,weex的目标就是三端一体替换H5,所以我觉得应该是不会出现太多的if else。但是这很难说,比较android和iOS差太多,很难真正做到一体。拭目以待吧,我还是对weex在这方面挺有信心也相信阿里的技术能力。

以上是列举了部分点进行比较。我个人倾向Hot Patch的选型应该是这个顺序:weex>RN>JSPatch

目前我们Team用的方案是RN。

2016.7.13后记

weex终于真的正式开源。到这个时间节点为止,发现weex还不够成熟,不能够应用到实际开发。我觉得问题主要有这些:

  • 文档不齐
  • 没有Debug方面的文档
  • 没有代码下发方面的指导
  • iOS需要在didFinishLaunchingWithOptions时手动注册Module等
  • 没有看到Animation的文档
  • 组件不够多
  • 周边服务和工具也没有

所以把Hot Patch的顺序修改为:RN>JSPatch>weex