關於service worker,網絡上已經有了較多的文章。總的來講它依靠緩存資源,攔截http請求,來幫助咱們達到離線使用網站的效果。ajax
而angular cli爲了讓使用service worker更加便利,爲開發者提供了一個配置窗口(ngsw-config.json)和一個與service worker通信的服務(SwUpdate)。chrome
新建項目後在項目根目錄下鍵入ng add @angular/pwa
。npm
會爲你的項目添加一些文件,其中包括上文提到的 ngsw-config.json,爲了即刻感覺離線應用的魅力,現暫不需配置。
安裝http-server npm install http-server -g
json
將用http-server啓用的服務器來加載應用,這麼作是爲了模擬真實的生產環境,由於ng serve環境下沒法啓用service worker。
ng build --prod
進行打包。 打包完成後進入dist下的項目根目錄下,鍵入http-server -p <port>
將打包後的應用部署在http-server指定的端口上。以上並無手動配置ngsw-config.json,然而初始的配置還有許多不足,好比沒法攔截緩存api請求。所以須要對該文件的配置參數作一個大概瞭解(點擊瀏覽官方配置說明)。api
參考官方的說明,咱們瞭解到能夠配置靜態資源的緩存策略(配置項中的assetGroups)以及動態資源的緩存策略(配置項中的dataGroups)。瀏覽器
interface AssetGroup { name: string; installMode?: 'prefetch' | 'lazy'; updateMode?: 'prefetch' | 'lazy'; resources: { files?: string[]; /** @deprecated As of v6 `versionedFiles` and `files` options have the same behavior. Use `files` instead. */ versionedFiles?: string[]; urls?: string[]; }; }
這是該配置項的接口,下面對各個屬性作一個簡要的說明:緩存
installMode配置的是你的網站應用第一次在當前瀏覽器加載後,service worker應該進行的緩存策略。服務器
選擇'prefetch'會將resources列出的資源一古腦兒的預先緩存起來,無論當前是否有訪問到。選擇'lazy'則不會預先緩存,而是在用到時纔會進行緩存。
updateMode配置的是當檢測到資源的版本改變以後,所進行的資源緩存策略。網絡
如何得知資源的版本發生了變化呢?angular service worker會對比資源內容的hash值。若是hash值不一樣則版本不一樣。選擇'prefetch'會當即緩存更新的資源,選擇'lazy'會在用到時在進行緩存。不過,這裏要注意若是在installMode的配置中沒有選擇'lazy'模式,則這裏的'lazy'模式也不會生效。
export interface DataGroup { name: string; urls: string[]; version?: number; cacheConfig: { maxSize: number; maxAge: string; timeout?: string; strategy?: 'freshness' | 'performance'; }; }
這是緩存動態資源的配置項,其實就是緩存的ajax、fetch的response,將這些api請求的響應體進行緩存後,就能夠在離線狀態下使用。其中:框架
cacheConfig配置具體的緩存策略:
與service worker通信可讓咱們主動作不少事情,而不是僅僅依賴於ngsw-config.json配置,經過依賴注入一個SwUpdate*服務,咱們能夠主動要求查詢、更新、激活應用的版本,(這部份內容筆者還未投入應用,詳見官網描述)
這篇文章咱們分享瞭如何在angular裏面使用service worker 進行離線場景的加強,其中包括
相信從此angular框架可以在pwa應用方便給咱們更多的方便。