Hybrid開發的優化策略

問題:

1,內嵌hybrid模式的特點是什麼。

2,缺點是什麼。

3,如果bybrid模式卡頓,原因又是什麼,怎麼解決。

4,如果要做整齊佈局,一般用flex或display:table;如果涉及到非規整的佈局可能要配合js。


Hybrid越來越成爲開發的一種常見的開發方式,但說到Hybrid,除了開發上的高效和更新上的快捷之外,速度是被提到最多的,我們就從這裏開始着手。這裏跟大家分享一些這方面的經驗,希望能對大家有所幫助。


我們把一個Html頁面的加載過程分爲三段:加載、渲染、Ajax請求。然後從這三個階段分別談一下優化的策略。
1、加載。
首先,要充分利用瀏覽器的緩存策略來實現快速加載。這樣就能保證只要不升級版本,幾乎不需要聯網行爲,節省了流量,提高了加載速度。
再者,通過攔截WebResource請求的方式預置的一部分不需要更新的頁面或者資源(JS、CSS等)到客戶端中供WebView使用,提高這部分資源的加載速度。
另外,還有一個需要我們引起注意的地方就是JS腳本加載會影響DOM渲染速度。這個主要原因是瀏覽器在加載JS時,會考慮到JS修改DOM樹結構的可能性。關於具體的問題表現,產生原因,以及優化方案,可以參考這裏:
JS的阻塞特性
http://www.cnblogs.com/MeteorSeed/articles/2283629.html
頁面的加載與渲染順序
http://blog.csdn.net/chang_yuan_2011/article/details/7497458
我們可以從這點兒出發做一些優化,儘量對JS做動態加載,使WebView儘快完成加載,到達渲染階段。


2、渲染
先提兩個JS事件,DOMContentLoaded(只有IE不支持)和onload。一個是DOM渲染完成後發出,一個是所有資源加載並渲染完成後發出。所以說,DOMContentLoaded是不關心那些不影響DOM樹結構的資源(圖片、CSS、JS)的加載的。
這樣的話,我們可以給Html注入一個DOMContentLoaded Listener,在接收到DOMContentListener之前,向用戶展示一個Native的Loading。
但是要注入DOMContentLoaded就必須攔截WebView.loadUrl請求,自己去請求html,然後把獲取到的html以data的形式提供給WebView。這樣做的缺點是對於某些沒有在header中提供charset,而是在htt-eqv中提供charset的網頁來說,程序無法準確獲取到其charset,會出現亂碼。比如新浪的某些網頁:http://finance.sina.com.cn/roll/20130323/032214928432.shtml。
另外,DOM樹的渲染有一個過程,其速度過慢的話,會引起渲染時白屏,我們要儘量減少DOM初次渲染時的工作量來縮短白屏的時間。比如,可以減少初次加載的html的大小,延後CSS渲染。以求先讓用戶看到一個東西。


3、Ajax請求
Ajax請求的好處就是開發的耦合度更低,用戶看到初始頁面的速度更快。缺點是增加手機瀏覽器的壓力。比如,會增加網絡請求,增加用戶等待時間,增加流量等。
我們可以進行一些優化,來減少Ajax請求帶來的缺點。
合併請求:把同時發生的多個請求合併爲一個。比如一個頁面中的數據可能會來自於多個不同的接口,我們可以把對這些接口的請求放在一起,一次性請求完畢。
強化緩存控制:把不經常更新的接口請求結果寫入LocalStorage,用戶再次進入頁面時,就不必從網絡上重新獲取了。


最後說一下hybrid中的登錄共享問題。
如果用戶進入客戶端時登錄過一次了,在進入客戶端嵌入的Html頁面時,再讓用戶登錄,相信用戶會抓狂的。同樣,在Html頁面上面登錄成功後,也不要再讓用戶在客戶端登錄。這就需要在Native頁面和Html頁面之間做一下登錄共享。
我們可以有兩種方式解決第一個問題。第一種是客戶端登錄後,進入html頁面時,在url上加入認證信息。另一種方式時登錄成功後向WebView注入Cookie。
要解決第二個問題,恐怕只有徹底幹掉html登錄了:在WebView中攔截登錄url,用客戶端登錄來替換。
登錄信息共享的問題解決了,我們還要記得在登錄信息發生變化時,在客戶端和html之間對登錄信息進行同步。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章