# 渐进式网络应用程序

PWA 標誌
**漸進式網頁應用程式**（**PWA**，亦作**progressive web app**）是一種網頁應用程式，可以作為獨立的應用程式安裝於裝置上。PWA是透過裝置的網頁瀏覽器之離線快取機制進行安裝的。

PWA自2016年起被提出，作為原生（針對特定裝置開發）應用程式的替代方案，其優勢在於無需為不同平台分別打包或發佈。它們可在多種系統上使用，包括桌上型電腦與行動裝置。是否將其發佈至數位發行平台（例如Apple App Store、Google Play或Windows的Microsoft Store）屬於使用者的選擇。

由於PWA以網頁或網站形式呈現，並使用常見之網頁技術建構，包括HTML、CSS、JavaScript及WebAssembly，因此它可以在任何支援 PWA 的瀏覽器之平台上運作。至2021年止，PWA的功能已被若干主流瀏覽器不同程度地支援，包括Google Chrome、Apple Safari、Brave、Firefox for Android與Microsoft Edge，但尚未被Firefox桌面版支援。

## 歷史

### 前身

在2007年的Apple全球開發者大會上，Steve Jobs宣布iPhone將「運行以Web 2.0網際網路標準所建立的應用程式」。此架構無需軟體開發套件（SDK），應用程式將透過Safari瀏覽器引擎完整整合於裝置之中。然而，該模式後來轉向透過App Store發佈，以安撫感到受限的開發者社群。Jobs於2007年10月宣布，隔年將推出SDK。因此，雖然Apple持續支援網頁應用程式，但絕大多數iOS應用程式最終仍轉向App Store架構。

自2010年代初期起，動態網頁允許開發者使用網頁技術建立互動式的網頁應用程式。響應式網頁設計及其提供的彈性螢幕尺寸，使 PWA 開發變得更為可行。同時HTML、CSS及JavaScript的持續強化，讓網頁應用程式得以具備更高程度的互動性，進而實現類似原生應用程式的體驗。

2013年，Mozilla發布了Firefox OS。該系統旨在成為一款開源的作業系統，可讓網頁應用程式以原生應用形式在行動裝置上執行。Firefox OS以Gecko排版引擎為基礎，並配備使用HTML5撰寫的Gaia使用者介面。Firefox OS的開發於2016年結束，並於2017年完全終止，但其分支版本仍被用作KaiOS的基礎，該系統是一種功能型手機平台。

### 初始引進

在2015年，設計師Frances Berriman與Google Chrome工程師Alex Russell創造了「漸進式網頁應用程式」（Progressive Web Apps，簡稱 PWA）這個詞彙，用以描述利用現代瀏覽器所支援的新功能（包含服務工作者和網頁應用程式清單）的應用，讓使用者能夠將網頁應用程式升級為在原生作業系統中運行的漸進式網頁應用程式。接著，Google對Android平台的PWA開發投入大量推廣工作。Firefox於2016年開始支援服務工作者，而Microsoft Edge與Apple Safari則於2018年跟進，使服務工作者可以在所有主要系統上工作。

到了2019年，部分瀏覽器的桌面版本開始支援PWA，包括Microsoft Edge（在Windows）以及Google Chrome（在Windows、macOS、ChromeOS及Linux上）。

在2020年12月，Firefox桌面版放棄了PWA的實作（特別是移除了作為實驗性功能存在的「site-specific browser」原型設定）。一名Firefox架構師指出：「我希望我們傳達的訊號是，PWA支援短期內不會來到桌面版Firefox。」 Mozilla 仍支援 Android 平台的 PWA，並計劃繼續支持。

## 瀏覽器支援統整表格

| 瀏覽器
 | 支援情況
 | 備註
 |
| --- | --- | --- |
| Windows
 | macOS
 | Linux
 | Android
 | iOS & iPadOS
 |
| 基於 Chromium 的瀏覽器
 | 是
 | 是
 | 是
 | 是
 | 不適用
 | 包含Google Chrome、Microsoft Edge、Brave、Opera、Vivaldi，以及其他基於Chromium的瀏覽器。
 |
| Firefox
 | 否
 | 否
 | 否
 | 部份
 | 否
 |  |
| Safari
 | 不適用
 | 部份
 | 不適用
 | 不適用
 | 部份
 |

## 特色

漸進式網頁應用程式（PWA）都設計成能在任何符合適當網頁標準的瀏覽器上運作。與其他跨平台解決方案相同，目標是幫助開發者比起建立原生應用程式更輕鬆地建立跨平台應用程式。 漸進式網頁應用程式採用漸進式增強的網頁開發策略。

有些漸進式網頁應用程式採用一種稱為應用殼模型（App Shell Model）的架構方法。 在此模型中，開發者會將響應式網頁設計應用程式的基本使用者介面或稱「殼層」存放在瀏覽器的離線快取中。此模型允許PWA在有無網路連線時皆維持類似原生應用的使用體驗。這可透過提供一個「初始靜態框架」（initial static frame，一種能夠讓內容逐步以及動態地載入的架構）來加快載入的速度。

### 技術標準

Russell 在2016年描述了網站要被視為漸進式網頁應用程式（並可被瀏覽器安裝）所需的技術基準條件， 並隨後持續更新：

* 起源必須為安全來源。必須透過TLS服務且沒有混合內容。PWA必須使用HTTPS以確保用戶隱私、安全性與內容真實性。
* 必須註冊一個帶有 fetch 處理器的服務工作者。PWA必須利用服務工作者建立可程式化的內容快取。不同於一般HTTP web cache（在首次使用後快取內容，並用各種啟發式方法判斷內容何時不再需要），可程式化快取能在內容首次使用「之前」明確地預取內容，且在不再需要時明確丟棄。這有助於頁面在離線或低品質網路狀態下仍可使用。
* 必須參考網頁應用程式 清單。清單至少要包含五個關鍵屬性：`name` 或 `short_name`、`start_url`、`display`（值為 `standalone`、`fullscreen` 或 `minimal-ui`）、以及 `icons`（包含192 px與512 px兩種尺寸版本）。清單中的資訊使 PWA 可透過 URL 輕鬆分享、可被搜尋引擎發現，並簡化複雜的安裝程序（但 PWA 仍可能被列在第三方应用商店中）。 此外，PWA 支援類原生應用的互動和導航，包括可加入主畫面、顯示啟動畫面等功能。

## 技術

建立漸進式網頁應用程式常用許多技術。若一個網頁應用符合安裝標準，能離線運作並能被加入裝置主畫面，即可視為 PWA。要符合這些定義，所有 PWA 最少需要有清單(manifest)與服務工作者(service worker)。 其他技術則用來儲存資料、與伺服器通訊或執行程式碼。

### Manifest

網頁應用程式清單（web app manifest） 是由 萬維網聯盟（W3C）制定的一項規範，定義了一種基於 JSON 的清單格式（通常標示為 manifest.json），供服務工作者（Service worker）將與網頁應用程式相關的 元資料 集中管理，包含：

* 網頁應用程式的名稱
* 網頁應用程式圖示或圖片物件的連結
* 啟動或開啟網頁應用程式的首選 URL
* 網頁應用程式的設定資料
* 網頁應用程式的預設畫面方向
* 設定顯示模式的選項，例如全螢幕

這些元資料對於應用程式能夠加入主畫面或被列為與原生應用程式並列的項目至關重要。

#### iOS 支援

iOS Safari 瀏覽器對 manifest 不完全支援，但大部分的 PWA 元資料可以透過蘋果專用的 meta 標籤擴充定義。這些標籤允許開發者啟用全螢幕顯示、定義圖示與啟動畫面（splash screen）、並指定應用程式名稱。

### Service workers

服務工作者（service worker）是一種 web worker，實作了一個可程式化的網路代理，可以回應主文件發出的網路／HTTP 請求。它能夠檢查遠端伺服器的可用性，在伺服器可用時快取內容，並於後續提供給文件使用。服務工作者與主文件執行緒分離運作。服務工作者可處理 推播通知、背景資料同步、快取或取回資源請求、攔截網路請求，並且能在註冊它們的文件尚未載入時獨立接收集中更新。

服務工作者經歷三個階段的生命週期：註冊（Registration）、安裝（Installation）與啟用（Activation）。註冊是告訴瀏覽器服務工作者的位置，為安裝做準備。安裝發生在瀏覽器尚無此服務工作者，或發現服務工作者有更新時。啟用發生在 PWA 的所有頁面都關閉後，以避免舊版本與新版本衝突。此生命週期設計也有助於保持版本切換的一致性，因為同一網域同時只能有一個活動中的服務工作者。

### WebAssembly

WebAssembly 允許 預編譯 的程式碼在瀏覽器中以近乎原生的速度執行。 因此，像是 C 這類語言寫成的函式庫可以被加入網頁應用程式中。WebAssembly 於 2015 年宣布，2017 年 3 月首次釋出，並於 2019 年 12 月 5 日成為 W3C 推薦標準（W3C Recommendation）。 並於 2021 年獲得 程式語言軟體獎（Programming Languages Software Award），該獎項由 美國計算機協會（ACM）SIGPLAN 頒發。

### 資料儲存

漸進式網頁應用程式（Progressive Web App，PWA）的執行環境可能會在某些情況下被卸載，因此 PWA 需要以以下其中一種方式來儲存大部分的長期內部狀態（使用者資料、動態載入的應用資源）：

**網頁儲存 (Web Storage)**：Web Storage 是 W3C 的標準 API，允許在現代瀏覽器中進行鍵值儲存。此 API 包含兩個物件，sessionStorage（提供只在會話期間有效，瀏覽器會話結束時清除的儲存空間）和 localStorage（提供跨會話持久儲存空間）。

**索引資料庫 API (Indexed Database API)**：Indexed Database API 是一個 W3C 標準的資料庫 API，在所有主要瀏覽器中都可使用。此 API 受現代瀏覽器支援，能夠儲存 JSON 物件及任何可表示為字串的結構。 Indexed Database API 也可以搭配封裝庫（wrapper library）使用，以提供更多結構化功能。

## 與原生應用程式的比較

2017 年，Twitter 推出 Twitter Lite，一款作為官方原生 Android 和 iOS 應用程式的 PWA 替代方案。根據 Twitter 表示，Twitter Lite 的大小僅佔原生應用程式的 1–3%。 Starbucks 提供的 PWA 比其 iOS 應用程式小了 99.84%。部署 PWA 後，Starbucks 在線訂單數量增加了一倍，桌面使用者的訂單率約與手機應用程式使用者相同。

2018 年由 Forbes 發表的評論發現，Pinterest 的 PWA 使用者在網站上的停留時間比之前的行動網站多了 40%。廣告收益率也提升了 44%，核心互動量增加了 60%。 Flipkart 發現有 60% 卸載原生應用程式的用戶會回來使用 Flipkart PWA。Lancôme 的 PWA 讓頁面可互動的時間縮短了 84%，轉換率提升了 17%，iOS 行動裝置上的瀏覽量增加了 53%。

## 透過應用程式商店發佈

由於 PWA 不需要針對不同平台分別打包或發佈，且使用者可以透過網頁直接取得，因此開發者不需要透過像 Apple App Store、Google Play、Microsoft Store 或 Samsung Galaxy Store 等數位發行平台來發佈。主要的應用商店對於 PWA 的支援程度各有不同。 Google Play、Microsoft Store、 和 Samsung Galaxy Store 支援 PWA，但 Apple App Store 不支援。Microsoft Store 會自動（甚至未經應用程式作者申請）發佈部分符合條件的 PWA，這是透過 Bing 索引所發現的結果。

* Google Lighthouse，Google 開發的開源 PWA 程式碼審查工具
* 超級應用程式
* 微信小程序

## 參考資料

* Web Applications Working Group （页面存档备份，存于互联网档案馆） 標準索引