本文由雲+社區發表html
傳統的Web網頁存在如下幾個問題:web
Native app:chrome
2016 年Google I/O 大會上提出一個 Next Web Generation 的概念。PWA是在傳統Web應用的基礎上,結合Manifest和service worker,完善Web應用的一些能力,好比:json
Web App Manifest 技術實現了將PWA網頁應用 添加至桌面的功能,但該項技術目前仍處於實驗性階段,各瀏覽器支持度不高小程序
image.pngsegmentfault
PWA 站點部署的 manifest.json文件知足如下條件時會自動顯示橫幅:微信小程序
- short\\_name (主屏幕顯示) - name (安裝橫幅顯示) - icons (必須包含一個 mime 類型爲 image/png 的圖標聲明) - start\\_url (應用啓動地址) - display (必須爲 standalone 或 fullscreen) - 站點註冊 Service Worker。 - 站點支持 HTTPS 訪問。 - 同一瀏覽器中站點至少被訪問兩次,間隔至少爲 5 分鐘。
PWA應用的離線體驗、按期的後臺同步以及推送通知等功能的實現依賴於Service Worker技術,下圖爲目前SW技術的支持度。瀏覽器
SW具備如下特徵:緩存
Service Worker是基於註冊、安裝、激活等步驟微信
註冊
if ('serviceWorker' in navigator) { window.addEventListener('load', function () { navigator.serviceWorker.register('/jslearning/sw.js') // 默認做用域爲jslearning下,也能夠經過設置scope參數進行設置 .then(function (registration) { // 註冊成功 console.log('ServiceWorker registration successful with scope: ', registration.scope); }) .catch(function (err) { // 註冊失敗:( console.log('ServiceWorker registration failed: ', err); }); }); }
安裝
this.addEventListener('install', function(event) { console.log('V1 installing…'); //須要緩存的重要的高優先級資源 var vipUrlsToPrefetch = [ './index.html' ]; //次重要的資源 var urlsToPrefetch = [ './icon.png' ]; event.waitUntil( caches.open(OFFLINE_CACHE_NAME).then(function(cache) { //urlsToPrefetch非重要資源,即便有資源加載失敗也不影響Service Worker安裝 cache.addAll(urlsToPrefetch); //vipUrlsToPrefetch中資源所有請求成功,Service Worker安裝事件才順利完成,能夠進入激活事件 return cache.addAll(vipUrlsToPrefetch); }) ); });
激活
//Service Worker激活事件 this.addEventListener('activate', function(event) { //在激活事件中清除非當前版本的緩存避免用戶存儲空間急劇膨脹 event.waitUntil(caches.keys().then(function(cacheNames) { console.log('V1 activate'); return Promise.all(cacheNames.map(function(cacheName) { if (cacheName !== OFFLINE_CACHE_NAME) { if(cacheName.indexOf(OFFLINE_CACHE_PREFIX) != -1) { return caches.delete(cacheName); } } })); })); });
Service Worker緩存策略大部分在fetch與install時間中定義,對於某些固定不變的靜態資源,能夠在Service Worker初次安裝的install事件中將其緩存,但資源過大或者網絡不佳都會形成資源並未所有下載成功而致使Service Worker安裝被中斷安裝失敗。SW主要有如下幾類緩存策略:
// 漸進式緩存 var addToCache = function(req) { return fetch(req.clone()).then(function(resp) { var cacheResp = resp.clone(); if (!resp.ok) { return resp; } caches.open(OFFLINE_CACHE_NAME).then(function(cache) { cache.put(req.clone(), cacheResp); }); return resp; }); }; this.addEventListener('fetch', function(event) { event.respondWith( caches.open(OFFLINE_CACHE_NAME).then(function(cache) { return cache.match(event.request); }).then(function(response) { if (response) { return response; } else { return addToCache(event.request); } }) ); });
PWA應用能夠經過開發者工具中的Application進行查看調試,以下圖所示:
優勢
缺點
此文已由做者受權騰訊雲+社區在各渠道發佈
獲取更多新鮮技術乾貨,能夠關注咱們騰訊雲技術社區-雲加社區官方號及知乎機構號