PWA
Progressive Web App
通俗來說是能夠安裝在裝置主屏,具有離線執行能力,並且接近原生應用體驗的網頁應用。簡稱PWA。
技術背景
大家都知道H5相比原生應用,無論是載入速度和使用者體驗都會差很多,具體原因有如下幾點:
- 留白時間過長。移動端網路非常不穩定,經常會出現弱網環境(如:電梯,地鐵,大山裡面),這樣會導致資源載入速度非常慢,留白時間相對原生會慢很多。
- 無法離線訪問。因為資源都線上上伺服器,每次訪問H5的頁面強烈依賴網路,原生因為資源都在應用包裡面,就算斷網也會給一個相對友好的展示介面和使用者提醒。
- 無法全屏訪問。H5絕大部分都是跟瀏覽打交道,但是各大瀏覽器廠商都會有一個討厭的頭部和一個討厭的尾部,導致使用者的可視區域大大被壓縮。原生大家都知道可視區域隨意控制。
- 無法訊息推送。
- 沒有自己的啟動圖示,每次都需要輸入網址或者依靠搜尋引擎引流。
這個時候拯救H5的英雄就出現了,他就是PWA。
什麼是 PWA
PWA全稱是: Progressive Web Apps(漸進式網頁應用)。這是 2016 年,Google I/O 大會上提出一個下一代web應用的概念。這並不是描述一個技術,而是一些技術的合集,能讓你在使用 Web的時候感覺像是在使用 APP。
PWA 的優點
- Progressive:不管使用者使用什麼瀏覽器都可用,因為使用漸進增強作為核心原則
- Responsive:適用所有形式的裝置
- Connectivity independent:離線/弱網使用
- App-like:類原生App
- Fresh:持續更新,得益於service worker的更新機制
- Safe:安全,只能通過HTTPS訪問
- Discoverable:得益於W3C manifest ,允許搜尋引擎早到它
- Re-engageable:使用者粘度增強。可以接受訊息推送。
- Installable:可以安裝到裝置桌面,並且可以不用在app store下載
- Linkable:可連線,可以簡單通過一個URL分享應用,不需要複雜的安裝
PWA 主要能做什麼
- 訊息推送
- 主屏ICON,全屏訪問
- 離線儲存
主要技術
- Service Work
- Web App Manifest
Service Worker
本質上還是一個Web Worker,具體點說就是一個基於事件驅動的,能夠後臺執行的,並且提供持久化能力的一個系統
Service Worker 支援的事件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chorme=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Service worker demo</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css" />
</head>
<body>
<h1></h1>
<section></section>
<script src="image-list.js"></script>
<script src="app.js"></script>
</body>
</html>
複製程式碼
self.addEventListener(`install`,function(event){
event.waitUtil(
caches.open(`v1`).then(function(cache){
return cache.addAll([
//圖片列表
]);
})
);
});
self.addEventListener(`fetch`,function(event){
event.respondWidth(caches.match(event.request).then(function(response){
if (response !== undefined){
return response;
} else {
return fetch(event.request).then(function(response){
let responseClone = response.clone();
caches.open(`v1`).then(function(response){
cache.put(event.request,responseClone)
});
return response;
}).catch(function(){
return caches.match(`../../1.jpg`);
});
}
}));
});
複製程式碼
Web App Manifest
// manifest.webmanifest
{
"name":"掘金",
"short_name":"掘金",
"start_url":"",
"display":"standalon",
"background_color":"#fff",
"description":"一個幫助開發者成長的社群",
"icons":[
{
"src":"",
"size":"48x48",
"type":"image/png"
},
{
"src":"",
"size":"48x48",
"type":"image/png"
}
],
"related_application":[
{
"platform":"play",
"url":""
}
]
}
複製程式碼
詳細的文件請檢視:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chorme=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Service worker demo</title>
<link ref="manifest" href="/manifest.webmanifest">
<link rel="stylesheet" type="text/css" media="screen" href="style.css" />
</head>
<body>
<h1></h1>
<section></section>
<script src="image-list.js"></script>
<script src="app.js"></script>
</body>
</html>
複製程式碼
PWA 應用現狀
國內應用
- 餓了麼
- 新浪微博
面臨問題
- 國內Android系統的多樣性和瀏覽器的多樣性,依然面臨相容性的問題
- 由於國內特殊的網路環境,Android沒法用上谷歌的推送系統
- 蘋果對Service Work支援不完善,目前功能還比較弱,不支援推送,不支援後臺執行等
- Service Work還在草案階段