成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

pwa-之service worker 基本概念

olle / 2417人閱讀

摘要:是瀏覽器和服務(wù)器之間的腳本,主要作用是攔截請求,修改響應(yīng),以及一些其他的作用。這是出于安全因素的考慮。這個(gè)注冊的過程是發(fā)生在之外的。在安裝完成,激活之前,它不會(huì)攔截任何請求。將會(huì)始終攔截請求,重啟頁面也是為了這個(gè)。

pwa-之service worker 基本概念
pwa-之service worker 離線文件處理

學(xué)習(xí)service worker 基本概念

在本章,將涵蓋以下內(nèi)容

service worker準(zhǔn)備工作

注冊service worker

注冊service worker細(xì)節(jié)

調(diào)試

出現(xiàn)錯(cuò)誤時(shí)提供穩(wěn)定版本

創(chuàng)建mock響應(yīng)

處理請求超時(shí)

簡介

如果你是一個(gè)旅行愛好者,應(yīng)該會(huì)經(jīng)常陷入沒有網(wǎng)絡(luò)的情況。這是令人沮喪的。特別是你有事情的時(shí)候。

service worker是一個(gè)在==瀏覽器后臺(tái)==運(yùn)行的腳本。無論網(wǎng)絡(luò)連接如何,能夠使用Web應(yīng)用程序意味著用戶可以在飛機(jī),地鐵或連接受限或不可用的地方不間斷地操作。 該技術(shù)將有助于提高客戶端的工作效率,并將提高應(yīng)用程序的可用性。

通過service worker,我們可以預(yù)先緩存網(wǎng)站的某些資源。 我們作為資源引用的是JavaScript文件,CSS文件,圖像和一些字體。 這將有助于我們加快加載時(shí)間,而不必每次訪問同一網(wǎng)站時(shí)都必須從服務(wù)器獲取。 當(dāng)然,最重要的是,當(dāng)我們網(wǎng)絡(luò)不暢時(shí),這些資源將可供我們使用。

Service workers

service worker是瀏覽器和服務(wù)器之間的腳本,主要作用是攔截請求,修改響應(yīng),以及一些其他的作用。

網(wǎng)站可以正常工作的前提是能獲取到html,css,js等資源。在之前這些資源主要由瀏覽器管理,對于開發(fā)者而言是不可見的?,F(xiàn)在通過service worker我們可以掌控這些資源。當(dāng)然最終還是通過瀏覽器控制他們的。

掌握service worker的前提是掌握promise

Promise

Promise是用于處理異步操作的很好的方式,對于掌握service worker是至關(guān)重要的。

Promise功能很強(qiáng)大,我們不在這里細(xì)述了。我們只需要知道調(diào)用then()方法處理成功,catch方法處理錯(cuò)誤就可以了。

一個(gè)簡單的比較同步和異步操作的代碼

sync
    try {
        var value = Fn();
        console.log(value);
    } catch(err) {
        console.log(err);
    }
    
async
    Fn()
    .then(function(value) {
        console.log(value);
    })
    .catch(function(err) {
        console.log(err);
    });
service worker準(zhǔn)備工作

Service workers能夠運(yùn)行的前提是網(wǎng)站采用了https。這是出于安全因素的考慮。

現(xiàn)在主流瀏覽器都已經(jīng)支持service worker,不需要去多帶帶開啟了。

雖然service worker一定要在https的域名下面運(yùn)行,但是本地的http://localhost域名卻不影響,可以正常運(yùn)行。

注冊service worker

一個(gè)service worker如果要生效,必須要先注冊。這個(gè)注冊的過程是發(fā)生在service worker之外的。一般會(huì)在index.html中。你可以寫在js文件里面,在html文件中引入,但不能在service worker的js中注冊。

如何注冊

先創(chuàng)建一個(gè)html文件





    

Registration status:

在當(dāng)前文件夾下面創(chuàng)建一個(gè)==名字叫service-worker.js==的js文件

啟動(dòng)一個(gè)本地服務(wù)器,推薦使用anywhere,自帶了https

成功圖示

![image](http://wx2.sinaimg.cn/mw690/0...
)

程序如何運(yùn)行

首先判斷瀏覽器支持情況,如果不支持則做出提示。

我們使用了空js文件注冊了service worker。register的第二個(gè)參數(shù)的scope表示此service worker的作用范圍是當(dāng)前域名下面的根目錄。

如圖顯示:注冊成功。說明我們的瀏覽器是支持service worker的。

卸載service worker

通過調(diào)用unregister()方法卸載service worker

serviceWorker.unregister().then(function() {
    document.getElementById("status").innerHTML = "unregistered";
})
注冊service worker的詳細(xì)信息

了解service worker注冊過程中的詳細(xì)信息和事件有助于我們更好的掌控它。

注冊詳情

我們創(chuàng)建一個(gè)如下的html頁面




  
  Detailed Registration


  

Registration status:

State:

創(chuàng)建一個(gè)service-worker.js文件

self.addEventListener("install", function(e) {
  console.log("Install Event:", e);
});

self.addEventListener("activate", function(e) {
  console.log("Activate Event:", e);
});

然后頁面如下顯示

程序如何運(yùn)行

上面的代碼描述了service worker的3種狀態(tài)。當(dāng)程序處于active狀態(tài)的時(shí)候,我們就可以刷新頁面查看處于service worker控制之下的頁面了。

在service worker中我們注冊了兩個(gè)事件,installactivate,當(dāng)service worker第一次注冊的時(shí)候會(huì)被觸發(fā)。

install事件比較適合用來預(yù)加載數(shù)據(jù)和初始化緩存,activate事件適合用來清理舊版本的數(shù)據(jù)。

其他

當(dāng)一個(gè)service worker被成功注冊,它會(huì)經(jīng)歷以下狀態(tài)

Install

在service worker的生命周期中,如果service worker已經(jīng)注冊沒有錯(cuò)誤,但是尚未激活。那之前已經(jīng)激活的service worker就會(huì)仍然會(huì)控制著頁面。重新加載之后的service worker如果發(fā)生任何更改,就會(huì)重新安裝service worker。在安裝完成,激活之前,它不會(huì)攔截任何請求。

Activate

當(dāng)service worker被激活時(shí),它的狀態(tài)就是activate。service worker就可以攔截請求了。只有當(dāng)我們關(guān)閉網(wǎng)頁重新打開,或者強(qiáng)制刷新當(dāng)前頁面,才會(huì)被激活。一般安裝成功之后不會(huì)立即處于activate狀態(tài)。

Fetch

在當(dāng)前scope作用域下面的請求會(huì)觸發(fā)fetch事件

Terminate

這個(gè)事件可能會(huì)發(fā)生在任何時(shí)候,主要后果就是需要瀏覽器做service worker的內(nèi)存回收。之后根據(jù)需要重啟,但不是不會(huì)在觸發(fā)activate事件。

service worker將會(huì)始終攔截請求,重啟頁面也是為了這個(gè)。雖然這么說,但我們無法保證service worker任何時(shí)候都處于生效狀態(tài),所以在service worker中定義的全局狀態(tài)可能不會(huì)被保留。所以我們最好使用indexDB和localStorage來實(shí)現(xiàn)持久化。

調(diào)試

service worker在瀏覽器中多帶帶線程運(yùn)行,通過多帶帶的方式和頁面通信。但是和頁面是處于不同的作用域。這就意味著service worker無法訪問網(wǎng)頁的dom等其他信息。因此我們也無法通過
DevTools里面同一個(gè)tab來調(diào)試service worker。我們需要一個(gè)多帶帶的Tab來調(diào)試service worker線程。

在service worker中,它大部分的工作是在監(jiān)聽的事件中來完成的,比如在install事件中完成資源緩存。同樣我們可以在這里打斷點(diǎn)。

怎么做

下面來展示如何調(diào)試

在chrome中打開:chrome://inspect/#service-workers

或者在chrome中輸入:chrome://serviceworker-internals/ 如果列表里面沒有的話,說明沒有service worker正在運(yùn)行

在DevTools中的Source下面的service worker可以看到對應(yīng)的js腳本

在這里可以調(diào)試

同樣可以使用console.log。

chrome://serviceworker-internals/頁面中,可以看到每個(gè)service worker下面有幾個(gè)按鈕。

Terminated:注銷service worker

Start/Stop: 開啟/停止service worker

Sync: 給worker同步Sync事件

push: 給worker同步push事件

Inspect:在檢查器中打開worker

==即使勾選了Network中的disable cache,service worker依然會(huì)生效,如果需要每次都更新,需要勾選Application->service worker->offline==

發(fā)生錯(cuò)誤時(shí)提供穩(wěn)定版本

創(chuàng)建一個(gè)html文件




  
  Stale on Error


  

Registration status:

創(chuàng)建service-worker.js文件

var version = 1;
var cacheName = "stale-" + version;

self.addEventListener("install", function(event) {
    self.skipWaiting();
});

self.addEventListener("activate", function(event) {
    if (self.clients && clients.claim) {
        clients.claim();
    }
});

self.addEventListener("fetch", function(event) {
    // Always fetch response from the network
    event.respondWith(
        fetch(event.request).then(function(response) {
            return caches.open(cacheName).then(function(cache) {
                // If we received an error response
                if(response.status >= 500) {
                    return cache.match(event.request).then(function(response) {
                        // Return stale version from cache
                        return response;
                    }).catch(function() {
                        // No stale version in cache so return network response
                        return response;
                    });
                } else {
                    // Response was healthy so update cached version
                    cache.put(event.request, response.clone());
                    return response;
                }
            });
        })
    );
});

當(dāng)網(wǎng)絡(luò)中斷之后,頁面依然可以訪問。

創(chuàng)建mock響應(yīng)

我們可以模擬服務(wù)器,對客戶端進(jìn)行響應(yīng)。

創(chuàng)建index.html頁面




  
  Detailed Registration


  

Network status:

Mock Response

創(chuàng)建service-worker.js

self.addEventListener("fetch", function(event) {
  var requestUrl = new URL(event.request.url);

  if (requestUrl.pathname === "/urlshortener/v1/url" &&
      event.request.headers.has("X-Mock-Response")) {

    var response = {
      body: {
        kind: "urlshortener#url",
        id: "https://goo.gl/KqR3lJ",
        longUrl: "https://www.packtpub.com/books/info/packt/about"
      },
      init: {
        status: 200,
        statusText: "OK",
        headers: {
          "Content-Type": "application/json",
          "X-Mock-Response": "yes"
        }
      }
    };

    var mockResponse = new Response(JSON.stringify(response.body), response.init);

    console.log("Mock Response: ", response.body);
    event.respondWith(mockResponse);
  }
});

可以看到頁面顯示的是service worker里面我們配置的響應(yīng)

處理請求超時(shí)

請求超時(shí)有可能是網(wǎng)絡(luò)連接的問題,service worker是解決這類問題的理想方案。

創(chuàng)建html文件




  
  Request Timeouts


  

Registration status:

創(chuàng)建service-worker.js

function timeout(delay) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve(new Response("", {
                status: 408,
                statusText: "Request timed out."
            }));
        }, delay);
    });
}

self.addEventListener("install", function(event) {
    self.skipWaiting();
});

self.addEventListener("activate", function(event) {
    if (self.clients && clients.claim) {
        clients.claim();
    }
});

self.addEventListener("fetch", function(event) {
  if (/.js$/.test(event.request.url)) {
    event.respondWith(Promise.race([timeout(400), fetch(event.request.url)]));
  } else {
    event.respondWith(fetch(event.request));
  }
});

當(dāng)我們把jquery地址換成一個(gè)錯(cuò)誤的地址,我們看到一個(gè)408的響應(yīng)。

關(guān)注我的微信公眾號,更多優(yōu)質(zhì)文章定時(shí)推送

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/52870.html

相關(guān)文章

  • pwa-service worker 基本概念

    摘要:是瀏覽器和服務(wù)器之間的腳本,主要作用是攔截請求,修改響應(yīng),以及一些其他的作用。這是出于安全因素的考慮。這個(gè)注冊的過程是發(fā)生在之外的。在安裝完成,激活之前,它不會(huì)攔截任何請求。將會(huì)始終攔截請求,重啟頁面也是為了這個(gè)。 pwa-之service worker 基本概念pwa-之service worker 離線文件處理 學(xué)習(xí)service worker 基本概念 在本章,將涵蓋以下內(nèi)容 ...

    galaxy_robot 評論0 收藏0
  • 前端每周清單半年盤點(diǎn) PWA

    摘要:前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開發(fā)教程工程實(shí)踐深度閱讀開源項(xiàng)目巔峰人生等欄目。 前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn);分為新聞熱點(diǎn)、開發(fā)教程、工程實(shí)踐、深度閱讀、開源項(xiàng)目、巔峰人生等欄目。歡迎關(guān)注【前端之巔】微信公眾號(ID:frontshow),及時(shí)獲取前端每周清單;本文則是對于...

    崔曉明 評論0 收藏0
  • pwa-service worker 離線文件處理

    摘要:勾上刷新頁面,顯示如圖實(shí)現(xiàn)原理使用,預(yù)先緩存和。又請求已經(jīng)緩存好的。加載離線圖片創(chuàng)建創(chuàng)建創(chuàng)建訪問,然后打開。一定要訪問啊,不然不會(huì)成功多個(gè)事件調(diào)用事件和其他事件一樣都是可以注冊多次的。 pwa-之service worker 基本概念pwa-之service worker 離線文件處理 本章包含以下知識點(diǎn) 顯示離線頁面 加載離線圖片 加載離線css 多個(gè)fetch處理事件調(diào)用 簡介...

    fizz 評論0 收藏0
  • pwa-service worker 離線文件處理

    摘要:勾上刷新頁面,顯示如圖實(shí)現(xiàn)原理使用,預(yù)先緩存和。又請求已經(jīng)緩存好的。加載離線圖片創(chuàng)建創(chuàng)建創(chuàng)建訪問,然后打開。一定要訪問啊,不然不會(huì)成功多個(gè)事件調(diào)用事件和其他事件一樣都是可以注冊多次的。 pwa-之service worker 基本概念pwa-之service worker 離線文件處理 本章包含以下知識點(diǎn) 顯示離線頁面 加載離線圖片 加載離線css 多個(gè)fetch處理事件調(diào)用 簡介...

    mylxsw 評論0 收藏0
  • PWA學(xué)習(xí)與實(shí)踐】(3) 讓你的WebApp離線可用

    摘要:學(xué)習(xí)與實(shí)踐系列文章已整理至學(xué)習(xí)手冊,文字內(nèi)容已同步至。本文是學(xué)習(xí)與實(shí)踐系列的第三篇文章。引言其中一個(gè)令人著迷的能力就是離線可用。但是,如果你注意到文章開頭的圖片就會(huì)發(fā)現(xiàn),離線時(shí)我們不僅可以訪問,還可以使用搜索功能。 《PWA學(xué)習(xí)與實(shí)踐》系列文章已整理至gitbook - PWA學(xué)習(xí)手冊,文字內(nèi)容已同步至learning-pwa-ebook。轉(zhuǎn)載請注明作者與出處。 本文是《PWA學(xué)習(xí)與實(shí)...

    since1986 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<