咱們知道混合開發,能夠節省不少成本(時間成本,經濟成本等等),因此有不少公司比較鍾愛這種開發形式,今天所講的優化方式,也是我在咱們公司的應用中實際用了的,並且我寫的這個優化的 SDK 已經開源到 github 上了,有興趣的同窗能夠下載來看一下,有不足的地方歡迎指正。這裏給出連接:https://github.com/zhangxu0302/HotUpdateTesthtml
轉載請註明出處:http://www.cnblogs.com/shisishao/p/6830736.htmlgit
-、首先,先介紹下什麼是混合開發:github
咱們一般把移動開發分爲Web、Native和Hybrid,但其實Hybrid又能夠細分的。最簡單的是在Native中放一個WebView,而後加載一個兼容手機的網站,其實就至關於在用戶的手機上創建一個快捷方式,也算是佔據用戶桌面的應急用法吧。用這種方法要注意檢測網絡是否正常,不正常要給予提示,不然蘋果是不予經過的。第二種是將Web相關文件所有放在本地,數據庫同樣用Sqlite作本地存儲,用戶就算不聯網也能工做,或者是以Native爲主,在某些特定的模塊纔會用到WebView。數據庫
其實要我說,只有第二種纔算是真正的Hybrid。很重要的一點是Native和Web有沒有交互,沒有的不算,你直接在WebView中加載一個HTML頁面,這算哪門子的Hybrid開發,這種也談不上什麼技術含量了,沒什麼好講的。這種開發很難模擬Native的體驗,用戶一眼就看出這是網頁,我說的Hybrid開發是那種多數用戶看不出差異的,本篇博客也是針對於第二種形式進行優化的。服務器
2、根據策略,實現不一樣場景的優化:(這裏咱們以 Web build生成的 js 文件爲例,固然 Weex 也是一樣的道理)網絡
一、若是你的應用中的 js 文件是部署到遠程服務器的,也就是說每訪問一個 Web 界面,都是根據 Url 去下載該頁面的js文件而後再加載出來,這個時候其實就有個弊端了,也就是我每次進入同一個界面,都要下載一次該界面的 js 文件。那有沒有辦法,讓我只須要下載一次,下次再進入就不用再下載,而是直接加載已經下載好的呢?答案是確定的。接下來,咱們就重點講解,如何實現這個辦法:就是應用啓動的時候,咱們先去下載全部 js 的壓縮文件包-->而後解壓-->替換-->訪問-->加載,具體實現:優化
(1)每次應用啓動的時候,咱們先請求一個後臺接口,用來告訴咱們:有沒有新的 js 包要下載和下載地址,若是有就去下載,這個時候就有問題了,若是個人 js 包還沒下載完成我就點進了某個 Web 界面怎麼辦,這個時候不就顯示不出來了嗎?別急,咱們不是還有線上的服務器嘛,因此,每訪問一個 Web 界面,咱們先要判斷本地(沙盒中或者叫硬盤中)有沒有相應的 js 文件(能夠根據Url連接來判斷),若是有就訪問本地的 js 文件,若是沒有就去遠程下載。這個時候不就解決了 js 包沒下載完成就進入界面的問題了嘛,哈哈完美,因此,既然咱們說的是優化,就不可能影響正常使用,而是在正常使用的基礎上提高用戶體驗,要不怎麼能叫優化呢。網站
(2)更新 js 包:每次更新線上服務器的 js 文件的時候,這個時候應用要下載的 js 包也要一塊兒更新,也就是要保持兩份文件統一。ui
二、若是你的應用中的 js 文件是集成在工程中的,也就是在你的 .ipa 包中。這個時候也會有必定的弊端,好比,我自己的Native代碼沒有什麼更新,可是個人 js 文件更新了,這個時候就須要到 AppStore 上傳一個新的版本,而後等待蘋果漫長的審覈。那有沒有辦法,讓我在不提交新版應用的狀況下更新掉舊的 js 包呢?固然是有辦法滴呀,接下來就是見證奇蹟的時刻:spa
(1)這種場景跟第一種更新的方式大同小異,就是在每訪問一個 Web 界面,咱們先要判斷本地(沙盒中或者叫硬盤中)有沒有相應的 js 文件(能夠根據Url連接來判斷),若是有就訪問本地的 js 文件,若是沒有就訪問工程中集成的 js 文件。
3、總結
本次所講的優化主要是,能提高用戶體驗,不至於讓用戶一打開你的應用就給人一種很 low 的感受。各類 Web 界面都要加載半天,還有可能加載失敗的狀況。若是有同窗想要優化這塊東西的能夠參考我上面說的我本身寫的那個 SDK,場景考略的仍是比較全了,由於是咱們本身的應用在用,有什麼問題歡迎留言討論。