一直以来都想写点关于 React Native 的文章,奈何自己实在太懒,一直拖到现在,我从去年三月份开始用 React Native,到现在刚好一年,在这一年里,借助于 React Native 高效的开发效率,大大小小也开发了近十款 App,是时候做个小结了。
在使用 React Native 之前,我用 Ionic 开发过几款 App,那个时候 React Native 还没有开源,市面上可选的方案并不多,要么原生要么是基于 Cordova 的 Hybrid App 方案。原生开发对于我们来说并不可行,对于 iOS 和 Android 平台需要两组不同的开发人员维护两套完全不一样的代码,然而实现的功能却是一样的。而 Hybrid App 自然成为了最合理的方案,那个时候最火的 Hybrid App 框架就是基于 Angular 的 Ionic,借助于 Ionic 完善的解决方案,再加上基本的 Web 开发技术,几乎不需要任何原生开发技术就可以开发出非常美观而实用的 App。
众所周知,Hybrid App 是跑在 WebView 上的,这一点跟 Web App 是一样的,但是 Hybrid App 通过暴露原生方法给 JS,提供了普通 Web App 所不具备的原生访问能力。然成也 WebView 败也 WebView,Hybrid App 本身就是一个 WebView,这也决定了它的性能是受 WebView 限制的,而且还会因为不同的平台和系统版本而出现不兼容的情况,尤其是 Android 上不同版本的 WebView 对 CSS 的支持程度不一样,导致相同的 CSS 样式在不同的系统版本的表现不一致。虽然不兼容的问题可以通过 Crosswalk 的方案解决,也就是用 Crosswalk 来替代系统自带的 WebView,这样就不存在兼容性问题了,在低版本的 Android 上性能也有一定提升。然而代价也是巨大的,打包 Crosswalk 意味着你的 App 体积要硬生生增加 20 多兆,就算是 Crosswalk Lite,也还是要增加 10 多兆,然而就算你对 App 体积不介意,可 Crosswalk 说到底也还是个浏览器内核而已,意味着性能依然是瓶颈。
我用 Ionic 开发过几个 App,在 iOS 上体验确实还说的过去,然而到了 Android,完全是另一个世界,在非高端机型上体验极差,打开速度慢,运行速度更是不能忍,更不用说对于不同的机型的兼容性问题。除开性能不说,Ionic 的开发体验也是不那么愉快。
因为是基于 Angular 开发,利用 Angular 封装常用控件,隐藏控件的实现细节,使用者只需编写控制器逻辑就可以写出一个看起来还不错的界面,可以省很多事,然而 Angular 存在的问题也一并带过来。Angular 的学习曲线之陡峭简直叹为观止,各种复杂的概念更是让人望而却步。我不知道多少次去查官方文档 以及 Stackoverflow 过 Service
、Provider
以及 Factory
的区别,到底什么情况该用 Factory
什么情况用 Service
,我依然不知道。然后是 directive
,别问我 link
compile
是干嘛的,我就想问 @attr
和 =attr
的区别是什么?以至于我虽然做过好几个大型的 Angular 项目,我却几乎没有自己写过 directive
。更不用说 Angular 槽点满满的模块系统,模块与模块间的 Service 尽然还不能重名,简直醉。使用 Angular 最大的一个坑就是一旦你用上了 Angular,你所有的东西都要 Angular 化,比如我用个 moment
,要先写一个服务包一层,很多人好像用了 Ionic 之后就忘了正常的 JS 是怎么写的,经常问一些 JS 常识问题,思维被 Angular 限制了。
而且 Angular 本身并不是为了移动开发而设计的,并没有为移动平台而优化,所以 Angular 在手机上的性能并不好(这里我不去说他的打包体积,因为本来脚本本来就在本地,所以没什么影响)。所以当我知道 Ionic2 会基于 Angular2 开发的时候,我还是很期待的,一直都在关注 Ioinc2 以及 Angular2 的开发进度。然而当我见证了 Angular2 的 40 多个 alpha 版本 以及 几个 beta 版本,每次都以为这就是最后一个测试版,正式版就要出来的时候,它就给你的小数点后的数字涨一下,pia pia pia 打脸,我就果断取关了。顺便吐槽一下 Angular2,这种在 RC 阶段都可以随便修改 API 重写 Router 的行为,很 Google。再测试了下还处于 alpha 版本 Ionic2,那性能连一代都不如,于是我彻底放弃了 Ionic。貌似 Ionic2 在前一段时间终于出了正式版,but who cares。
虽然 Ionic 本身确实是一个很不错的框架,让无数以前只会写网页的前端进入到了移动开发领域,用现有的 Web 开发技术就可以开发出看起来还不错的 App,然而它错就错在它抱错了大腿,选择了 Angular,选择了 WebView,性能和体验是绕不过去的坎,不过现在大热的 PWA,可能是它不错的归宿吧。
然后我开始尝试 React Native,从此完全进入了一个全新的世界。
未完待续╮(╯▽╰)╭