什麼是Hybrid Appcss
最開的App開發只有原生開發這個概念,但自從H5普遍流行後,一種效率更高的開發模式Hybrid應運而生,它就是"Hybrid模式"html
Hybrid APP是目前普遍流行的一種APP開發模式前端
H5滲入APP開發css3
咱們都知道,原生APP開發中有一個webview的組件(Android中是webview,iOS7如下有UIWebview,7以上有WKWebview),這個組件能夠加載Html文件。web
在Html5沒有興盛以前,加載的Html每每只能用來作一些簡單的靜態資源顯示,可是H5大行其道之後,Html5中有不少新增的功能,炫酷的效果,特別是iOS中H5支持一直都很良好,Android 4.4以上支持也足夠編程
因此這時候發現能夠將一些主要的邏輯都用H5頁面來編寫,而後原生直接用webview加載顯示,這樣大大提升了開發效率,並且體驗也很不錯小程序
Hybrid的興盛微信小程序
所謂Hybrid,即混合開發,意味着半原生半Web,其實在H5興盛以前,Hybrid模式就已經比較成熟了,可是一直不慍不火(由於系統的一些如今以及html自己功能的限制)api
可是自從H5興盛以後,你們發現原來不少功能均可以用web來實現,而後原生做爲容器顯示瀏覽器
因此爲了提升開發效率,愈來愈多的人使用Hybrid模式進行開發,愈來愈多的Hybrid開發框架,愈來愈多的前端專職成爲Hybrid開發,也就是說Hybrid也隨之興盛起來了
Hybrid定義
怎麼樣的開發模式纔算是Hybrid模式呢?
Hybrid是半Native半web開發模式
Hybrid模式中,底層功能API均由原生容器經過某種方式提供,而後業務邏輯由H5頁面完成,最終原生容器加載H5頁面,完成整個App
成熟的Hybrid模式意味着業務邏輯均由H5實現
一款成熟的Hybrid框架,意味着各類類型的api都很完善,那麼這時候幾乎全部與業務相關的邏輯都是放在H5頁面中的,原生只做爲容器存在
成熟的Hybrid模式可複用性很是高,能夠跨平臺開發
成熟的Hybrid框架,那麼原生只會提供底層API,也就是說全部的業務是H5完成,無論是什麼項目,業務只由H5實現
這時候就能夠發現,業務代碼是能夠跨平臺的,也就是說,開發一次,就能夠和各自原生容器結合,組成兩種原生安裝包了,達到了跨平臺開發效果
Hybrid App的類型劃分
上面提到過Hybrid的定義,但實際上,根據Native和web的混合程度,Hybrid也能夠再次細分爲多種類型
多View混合型
這種模式主要特色是將webview做爲Native中的一個view組件,當須要的時候在獨立運行顯示,也就是說主體是Native,web技術只是起來一些補充做用
這種模式幾乎就是原生開發,沒有下降什麼難度,到了16年幾乎已經沒人使用了
單View混合型
這種模式是在同一個view內,同時包括Native view和webview(互相之間是層疊的關係),好比一些應用會用H5來加載百度地圖做爲整個頁面的主體內容,而後再webview之上覆蓋一些原生的view,好比搜索什麼的
這種模式開發完成後體驗較好,可是開發成本較大,通常適合一些原生人員使用
Web主體型
這種模式算是傳統意義上的Hybrid開發,不少Hybrid框架都是基於這種模式的,好比PhoneGap,AppCan,Html5+等
這種模式的一個最大特色是,Hybrid框架已經提供各類api,打包工具,調試工具,而後實際開發時不會使用到任何原生技術,實際上只會使用H5和js來編寫,而後js能夠調用原生提供的api來實現一些拓展功能
每每程序從入口頁面,到每個功能都是h5和js完成的。理論上來講,這種模式應該是最佳的一種模式(由於用H5和js編寫最爲快速,可以調用原生api,功可以完善)
可是因爲一些webview自身的限制,致使了這種模式在性能上損耗不小,包括在一些內存控制上的不足,因此致使體驗要遜色於原生很多。固然了,若是能解決體驗差問題,這種模式應當是最優的(好比因爲iOS對H5支持很好,iOS上的體驗就很不錯)
多主體共存型(靈活型)
這種模式的存在是爲了解決web主體型的不足,這種模式的一個最大特色是,原生開發和h5開發共存,也就是說,對於一些性能要求很高的頁面模塊,用原生來完成,對於一些通用型模塊,用h5和js來完成
這種模式通用有跨平臺特性,並且用戶體驗號,性能高,不遜色與原生,可是有一個很大的限制就是,採用這種模式須要必定的技術前提
也就是說這種模式不一樣於web主體型能夠直接用第三方框架,這種模式通常是一些有技術支持的公司本身實現的,包括H5和原生的通訊,原生API提供,容器的一些處理所有由原生人員來完成
因此說,使用這種技術的前提是得有專業的原生人員(包括Android,iOS)以及業務開發人員(原生開發負責功能,前端解決簡單通用h5功能)
Hybrid面臨的挑戰
好比Facebook推出的React Native方案,這是Facebook在放棄h5後自行推出一個'反H5方案',一句話總結就是:裏面能夠用JS來完整的寫一個原生應用
好比微信推出的小程序(16年9月分內測),這也是一個微信主導的'反H5方案',一句話總結就是:裏面能夠同JS+微信自制的UI方案來寫一個相似於原生的應用,只不過這個應用不是發佈到App Store中,而是發佈到微信中
Native、Hybrid、React Native、Web App方案的分析比較
目前的主流應用程序有四大類型:Native App、Hybrid App、React Native App、Web App。本文分別對這幾種方案作一些分析對比
Native App
即傳統的原生APP開發模式,Android基於Java語言,底層調用Google的 API;iOS基於OC或者Swift語言,底層調用App官方提供的API。體驗最好
直接依託於操做系統,交互性最強,性能最好,相比於其它模式的交互,原生APP體驗是最優的
功能最爲強大,特別是在與系統交互中,幾乎全部功能都能實現。得益於原生是直接依託於系統的,因此能夠直接調用官方提供的api,功能最爲全面(好比本地資源操做,通知,動畫等)
開發成本高,沒法跨平臺,不一樣平臺Android和iOS上都要各自獨立開發。Android上基於Java開發,iOS上基於OC或Swift開發,相互之間獨立,必需要有各自的開發人員
門檻較高,原生人員有必定的入門門檻,相比廣大的前端人員而言,較少。原生的一個很大特色就是獨立,因此不太容易入門,不像web前端同樣那麼普遍,並且Android,iOS都須要獨立學習
更新緩慢,特別是發佈應用商店後,須要等到審覈週期。原生應用更新是一個很大的問題,Android中還能直接下載整包APK進行更新,可是iOS中,若是是發佈AppStore,必須經過AppStore地址更新,而每次更新都須要審覈,因此沒法達到及時更新
維護成本高。同開發同樣,項目上線後,維護起來也很爲麻煩
Web App
即移動端的網站,將頁面部署在服務器上,而後用戶使用各大瀏覽器訪問。通常泛指 SPA(Single Page Application)模式開發出的網站。體驗最差。不是獨立APP,沒法安裝和發佈
Web網站通常分兩種,MPA(Multi-page Application)和SPA(Single-page Application)。而Web App通常泛指後面的SPA形式開發出的網站(由於能夠模仿一些APP的特性),有以下優勢和缺點
開發成本低,能夠跨平臺,調試方便。web app通常只須要一個前端人員開發出一套代碼,而後便可應用於各大主流瀏覽器(特殊狀況能夠代碼進行下兼容),沒有新的學習成本,並且能夠直接在瀏覽器中調試
維護成本低同上,若是代碼合理,只須要一名前端就能夠維護多個web app
更新最爲快速。因爲web app資源是直接部署在服務器端的,因此只須要替換服務器端的文件,用戶訪問是就已經更新了(固然須要解決一些緩存問題)
無需安裝App,不會佔用手機內存。經過瀏覽器便可訪問,無需安裝,用戶就會比較願意去用
性能低,用戶體驗差。因爲是直接經過的瀏覽器訪問,因此沒法使用原生的API,操做體驗很差
依賴於網絡,頁面訪問速度慢,耗費流量。Web App每次訪問都須要去服務端加載資源訪問,因此必須依賴於網絡,並且網速慢時訪問速度很不理想,特別是在移動端,若是網站優化很差會無端消耗大量流量
功能受限,大量功能沒法實現。只能使用Html5的一些特殊api,沒法調用原生API,因此不少功能存在沒法實現狀況
臨時性入口,用戶留存率低。這既是它的優勢,也是缺點,優勢是無需安裝,肯定是用完後有時候很難再找到,或者說很難專門爲某個web app留存一個入口,致使用戶很難再次使用
Hybrid App
即混合開發,由Native經過JSBridge等方法提供統一的API,而後用Html5+JS來寫實際的邏輯,調用API,這種模式下,因爲Android,iOS的API通常有一致性,並且最終的頁面也是在webview中顯示,有有跨平臺效果
開發成本較低,能夠跨平臺,調試方便Hybrid模式下,由原生提供統一的API給JS調用,實際的主要邏輯有Html和JS來完成,而因爲最終是放在webview中顯示的,因此只須要寫一套代碼便可,達到跨平臺效果,另外也能夠直接在瀏覽器中調試,很爲方便
最重要的是隻須要一個前端人員稍微學習下JS api的調用便可,無需兩個獨立的原生人員。通常Hybrid中的跨平臺最少能夠跨三個平臺:Android App,iOS App,普通webkit瀏覽器
維護成本低,功能可複用。同上,若是代碼合理,只須要一名前端就能夠維護多個app,並且不少功能還能夠互相複用
更新較爲自由。雖然沒有web app更新那麼快速,可是Hybrid中也能夠經過原生提供api,進行資源主動下載,達到只更新資源文件,不更新apk(ipa)的效果
針對新手友好,學習成本較低。這種開發模式下,只須要前端人員關注一些原生提供的API,具體的實現無需關心,沒有新的學習內容,只須要前端人員便可開發
功能更加完善,性能和體驗要比起web app好太多。由於能夠調用原生api,因此不少功能只要原生提供出就能夠實現,另外性能也比較接近原生了
部分性能要求的頁面可用原生實現。這應該是Hybrid模式的最多一個好處了,由於這種模式是原生混合web,因此咱們徹底能夠將交互強,性能要求高的頁面用原生寫,而後一些其它頁面用JS寫,嵌入webview中,達到最佳體驗
相比原生,性能仍然有較大損耗。這種模式受限於webview的性能桎梏,相比原生而言有很多損耗,體驗沒法和原生相比
不適用於交互性較強的app。這種模式的主要應用是:一些新聞閱讀類,信息展現類的app;可是不適用於一些交互較強或者性能要求較高的app(好比動畫較多就不適合)
React Native App
Facebook發起的開源的一套新的APP開發方案,使用JS+部分原生語法來實現功能。初次學習成本較高,可是在入門後,通過良好的封裝也可以實現大部分的跨平臺。並且體驗很好。
雖說開發成本大於Hybrid模式,可是小於原生模式,大部分代碼可複用。相比於原生模式,這種模式是統一用JS寫代碼,因此每每只須要一名成員投入學習,便可完成跨平臺app的開發,並且後續代碼封裝的好,不少功能可複用
性能體驗高於Hybrid,不遜色與原生。這種模式和Hybrid不同,Hybrid中的view層實際上仍是dom,可是這種模式的view層是虛擬dom,因此性能要高於Hybrid,距離原生差距不大
這種模式能夠認爲是用JS寫原生,即頁面用JS寫,而後原生經過Bridge技術分析JS,將JS內容單獨渲染成原生Android和iOS,因此也就是爲何性能不遜色原生
開發人員單一技術棧,一次學習,跨平臺開發。這種模式是統一由JS編寫,有着獨特的語法,因此只須要學習一次,便可同時開發Android和iOS
社區繁榮,遇到問題容易解決。這應該是React Native的很大一個優點,不像Hybrid模式和原生模式同樣各自爲營,這種模式是Facebook統一發起的,因此有一個統一的社區,裏面有大量資源和活躍的人員,對開發者很友好
雖然能夠部分跨平臺,但並非Hybrid中的一次編寫,兩次運行那種,而是不一樣平臺代碼有所區別這種模式實際上仍是JS來寫原生,因此Android和iOS中的原生代碼會有所區別,若是須要跨平臺,對開發人員有必定要求固然了,若是發展了有必定時間,組件庫夠豐富了,那麼其實影響也就不大了,甚至會比Hybrid更快
開發人員學習有必定成本。雖然社區已經比較成熟了,可是一個新的普通前端學習起來仍是有必定學習成本的,沒法像Hybrid模式同樣平滑
Native App | Web App | Hybrid App | React Native App | |
---|---|---|---|---|
原生功能體驗 | 優秀 | 差 | 良好 | 接近優秀 |
渲染性能 | 很是快 | 慢 | 接近快 | 快 |
是否支持設備底層訪問 | 支持 | 不支持 | 支持 | 支持 |
網絡要求 | 支持離線 | 依賴網絡 | 支持離線(資源存本地狀況) | 支持離線 |
更新複雜度 | 高(幾乎老是經過應用商店更新) | 低(服務器端直接更新) | 較低(能夠進行資源包更新) | 較低(能夠進行資源包更新) |
編程語言 | Android(Java),iOS(OC/Swift) | js+html+css3 | js+html+css3 | 主要使用JS編寫,語法規則JSX |
社區資源 | 豐富(Android,iOS單獨學習) | 豐富(大量前端資源) | 有侷限(不一樣的Hybrid相互獨立) | 豐富(統一的活躍社區) |
上手難度 | 難(不一樣平臺須要單獨學習) | 簡單(寫一次,支持不一樣平臺訪問) | 簡單(寫一次,運行任何平臺) | 中等(學習一次,寫任何平臺) |
開發週期 | 長 | 短 | 較短 | 中等 |
開發成本 | 昂貴 | 便宜 | 較爲便宜 | 中等 |
跨平臺 | 不跨平臺 | 全部H5瀏覽器 | Android,iOS,h5瀏覽器 | Android,iOS |
APP發佈 | App Store | Web服務器 | App Store | App Store |
目前有多種開發模式,那麼咱們平時開發時如何選擇用哪一種模式呢?以下
性能要求極高,體驗要求極好,不追求開發效率。通常屬於吹毛求疵的那種級別了,由於正常來講若是要求不是特別高,會有Hybrid
不追求用戶體驗和性能,對離線訪問沒要求。正常來講,若是追求性能和體驗,都不會選用web app
沒有額外功能,只有一些信息展現。由於web有限制,不少功能都沒法實現,因此有額外功能就只能棄用這種方案了
大部分狀況下的App都推薦採用這種模式這種模式能夠用原生來實現要求高的界面,對於一些比較通用型,展現型的頁面徹底能夠用web來實現,達到跨平臺效果,提高效率
固然了,通常好一點的Hybrid方案,都會把資源放在本地的,能夠減小網絡流量消耗
追求性能,體驗,同時追求開發效率,並且有必定的技術資本,捨得前期投入
React Native這種模式學習成本較高,因此須要前期投入很多時間才能達到較好水平,可是有了必定水準後,開發起來它的優點就體現出來了,性能不遜色原生,並且開發速度也很快
除了以上的幾種常見app開發模式,其實還有一些其它的相似方案
好比在進行微信網頁開發時,能夠調用一些微信的特殊api,這其實就是算是微信的Hybrid模式,實質上仍然是在瀏覽器中(只不過是騰訊的X5內核)
固然了,微信在這方面作了不少限制,好比權限認證等等,因此致使開發起來效果不是很完美。這裏再也不贅述其功能
微信小程序是微信新推出的一種新的app方案,2016年9月開始進行內測,2016年11月準備全面面向開發者
須要注意的是,這種模式是「反HTML5」的,至關因而微信提供的一套封閉開發模式,有本身的語法和IDE,有的相似於iOS開發的感受。
Hybrid APP的關鍵是原生頁面與H5頁面直接的交互,以下圖,痛過JSBridge,H5頁面能夠調用Native的api,Native也可調用H5頁面的方法或者通知H5頁面回調
在Hybrid APP中,原生與H5的交互方式在Android和iOS上的實現是有異同的,緣由是Android、iOS的通訊機制有所區別,下面介紹原生和H5相互調用的方法
Native
與H5
交互的兩種方式