概念
WPA 的英文全稱是Progress Wab Apps,翻譯爲漸進式應用。
來自 appsco.pe 的解釋
WAP是傳統應用的未來發展方向。webbrowser技術的進步使得創建基於web的應用程序成爲可能,這些應用程序模仿並提供與本機(傳統)應用程序相同的功能,這意味着應用程序可以像網頁一樣被創建。
WPA通過web瀏覽器提供像原生應用一般的強大功能,同時在使用的時候可以不受網絡環的影響。它將遠程應用的功能引入到了Web。
PWA指向一個清單文件manifest,其中包含網站信息,包含圖標、背景屏幕、顏色和默認方向等內容,使用了瀏覽的 Service Worker 功能,通過 Service Worker,可以使得選擇性的緩存部分網站資源,以提供離線訪問的體驗。
特點
響應式,獨立於網絡連接,類似於原生應用的交互和體驗,始終保持更新,安全,可發現,可重連,可安裝,可鏈接
與傳統apps對比
- 跨平臺
wpa程序運行於瀏覽器,與平臺無關,所以無論桌面、IOS、或安卓都可以兼容 - 開發簡單
創建wpa應用與創建web網站幾乎是一樣的,同樣是基於html5和jsvascript。 - 不依賴應用商店
像web頁面一樣,pwa程序運行於web瀏覽器上,這意味着它們不需要通過應用商店即可訪問和升級,同時也意味着節省了30%的抽成(App Store) - 搜索引擎友好
不同於原生應用,pwa程序可以被搜索引擎搜索到,更容易被用戶來發現和傳播。
什麼是 Service Worker
WPA功能的關鍵在於Service Worker。
Service worker是一個註冊在指定源和路徑下的事件驅動worker。它採用JavaScript控制關聯的頁面或者網站,攔截並修改訪問和資源請求,細粒度地緩存資源。你可以完全控制應用在特定情形(最常見的情形是網絡不可用)下的表現。
簡單來講,Service Worker 只是在後臺運行的worker腳本,用JavaScript編寫,只需要簡單幾行代碼,就可以實現攔截網絡請求、處理推送消息並執行其他的任務。對於某些不支持Service Worker的瀏覽器,WPA會自動降級成普通的網站,一樣可以爲用戶提供服務。
Service worker運行在worker上下文,因此它不能訪問DOM。相對於驅動應用的主JavaScript線程,它運行在其他線程中,所以不會造成阻塞。它設計爲完全異步,同步API(如XHR和localStorage)不能在service worker中使用。
出於安全考量,Service workers只能由HTTPS承載,畢竟修改網絡請求的能力暴露給中間人攻擊會非常危險。在瀏覽器的隱私模式,Service Worker不可用。
下圖說明 Service Worker 是如何工作的。
Service Worker 的生命週期
從上圖看,當用戶首次訪問網頁時候,服務器返回響應網頁,
在第一步中,當調用register()函數時候,Servies Worker 開始下載。在註冊過程中,瀏覽器下載、解析並執行 Service Worker(第2部),如果在此步驟出現了任務錯誤,該 Service Worker將被廢棄。
在Sercice Worker被成功執行之後,安裝時間將被激活(第3步)。
完成安裝之後,Sercice Worker即開始被激活生效,開始控制在其控制範圍中的所有事件。
Demo實例
if("serviceWorker" in navigator) {
navigator.serviceWorker.register('./sw.js').then(function(registration){
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}).catch(function(err){
console.log('ServiceWorker registration failed: ', err);
});
}
// sw.js
self.addEventListener('install',function(event){
console.log('install event from sw.js.')
});
// 結果: