1. 程式人生 > >Hybrid APP基礎篇(二)->Native、Hybrid、React Native、Web App方案的分析比較

Hybrid APP基礎篇(二)->Native、Hybrid、React Native、Web App方案的分析比較

說明

Native、Hybrid、React、Web App方案的分析比較

目錄

前言

參考來源

前人栽樹,後臺乘涼,本文參考了以下來源

前置技術要求

閱讀本文前,建議先閱讀以下文章

楔子

目前的主流應用程式有四大型別:Native App、Hybrid App、React Native App、Web App。本文分別對這幾種方案做一些分析對比

幾種APP開發模式

概述

當前的APP開發模式注意有以下四大型別:

  • Native App

    即傳統的原生APP開發模式,Android基於Java語言,底層呼叫Google的 API;iOS基於OC或者Swift語言,底層呼叫App官方提供的API。體驗最後。

  • Web App

    即移動端的網站,將頁面部署在伺服器上,然後使用者使用各大瀏覽器訪問。一般泛指 SPA(Single Page Application)模式開發出的網站。體驗最差。

  • Hybrid App

    即混合開發,由Native通過JSBridge等方法提供統一的API,然後用Html5+JS來寫實際的邏輯,呼叫API,這種模式下,由於Android,iOS的API一般有一致性,而且最終的頁面也是在webview中顯示,所有有跨平臺效果

  • React Native App

    Facebook發起的開源的一套新的APP開發方案,使用JS+部分原生語法來實現功能。初次學習成本較高,但是在入門後,經過良好的封裝也能夠實現大部分的跨平臺。而且體驗很好。

Native App

即原生開發模式,開發出來的是原生程式,不同平臺上,Android和iOS的開發方法不同,開發出來的是一個獨立的APP,能釋出應用商店,有如下優點和缺點

優點

  • 直接依託於作業系統,互動性最強,效能最好

    相比於其它模式的互動,原生APP體驗是最優的

  • 功能最為強大,特別是在與系統互動中,幾乎所有功能都能實現

    得益於原生是直接依託於系統的,所以可以直接呼叫官方提供的api,功能最為全面(比如本地資源操作,通知,動畫等)

缺點

  • 開發成本高,無法跨平臺,不同平臺Android和iOS上都要各自獨立開發

    Android上基於Java開發,iOS上基於OC或Swift開發,相互之間獨立,必須要有各自的開發人員

  • 門檻較高,原生人員有一定的入門門檻,相比廣大的前端人員而言,較少

    原生的一個很大特點就是獨立,所以不太容易入門,不像web前端一樣那麼廣泛,而且Android,iOS都需要獨立學習

  • 更新緩慢,特別是釋出應用商店後,需要等到稽核週期

    原生應用更新是一個很大的問題,Android中還能直接下載整包APK進行更新,但是iOS中,如果是釋出AppStore,必須通過AppStore地址更新,而每次更新都需要稽核,所以無法達到及時更新

  • 維護成本高

    同開發一樣,專案上線後,維護起來也很為麻煩

Web App

即移動端的網站,將頁面部署在伺服器上,然後使用者使用各大瀏覽器訪問,不是獨立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

即混合開發,也就是半原生半Web的開發模式,有跨平臺效果,當然了,實質最終釋出的仍然是獨立的原生APP(各種的平臺有各種的SDK),有如下優點和缺點

優點

  • 開發成本較低,可以跨平臺,除錯方便

    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開發方案,Facebook在當初深入研究Hybrid開發後,覺得這種模式有先天的缺陷,所以果斷放棄,轉而自行研究,後來推出了自己的“React Native”方案,不同於H5,也不同於原生,更像是用JS寫出原生應用,有如下優點和缺點

其實很多大公司都已經轉React Native開發了,已經很成熟了

優點

  • 雖然說開發成本大於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 AppWeb AppHybrid AppReact 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

如何選擇開發模式

目前有多種開發模式,那麼我們平時開發時如何選擇用哪種模式呢?如下

選擇純Native App模式的情況

  • 效能要求極高,體驗要求極好,不追求開發效率

    一般屬於吹毛求疵的那種級別了,因為正常來說如果要求不是特別高,會有Hybrid

選擇Web App模式的情況

  • 不追求使用者體驗和效能,對離線訪問沒要求

    正常來說,如果追求效能和體驗,都不會選用web app

  • 沒有額外功能,只有一些資訊展示

    因為web有限制,很多功能都無法實現,所以有額外功能就只能棄用這種方案了

選擇Hybrid App模式的情況

  • 大部分情況下的App都推薦採用這種模式

    這種模式可以用原生來實現要求高的介面,對於一些比較通用型,展示型的頁面完全可以用web來實現,達到跨平臺效果,提升效率

    當然了,一般好一點的Hybrid方案,都會把資源放在本地的,可以減少網路流量消耗

選擇React Native App模式的情況

  • 追求效能,體驗,同時追求開發效率,而且有一定的技術資本,捨得前期投入

    React Native這種模式學習成本較高,所以需要前期投入不少時間才能達到較好水平,但是有了一定水準後,開發起來它的優勢就體現出來了,效能不遜色原生,而且開發速度也很快

另類的app方案

除了以上的幾種常見app開發模式,其實還有一些其它的類似方案

微網頁

比如在進行微信網頁開發時,可以呼叫一些微信的特殊api,這其實就是算是微信的Hybrid模式,實質上仍然是在瀏覽器中(只不過是騰訊的X5核心)

當然了,微信在這方面做了很多限制,比如許可權認證等等,所以導致開發起來效果不是很完美。這裡不再贅述其功能

微信小程式

微信小程式是微信新推出的一種新的app方案,2016年9月開始進行內測,2016年11月準備全面面向開發者

需要注意的是,這種模式是“反HTML5”的,相當於是微信提供的一套封閉開發模式,有自己的語法和IDE,有的類似於iOS開發的感覺。具體也不贅述,請參考引用來源中的文章

其它

當然除此外,還有一些其它的模式,比如“百度直達號”,"流應用"等等,這裡不再贅述

相關推薦

Hybrid APP基礎()->NativeHybridReact NativeWeb App方案分析比較

說明 Native、Hybrid、React、Web App方案的分析比較 目錄 前言 參考來源 前人栽樹,後臺乘涼,本文參考了以下來源 前置技術要求 閱讀本文前,建議先閱讀以下文章 楔子 目前的主流應用程式有四大型別:Native App、Hybrid App、React

Hybrid APP基礎(一)->什麼是Hybrid App

最新更新 Android、iOS、JS三端內容初步都已經完成,有完善的設計思路、教程以及API文件。 說明 Hybrid APP是目前廣泛流行的一種APP開發模式,本文對其做簡單介紹 目錄 前言 參考來源 前人栽樹,後臺乘涼,本文參考了以下來源 楔子 現在概念上的APP誕生是

Qt入門之基礎 ( ) :Qt項目建立編譯運行和發布過程解析

qt 5 對話 讓我 進度 qmake ctr deploy 設定 設置 轉載請註明出處:CN_Simo。 題解:   本篇內容主講Qt應用從創建到發布的整個過程,旨在幫助讀者能夠快速走進Qt的世界。   本來計劃是講解Qt源碼靜態編譯,如此的話讀者可能並不能清楚地知

mysql 基礎() 賬號許可權管理

mysql 基礎篇(二) 賬號、許可權管理、備份與還原   建立賬號密碼:Grant all on test.* to “cj”@”localhost” identified by “cj”; 建立賬號 如果報錯: 需要執行flush privileges 後,在重新執行新增使用者就可

JavaSE7基礎 定義維數組 固定的行列數

pre png 運行 二維數組 代碼 args logs 精華 dem 版本參數:jdk-7u72-windows-i586註意事項:博文內容僅供參考,不可用於其他用途。 代碼 class Demo{ public static void main(Stri

通過Rancher部署並擴容Kubernetes集群基礎

rancher k8s 接上一篇通過Rancher部署並擴容Kubernetes集群基礎篇一7. 使用ConfigMap配置redishttps://github.com/kubernetes/kubernetes.github.io/blob/master/docs/user-guide/confi

NIO相關基礎

說明 poll 可靠性 span 心跳檢測 客戶端 保持 fig string 轉載請註明原創出處,謝謝! 上篇NIO相關基礎篇一,主要介紹了一些基本的概念以及緩沖區(Buffer)和通道(Channel),本篇繼續NIO相關話題內容,主要就是文件鎖、以及比較關鍵的Se

Python之旅 (基礎 1-25)

body 函數 closed 技術分享 items pop img -s 之間 字典:   字典是python中唯一的映射類型,采用鍵值對(key-value)的形式存儲數據。python對key進行哈希函數運算,根據計算的結果決定value的存儲地址,所以字典是無序存儲

JAVA常用集合框架用法詳解基礎之Colletion子介面List

接著上一篇,接著講講集合的知識。上一篇講了Collection介面。它可以說是集合的祖先了,我們這一篇就說說它的子孫們。 一、Collection的子介面 List:有序(存入和取出的順序一致),元素都有索引(即角標),元素可以重複。 Set:元素不能重複,無序的。 首先講講L

python 面試題(基礎) +手打答案整理---------玉米都督

*arg和**kwarg作用 比如現在我有一個最簡單的加法(Jiafa)函式: def Jiafa(x, y): z = x + y return z print(Jiafa(1,2)) 這個很簡單,一看就知道輸出等於3。 那下一個問題是,如果我要算不固定個數的數字相加,那怎

Vue 基礎

Vue 元件 元件(Component)是Vue.js最強大的功能之一. 元件可以擴充套件HTML元素,封裝可重用的程式碼,是可複用的Vue例項. 元件的註冊 // html 程式碼 <div id="app"> <my-component><

Vue元件 Vue 基礎

Vue 基礎篇二   Vue元件 元件 (Component) 是 Vue.js 最強大的功能之一。

Spring 基礎() SpringBean 的生命週期

Spring中Bean的管理是其最基本的功能,根據下面的圖來了解Spring中Bean的生命週期: 例項化一個Bean,也就是我們通常說的new 按照Spring上下文對例項化的Bean進行配置,也就是IOC注入 如果這個Bean實現了BeanNa

JS 基礎():理解JS原型物件與原型鏈

目錄: 一、什麼是原型物件和原型鏈 JavaScript 常被描述為一種基於原型的語言 (prototype-based language)——每個物件對應擁有一個原型,物件以其原型為模板、從原型繼承方法和屬性。而同時原型也是物件,它也擁有原型,並從中繼承方法

Python開發第一 基礎()-------運算子與基本資料型別

  對於python而言,一切事物都是物件,物件是基於類建立的,物件繼承了類的屬性,方法等特性       一.int       首先我們來檢視一下int包含了哪些函式          # python3

【Redis詳解基礎(命令)】

這裡寫自定義目錄標題前言操作 前言 操作 寫鍵值對 set key value 獲取鍵值對 get key 切換資料庫 select 15 //預設是有16個數據庫 直接到指定的

Android基礎()——Android應用結構分析和清單檔案

一、Android應用目錄結構簡單介紹 在Android Studio上開發Android應用簡單方便,除了建立Android專案,開發者只需做兩件事情:1.使用activiy_main.xml檔案定

ADO.NET資料訪問技術基礎

DataReader 基本概念     通過DataReader我們可以以只讀、順序的方式檢視資料庫中的資料 常用屬性 IsClosed     判斷DataReader是否關閉。 RowFetc

php基礎-維陣列排序 array_multisort

<?php function my_sort($arrays,$sort_key,$sort_order=SORT_ASC,$sort_type=SORT_NUMERIC ){ if(is_array($arrays)){ foreach ($arrays as $array){

初級:微信小程式申請工具常用網址

從這篇文章你可以學到: 1、個人或公司申請小程式 2、小程式管理工具、資料助手等工具 3、小程式開發者常用的網址   一、個人或公司如何申請小程式 小程式和公眾號是同一個入口: https://mp.weixin.qq.com/ 點選左上