手機現在是互聯網的最大入口。根據《中國互聯網報告》,手機網民已經超過8億,人均每天上網三個多小時。
如果你開始學習手機 App 開發,就一定會聽到 H5 這個詞。它是目前的主流開發技術之一,容易上手,開發周期短、成本低、兼容傳統 Web 開發。但是,很少有文章詳細介紹,H5 到底是什么技術,有什么原理,跟其他技術的差異在哪里。
## 一、H5 的含義
表面上看,手機 App 都是同樣的東西,就是手機上的應用程序,點擊圖標就能運行,但是它們的底層技術不一樣。按照開發技術,App 可以分成三大類。
> * 原生應用(native application,簡稱 native App)
> * Web 應用(web application,簡稱 Web App)
> * 混合應用(hybrid application,簡稱 hybrid App)
這三類 App 的技術模型都不一樣,各有優缺點。企業一般會選擇其中一種作為主要技術棧,構建自己的手機 App。

## 二、原生應用
### 2.1 概念
**原生 App 是專門為特定手機平臺開發的應用程序**,無法在其他平臺運行。一個手機軟件如果要同時支持蘋果手機和安卓手機,就需要為它們各寫一個原生 App。
歷史上,原生 App 最早出現,跟智能手機系統一起誕生。2007年6月 iPhone 誕生,2008年9月安卓誕生,就同時發布了自家平臺的原生 App 開發方法。
原生 App 使用與手機操作系統相同的語言。iOS 的原生 App 使用 Objective-C 語言或 Swift 語言,安卓使用 Java 語言或 Kotlin 語言。由于跟底層系統的語言和技術模型一致,所以原生 App 的性能和用戶體驗都很好。

### 2.2 優點
原生 App 的優點主要是兩個:(1)較好的性能和體驗;(2)可以使用系統的所有硬件和軟件 API,比如 GPS、攝像頭、麥克風、加速計、通知推送等等,能充分發揮系統的潛力。
### 2.3 缺點
原生 App 的缺點主要是成本,每個手機平臺都要建立一個獨立的開發團隊,大公司一般都有 iOS 和安卓兩個開發團隊。如果出現第三個平臺(以前的 Windows Phone,也許是華為鴻蒙 OS),就要組建第三個團隊,成本就更高。
第二個缺點是,原生 App 使用底層操作系統的語言,都是很重的編譯型語言,開發和調試成本相對較高,時間周期長。
第三個缺點是,原生 App 必須下載安裝才能使用,只要升級版本,就必須重新下載安裝。用戶往往不愿意更新版本,廠商被迫不得不長期支持很久以前的舊版本。
## 三、Web 應用
### 3.1 概念
Web App 是使用網頁做的應用程序,必須在瀏覽器中使用。比如,你在瀏覽器中收發郵件,就是在使用 Web App。
Web App 主要使用網頁技術,即 HTML、JavaScript 和 CSS。2008年,w3c 組織發布了 HTML 第5版,簡稱 HTML 5,該版本大大增強了網頁的功能,使得網頁可以當作應用程序使用,而不僅僅是展示文字和圖片,這就是 Web App 的由來。
### 3.2 優點和缺點
Web App 的優點是:(1)不需要下載安裝,打開瀏覽器就能使用,而且總是使用最新版本;(2)對于開發者來說,Web App 寫起來比較快,調試容易,不需要應用商店的批準就能發布。
Web App 的主要缺點有兩個。首先,瀏覽器提供的 API(即 Web API)很有限(目前只有相機、GPS、電池等少數幾個),大部分系統硬件都不能通過網頁訪問,也無法直接讀取硬盤文件,所以 Web App 無法充分利用平臺的硬件。
第二個缺點是,網頁通過瀏覽器渲染,性能不如原生 App,不適合做性能要求較高的頁面。
### 3.3 WebApp 的劣勢
Web App 需要打開瀏覽器才能使用,這意味著,用戶必須記住如何導航到它,要么直接輸入網址,要么翻找書簽。這使得進入 Web App,遠不如原生 App 方便。這點很致命,事實表明,用戶偏好原生 App。
谷歌曾經調查了原生 App 和 Web App 各一千個,發現 Web App 可以覆蓋更多的用戶(1100萬 vs 400萬),但是原生 App 的用戶使用時間(188分鐘)遠超 Web App(9分鐘)。


另一項調查發現,用戶87%的時間用在原生 App,13%的時間用在 Web App。由于這個原因,企業很少開發 Web App,都把原生 App 當作首選。
但是,Web App 也不是毫無競爭力。根據調查,普通用戶每月平均使用27個原生 App,但訪問了100多個手機網站。這意味著,用戶的 App 使用時間都被頭部 App 占據了,小公司的 App 使用頻率非常低,獲客成本極高,最終變成僵尸 App。因此,小公司開發 Web App 更劃算,不僅成本低,而且可以服務更多的用戶,以及更好地宣傳自己(可以被搜索引擎收入)。
### 3.4 PWA
為了推廣 Web App,谷歌公司的 Chrome 瀏覽器團隊做了很多努力。他們認為,Web App 足以滿足大多數 App 的需求,但是三大缺陷阻礙它的推廣。
1. 不能從手機的首屏直接進入。
2. 缺乏手機狀態欄和鎖屏時的通知推送能力。
3. 不支持脫機訪問(即斷網也能使用)。
為了解決這些問題,Chrome 團隊開發了新技術"漸進式 Web App"(Progressive Web App,縮寫 PWA)。它可以把網站緩存在手機里面,供離線時使用,還能在手機首屏生成圖標,直接點擊進入,并且有通知推送能力,也不帶有瀏覽器的地址欄和狀態欄,跟原生 App 的使用體驗非常接近。
但是,PWA 需要瀏覽器訪問一次網站,才能在首屏生成圖標,并且目前 iOS 系統的支持還不夠理想,所以還只是一項探索性質的技術,迄今為止缺乏足夠的成功案例。
## 四、混合應用
### 4.1 概念
混合 App (hybrid App)顧名思義就是原生 App 與 Web App 的結合。它的殼是原生 App,但是里面放的是網頁。可以理解成,混合 App 里面隱藏了一個瀏覽器,用戶看到的實際上是這個隱藏瀏覽器渲染出來的網頁。

混合 App 的原生外殼稱為"容器",內部隱藏的瀏覽器,通常使用系統提供的網頁渲染控件(即 WebView 控件),也可以自己內置一個瀏覽器內核。結構上,混合 App 從上到下分成三層:HTML5 網頁層、網頁引擎層(本質上是一個隔離的瀏覽器實例)、容器層。
### 4.2 API Bridge
混合 App 里面的網頁不同于普通網頁,可以調用底層系統所有的 API。奧秘就在于外層容器提供了 API Bridge,充當底層 API 的中介,允許內部的網頁調用底層。
所謂 API Bridge 就是容器在底層接口和網頁之間,建立一座橋梁,讓雙方通信。容器一旦接到網頁的請求,就根據請求去調用底層系統的 API,然后再返回結果給網頁。API Bridge 往往以 JavaScript 語言提供,方便網頁調用,這時又稱為 JSbridge。

不同容器的 API Bridge 是不一樣的。為某個容器寫的網頁,不能放在另一個容器使用,也無法在瀏覽器使用,除非網頁腳本做了兼容處理。
容器提供的 API Bridge 必須跟著平臺更新。比如,iOS 發了新版本,有了新的硬件 API,容器也必須跟著推出新版的 API Bridge。如果容器沒有跟上,開發者為了使用新的硬件,就只能想辦法自己來寫缺失的 API Bridge。
### 4.3 優點
混合 App 同時具有原生 App 和 Web App的優點,又可以避免它們的一些缺點。具體來說,可以總結為三點。
(1)跨平臺
Web 技術是跨平臺的,開發者只寫一次頁面,就能支持多個平臺。也就是說,混合 App 只需要一個團隊就夠了,開發成本較低。
(2)靈活性
混合 App 的靈活性大,很容易集成多種功能。一方面,混合 App 很容易加載外部的 H5 頁面,實現 App 的插件結構;另一方面,Web 頁面可以方便地調用外部的 Web 服務。
(3)開發方便
Web 頁面的調試和構建,遠比原生控件簡單省時。頁面的更新也容易,只要在服務器上發布新版本,觸發容器內更新就可以了。另外,Web 開發人員也比較容易招聘,傳統的前端程序員可以承擔開發任務。
### 4.4 缺點
混合 App 的主要缺點是,由于存在網頁引擎的中間層,所以性能比較欠缺,不僅不如原生 App,而且由于 WebView 不是全功能瀏覽器,可能比 Web App 都要慢一些。
另一個缺點是,由于頁面跨平臺,就無法使用只有特定平臺提供的功能,導致體驗不如純的原生 App。舉例來說,早期的時候,安卓有物理的后退按鈕,iPhone 沒有,頁面設計不得不考慮這一點。
### 4.5 小程序

所謂小程序,可以看作是針對特定容器的 H5 開發。微信本身是一個容器,開放自己的接口(JSbridge),外部開發者使用規定的語法,編寫頁面,容器可以動態加載這些頁面。
小程序對于微信官方的好處是,擴展了功能和應用場景,吸引外部開發者加入,繁榮了生態。對于外部開發者的好處是,有了流量入口,可以直接調用微信的各種功能(比如支付)。
- 第一章:移動開發入門
- 第一節:概述
- 第二節:基礎概念
- 第一課時:像素
- 第二課時:視口
- 第二章:Flex 布局
- 第一節:概述
- 第二節:容器屬性
- 第一課時:flex-direction 屬性
- 第二課時:flex-wrap 屬性
- 第三課時:flex-flow 屬性
- 第四課時:justify-content 屬性
- 第五課時:align-items 屬性
- 第六課時:align-content 屬性
- 第三節:項目屬性
- 第一課時:order 屬性
- 第二課時:flex-grow 屬性
- 第三課時:flex-shrink 屬性
- 第四課時:flex-basis 屬性
- 第五課時:flex 屬性
- 第六課時:align-self 屬性
- 第四節:Flex 實例
- 第一課時:常見頁面布局
- 第三章:響應式布局
- 第一節:概述
- 第二節:媒體查詢
- 第一課時:概述
- 第二課時:響應式設計
- 第三節:柵格系統
- 第一課時:概述
- 第二課時:案例分析
- 第三課時:Bootstrap 簡介
- 第四節:響應式案例
- 第一課時:三星首頁
- 第四章:移動端適配
- 第五章:移動端事件
- 第一節:概述
- 第二節:touch 事件
- 第三節:觸摸事件對象
- 第四節:其他事件
- 第五節:移動端幻燈片
- 第六章:移動端常見問題
- 第一節:瀏覽器兼容性
- 第二節:移動端動畫
- 第三節:300ms 延遲
- 第四節:文字溢出省略
- 第五節:水平居中和垂直居中
- 第七章:項目案例
- 第一節:美團外賣
- 第一課時:首頁
- 第二課時:訂單頁面
- 第三課時:我的頁面
- 第四課時:詳情頁面
- 第五課時:購物車頁