摘要:而且,在接下來(lái)頁(yè)面的異步請(qǐng)求中,還能進(jìn)行緩存嘗試這里配置的文件清單在安裝激活階段不會(huì)進(jìn)行緩存,只有在監(jiān)聽(tīng)到網(wǎng)絡(luò)請(qǐng)求的時(shí)候才進(jìn)行緩存。
基本知識(shí)普及請(qǐng)參考
https://www.jianshu.com/p/623...
https://zhuanlan.zhihu.com/p/...
下面簡(jiǎn)單介紹一下插件的使用
以下是我在項(xiàng)目中使用的配置
webpack.prod.conf.js中
{ ... plugins: [ new OfflinePlugin({ responseStrategy: "cache-first", // 緩存優(yōu)先 AppCache: false, // 不啟用appCache safeToUseOptionalCaches: true, // Removes warning for about `additional` section usage autoUpdate: true, // 自動(dòng)更新 caches: { // webpack打包后需要換的文件正則匹配 main: [ "**/*.js", "**/*.css", /.(png|jpe?g|gif|svg)(?.*)?$/, /.(woff2?|eot|ttf|otf)(?.*)?$/ ], additional: [ ":externals:" ] }, externals: [], // 設(shè)置外部鏈接,例如配置http://hello.com/getuser,那么在請(qǐng)求這個(gè)接口的時(shí)候就會(huì)進(jìn)行接口緩存 excludes: ["**/.*", "**/*.map", "**/*.gz", "**/manifest-last.json"], // 需要過(guò)濾的文件 ServiceWorker: { output: "./static/sw.js", // 輸出目錄 publicPath: "/static/sw.js", // sw.js 加載路徑 scope: "/", // 作用域(此處有坑) minify: true, // 開(kāi)啟壓縮 events: true // 當(dāng)sw狀態(tài)改變時(shí)候發(fā)射對(duì)應(yīng)事件 } }) ] }
在入口js文件中
OfflinePluginRuntime.install({ // 監(jiān)聽(tīng)sw事件,當(dāng)更新ready的時(shí)候,調(diào)用applyUpdate以跳過(guò)等待,新的sw立即接替老的sw onUpdateReady: () => { console.log("SW Event:", "onUpdateReady") OfflinePluginRuntime.applyUpdate() }, onUpdated: () => { console.log("SW Event:", "onUpdated") window.swUpdate = true } })
首先介紹一下assets里面的三個(gè)屬性:
main: [] 這里配置的是serviceWorker在install階段需要緩存的文件清單,如果其中有一個(gè)失敗了,那么整個(gè)serviceWorder就會(huì)安裝失敗,所以必須謹(jǐn)慎配置
additional: [] 這里配置的文件清單會(huì)在serviceWorker activate的時(shí)候進(jìn)行緩存,與main不一樣,如果這里的文件緩存失敗,不會(huì)影響serviceWorker的正常安裝。而且,在接下來(lái)頁(yè)面的ajax異步請(qǐng)求中,還能進(jìn)行緩存嘗試
optional: [] 這里配置的文件清單在serviceWorker安裝激活階段不會(huì)進(jìn)行緩存,只有在監(jiān)聽(tīng)到網(wǎng)絡(luò)請(qǐng)求的時(shí)候才進(jìn)行緩存。
剛才說(shuō)到作用域的時(shí)候有坑,如果按照上面的文件配置,最后在網(wǎng)頁(yè)中會(huì)提示,sw最大的作用域權(quán)限在/static下面,言外之意這么寫(xiě)是無(wú)法將sw的作用域設(shè)置在/根路徑下面。
所以這邊需要服務(wù)端在返回sw.js的時(shí)候手動(dòng)設(shè)置Service-Worker-Allowed頭字段,并且值設(shè)置為/,同時(shí)這個(gè)文件的緩存時(shí)間設(shè)為0,否則,當(dāng)更新serviceWorker的時(shí)候,由于瀏覽器緩存了sw.js用戶(hù)端這邊的serviceWorker無(wú)法第一時(shí)間更新。
最后來(lái)一張線(xiàn)上項(xiàng)目,在網(wǎng)速極慢的情況下也能實(shí)現(xiàn)秒開(kāi)
-------------------追加--------------------擴(kuò)展fetch事件
首先在配置文件里添加入口
sw-entry.js
self.addEventListener("fetch", function (event) { function cachesMatch (request, cacheName) { return caches.match(request, { cacheName: cacheName }).then(function (response) { return response }) // Return void if error happened (cache not found) ["catch"](function () {}) } function cacheFirst(cacheUrl, CACHE_NAME) { var resource = cachesMatch(cacheUrl, CACHE_NAME).then(function (response) { if (response) { return response; } // Load and cache known assets var fetching = fetch(urlString).then(function (response) { if (!response.ok) { return response; } (function () { var responseClone = response.clone(); var storing = caches.open(CACHE_NAME).then(function (cache) { return cache.put(urlString, responseClone); }).then(function () { console.log("[SW]:", "Cache asset: " + urlString); }); event.waitUntil(storing); })(); return response; }); return fetching; }) return resource } function netWorkFirst(cacheUrl, CACHE_NAME) { var resource = fetch(cacheUrl).then(response => { if (response.ok) { var responseClone = response.clone() var storing = caches.open(CACHE_NAME).then(function (cache) { cache.put(cacheUrl, responseClone); }).then(function () { console.log("[SW]:", "Cache asset: " + cacheUrl); }); event.waitUntil(storing); return response; } // Throw to reach the code in the catch below throw new Error("Response is not ok"); }) ["catch"](function () { return cachesMatch(cacheUrl, CACHE_NAME); }); return resource } var url = new URL(event.request.url) url.hash = "" var pathname = url.pathname var urlString = url.toString() var cacheUrl = urlString var IS_KANO = /kano.guahao.cn/ var IS_STATIC = //static// var IS_HOME = /^/(e|u|n)/(d+)$/ var IS_EDITOR = /^/editor(?!.)/ var IS_PREVIEW = /^/preview(?!.)/ var CACHE_PREFIX = __wpo.name var CACHE_TAG = __wpo.version var CACHE_NAME = CACHE_PREFIX + ":" + CACHE_TAG var resource = undefined var isGET = event.request.method === "GET" // 以緩存優(yōu)先的形式緩存 kano 以及 static/* 靜態(tài)資源 if ((cacheUrl.match(IS_KANO) || pathname.match(IS_STATIC)) && isGET) { resource = cacheFirst(cacheUrl, CACHE_NAME) event.respondWith(resource) } // 以網(wǎng)絡(luò)優(yōu)先的形式緩存 editor頁(yè)面 preview頁(yè)面和 production頁(yè)面 if ((pathname.match(IS_HOME) || pathname.match(IS_EDITOR) || pathname.match(IS_PREVIEW)) && isGET) { resource = netWorkFirst(cacheUrl, CACHE_NAME) event.respondWith(resource) } })
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/94157.html
摘要:配合的項(xiàng),能夠?qū)崿F(xiàn)緩存外部資源的功能。允許接受來(lái)自的消息,默認(rèn)值為。檢查新版本的的更新信息。這也是我在研究階段直接使用時(shí)所發(fā)現(xiàn)的問(wèn)題。建議僅在生產(chǎn)模式內(nèi)使用。 showImg(https://segmentfault.com/img/bVSVG1?w=1178&h=484); 談起PWA,許多人可能還只停留在了解的層面,比較少在實(shí)踐中真正地嘗試過(guò),更多的僅僅是對(duì)著網(wǎng)上的教程和例子大概玩...
摘要:本篇不包含所有坑,暫時(shí)只記錄自己踩到的部分坑一安裝安裝最新版本安裝新增依賴(lài)這個(gè)在中,本身和它的是在同一個(gè)包中,中將兩個(gè)分開(kāi)管理。我記錄下自己更新這個(gè)的過(guò)程,以下前半部分可以直接跳過(guò)。以下記錄踩坑過(guò)程。 本篇不包含所有坑,暫時(shí)只記錄自己踩到的部分坑 一.安裝 安裝webpack4最新版本 npm install --save-dev webpack@4 安裝新增依賴(lài) webpack-c...
摘要:現(xiàn)在表示公開(kāi)支持。一旦安裝完成,如果注冊(cè)的沒(méi)有變化,則顯示為已激活的生命周期結(jié)束。一旦安裝這步完成,便會(huì)激活,并控制在其范圍內(nèi)的一切。目前還在草案狀態(tài),僅火狐和谷歌瀏覽器支持此特性。 PWA初探 什么是PWA PWA(Progressive Web Apps):漸進(jìn)式 Web app PWA 旨在增強(qiáng) Web 體驗(yàn),能讓用戶(hù)在訪問(wèn)一個(gè)web的時(shí)候感覺(jué)在使用app一樣。 PWA可以看作是...
摘要:和的關(guān)系不是一項(xiàng)技術(shù),也不是一個(gè)框架,我們可以把她理解為一種模式,一種通過(guò)應(yīng)用一些技術(shù)將在安全性能和體驗(yàn)等方面帶來(lái)漸進(jìn)式的提升的一種的模式。這里需要注意的是,首次注冊(cè)線(xiàn)程的頁(yè)面需要再次加載才會(huì)受其控制。 1. PWA和Service Worker的關(guān)系 PWA (Progressive Web Apps) 不是一項(xiàng)技術(shù),也不是一個(gè)框架,我們可以把她理解為一種模式,一種通過(guò)應(yīng)用一些技...
摘要:和的關(guān)系不是一項(xiàng)技術(shù),也不是一個(gè)框架,我們可以把她理解為一種模式,一種通過(guò)應(yīng)用一些技術(shù)將在安全性能和體驗(yàn)等方面帶來(lái)漸進(jìn)式的提升的一種的模式。這里需要注意的是,首次注冊(cè)線(xiàn)程的頁(yè)面需要再次加載才會(huì)受其控制。 1. PWA和Service Worker的關(guān)系 PWA (Progressive Web Apps) 不是一項(xiàng)技術(shù),也不是一個(gè)框架,我們可以把她理解為一種模式,一種通過(guò)應(yīng)用一些技...
閱讀 1017·2021-10-27 14:15
閱讀 2773·2021-10-25 09:45
閱讀 1938·2021-09-02 09:45
閱讀 3363·2019-08-30 15:55
閱讀 1806·2019-08-29 16:05
閱讀 3199·2019-08-28 18:13
閱讀 3112·2019-08-26 13:58
閱讀 448·2019-08-26 12:01