現在各大平台群雄逐鹿,推出各種讓人炫目的feature,基於HTML5開發最大的弊病就是無法享受最新最炫的native feature和效能問題,而Phonegap的價值就在於此,它就是為了讓你既能基於HTML5享受跨平台的便利,又能享受native的feature。因此,這裡就通過對phonegap的分析,來看看如何能更好地讓HTML5長在native上。
分析完phonegap在三大平台上的源碼(phonegap源碼分析(一)------ android,phonegap源碼分析(二)------
Windows Phone和phonegap源碼分析(三)------ IOS),會發現phonegap就是基於各大平台上的webview,把它作為跨平台的虛擬機器,把HTML5作為位元組碼,以此打造Mobile上的Java。它那些所謂整合native的plugin實際上是苦力活,把各大平台共有的特性都封裝了一遍,所以,它的未來寄希望於兩點,一是各mobile平台能大力發展HTML5,提升其效能和功能。二是,能緊跟各平台的最新發行,儘快地把最新特性以plugin的方式include進來。因此phonegap不是一個什麼很絕妙的架構,它是基於一個很簡單的構想,但要做得儘可能的完善和細節,並且更新速度要快。
我前面也提到過,不是所有的應用都適合用phonegap來做,如何評估,關鍵要看這個webview是否能很好承載你的應用。這塊我研究不多,但從網上的一些文章來看,webview的效能是存在問題的,很多人做過測試,拿同樣的頁面在webview和browser上跑,webview的效能是低於browser的,並且就算是不亞於browser,browser和原生應用也是沒法比的,撇開JS的最佳化(這是一個很大的主題)不談,phonegap相關的效能損耗主要是以下幾點:
- JS與Native的互調
- HTML UI與native UI的差距
- 效能與跨平台間的平衡
對於第一點,其實這是最可以忽視的點,通過對phonegap源碼的分析,損耗在JS與Native的互調上的代價其實並不大,除了Android取調用結果之外,其他都是直接的本地方法調用,並且JS與Native的互調並不是發生在每時每刻。
而對於HTML UI與native UI的差距,這個是效能問題體現得最為明顯的地方。在案頭平台上尚且如此,更別提在mobile上,因此對UI互動要求很高的應用,得重點考察一下是否能容忍這塊的差距。對於如何提升UI效能和流暢性,我還沒來得及做很深入的研究,就目前的學習情況來看,可以朝以下幾個方面來做:
- 通過template技術,把HTML打散,避免一個html太大,http://floatlearning.com/2011/05/how-well-does-phonegap-scale/,這篇文章介紹一些template solution
- 選擇最合適的UI架構,就目前來看Jquery mobile在效能上我是不滿意的,以後我會重點考察一下JQTouch
- 最佳化dom render,比如減少reflow的cost,http://floatlearning.com/2011/06/the-cost-of-reflows-on-a-web-app/
- 效能提升小tips,http://floatlearning.com/2011/03/developing-better-phonegap-apps/,這篇文章介紹了幾個很關鍵的tips
對於效能與跨平台間的平衡,就是要考慮哪些點是需要通過plugin放在native端來做的,JS的執行效能雖然近年來有了明顯的提升,但還是沒法和native比的,所以如果存在cpu密集型的運算時,得考慮是否有必要犧牲跨平台性在native端來做塊,不過,phonegap就是好在給了我們這個平衡的選擇性,起碼我們還是有路可走。
效能最佳化的工作對於跨平台mobile開發來說是非常關鍵的,絕不能以犧牲使用者體驗的代價來方便自己,雖然,不太可能做到與native app不相上下,但不斷提升效能是我們不能忽視的工作。