一直以來都想寫點關(guān)于 React Native 的文章,奈何自己實在太懶,一直拖到現(xiàn)在铅乡,我從去年三月份開始用 React Native,到現(xiàn)在剛好一年烈菌,在這一年里,借助于 React Native 高效的開發(fā)效率花履,大大小小也開發(fā)了近十款 App芽世,是時候做個小結(jié)了。
在使用 React Native 之前诡壁,我用 Ionic 開發(fā)過幾款 App济瓢,那個時候 React Native 還沒有開源,市面上可選的方案并不多妹卿,要么原生要么是基于 Cordova 的 Hybrid App 方案旺矾。原生開發(fā)對于我們來說并不可行,對于 iOS 和 Android 平臺需要兩組不同的開發(fā)人員維護兩套完全不一樣的代碼夺克,然而實現(xiàn)的功能卻是一樣的箕宙。而 Hybrid App 自然成為了最合理的方案,那個時候最火的 Hybrid App 框架就是基于 Angular 的 Ionic铺纽,借助于 Ionic 完善的解決方案柬帕,再加上基本的 Web 開發(fā)技術(shù),幾乎不需要任何原生開發(fā)技術(shù)就可以開發(fā)出非常美觀而實用的 App。
眾所周知陷寝,Hybrid App 是跑在 WebView 上的锅很,這一點跟 Web App 是一樣的,但是 Hybrid App 通過暴露原生方法給 JS凤跑,提供了普通 Web App 所不具備的原生訪問能力爆安。然成也 WebView 敗也 WebView,Hybrid App 本身就是一個 WebView仔引,這也決定了它的性能是受 WebView 限制的扔仓,而且還會因為不同的平臺和系統(tǒng)版本而出現(xiàn)不兼容的情況,尤其是 Android 上不同版本的 WebView 對 CSS 的支持程度不一樣肤寝,導致相同的 CSS 樣式在不同的系統(tǒng)版本的表現(xiàn)不一致当辐。雖然不兼容的問題可以通過 Crosswalk 的方案解決,也就是用 Crosswalk 來替代系統(tǒng)自帶的 WebView鲤看,這樣就不存在兼容性問題了缘揪,在低版本的 Android 上性能也有一定提升。然而代價也是巨大的义桂,打包 Crosswalk 意味著你的 App 體積要硬生生增加 20 多兆找筝,就算是 Crosswalk Lite,也還是要增加 10 多兆慷吊,然而就算你對 App 體積不介意袖裕,可 Crosswalk 說到底也還是個瀏覽器內(nèi)核而已,意味著性能依然是瓶頸溉瓶。
我用 Ionic 開發(fā)過幾個 App急鳄,在 iOS 上體驗確實還說的過去,然而到了 Android堰酿,完全是另一個世界疾宏,在非高端機型上體驗極差,打開速度慢触创,運行速度更是不能忍坎藐,更不用說對于不同的機型的兼容性問題。除開性能不說哼绑,Ionic 的開發(fā)體驗也是不那么愉快岩馍。
因為是基于 Angular 開發(fā),利用 Angular 封裝常用控件抖韩,隱藏控件的實現(xiàn)細節(jié)蛀恩,使用者只需編寫控制器邏輯就可以寫出一個看起來還不錯的界面,可以省很多事茂浮,然而 Angular 存在的問題也一并帶過來赦肋。Angular 的學習曲線之陡峭簡直嘆為觀止块攒,各種復雜的概念更是讓人望而卻步。我不知道多少次去查官方文檔 以及 Stackoverflow 過 Service
佃乘、Provider
以及 Factory
的區(qū)別囱井,到底什么情況該用 Factory
什么情況用 Service
,我依然不知道趣避。然后是 directive
庞呕,別問我 link
compile
是干嘛的,我就想問 @attr
和 =attr
的區(qū)別是什么程帕?以至于我雖然做過好幾個大型的 Angular 項目住练,我卻幾乎沒有自己寫過 directive
。更不用說 Angular 槽點滿滿的模塊系統(tǒng)愁拭,模塊與模塊間的 Service 盡然還不能重名讲逛,簡直醉。使用 Angular 最大的一個坑就是一旦你用上了 Angular岭埠,你所有的東西都要 Angular 化盏混,比如我用個 moment
,要先寫一個服務(wù)包一層惜论,很多人好像用了 Ionic 之后就忘了正常的 JS 是怎么寫的许赃,經(jīng)常問一些 JS 常識問題,思維被 Angular 限制了馆类。
而且 Angular 本身并不是為了移動開發(fā)而設(shè)計的混聊,并沒有為移動平臺而優(yōu)化,所以 Angular 在手機上的性能并不好(這里我不去說他的打包體積乾巧,因為本來腳本本來就在本地句喜,所以沒什么影響)。所以當我知道 Ionic2 會基于 Angular2 開發(fā)的時候沟于,我還是很期待的藤滥,一直都在關(guān)注 Ioinc2 以及 Angular2 的開發(fā)進度。然而當我見證了 Angular2 的 40 多個 alpha 版本 以及 幾個 beta 版本社裆,每次都以為這就是最后一個測試版,正式版就要出來的時候向图,它就給你的小數(shù)點后的數(shù)字漲一下泳秀,pia pia pia 打臉,我就果斷取關(guān)了榄攀。順便吐槽一下 Angular2嗜傅,這種在 RC 階段都可以隨便修改 API 重寫 Router 的行為,很 Google檩赢。再測試了下還處于 alpha 版本 Ionic2吕嘀,那性能連一代都不如,于是我徹底放棄了 Ionic。貌似 Ionic2 在前一段時間終于出了正式版偶房,but who cares趁曼。
雖然 Ionic 本身確實是一個很不錯的框架,讓無數(shù)以前只會寫網(wǎng)頁的前端進入到了移動開發(fā)領(lǐng)域棕洋,用現(xiàn)有的 Web 開發(fā)技術(shù)就可以開發(fā)出看起來還不錯的 App挡闰,然而它錯就錯在它抱錯了大腿,選擇了 Angular掰盘,選擇了 WebView摄悯,性能和體驗是繞不過去的坎,不過現(xiàn)在大熱的 PWA愧捕,可能是它不錯的歸宿吧奢驯。
然后我開始嘗試 React Native,從此完全進入了一個全新的世界次绘。
未完待續(xù)╮(╯▽╰)╭