热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript事情道理(八):ServiceWorkers,生命周期和運用案例

您可以已曉得,漸進式Web運用(PWA)會愈來愈受歡迎,因為它們旨在使Web運用的用戶體驗越發流通,建立Native運用程序般的體驗,而不只是運轉在瀏覽器的運用。構建漸進式Web運

《Javascript事情道理(八):Service Workers,生命周期和運用案例》
您可以已曉得,漸進式Web運用(PWA)會愈來愈受歡迎,因為它們旨在使Web運用的用戶體驗越發流通,建立Native運用程序般的體驗,而不只是運轉在瀏覽器的運用。

構建漸進式Web運用程序的重要緣由之一是使運用在收集和加載方面異常牢靠 – 它應當可用於不確定或不存在的收集前提。

在這篇文章中,我們將深入探討Service Worker:他們怎樣運作以及應當注重的處所。末了,我們還列出了您應當應用的Service Workers的一些奇特上風。

概述

假如你想相識關於Service Workers的統統,你應當起首瀏覽本系列第幾篇文章。

基本上,Service Worker是一種收集工作者,更具體地說,它就像一個Shared Worker:

  • Service Worker在它自己的全局劇本高低文中運轉
  • 它沒有綁定到特定的網頁
  • 它沒法接見DOM

Service Worker API令人興奮的重要緣由之一是它可以讓你的收集運用程序支撐離線體驗,從而使開發人員可以完整掌握流程。

Service Worker 的生命周期

Service Worker生命周期與您的網頁是完整離開。它由以下幾個階段構成:

  • 下載
  • 裝置
  • 激活

下載

這是瀏覽器下載包括Service Worker的.js文件的時刻。

裝置

您的Web運用程序想要裝置Service Worker,您必須先註冊它,您可以在Javascript代碼中舉行註冊。當Service Worker被註冊時,它會提醒瀏覽器在背景啟動Service Worker裝置步驟。

經由歷程註冊Service Worker,你可以關照瀏覽器你的Service Worker的Javascript文件在那裡。我們來看下面的代碼:

if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('/sw.js').then(function(registration) {
// 註冊勝利
console.log('ServiceWorker registration successful');
}, function(err) {
// 註冊失利
console.log('ServiceWorker registration failed: ', err);
});
});
}

該代碼搜檢當前環境中是不是支撐Service Worker API。假如支撐,則註冊/sw.js Service Worker。

您可以在每次加載頁面時挪用register()要領而不必憂鬱 – 瀏覽器會推斷Service Worker是不是已註冊,而且會正確處置懲罰。

register()要領的一個重要細節是Service Worker文件的位置。在這類狀況下,您可以看到效勞工作者文件位於域的根目錄。這意味着Service Worker的局限將是全部泉源。換句話說,這個Service Worker將會收到這個域的一切東西的fetch事宜(我們將在背面議論)。假如我們在/example/sw.js註冊Service Worker文件,那末效勞工作者將只能看到URL以/example/(即/example/page1/,/example/page2/)開首的頁面的fetch事宜。

在裝置階段,最好加載和緩存一些靜態資本。資本勝利緩存后,Service Worker裝置完成。假如沒有勝利(加載失利) – Service Worker將重試。一旦裝置勝利,您將曉得靜態資本位於緩存中。
在裝置階段,最好加載和緩存一些靜態資本。資本勝利緩存后,Service Worker裝置完成。假如沒有勝利(加載失利) – Service將重試。一旦裝置勝利,您將曉得靜態資產位於緩存中。

假如註冊須要在加載事宜以後發作,這將回覆您的題目。這不是必須的,但它是相對引薦的。

為何如許?讓我們斟酌用戶第一次接見您的收集運用程序。如今還沒有Service Worker,瀏覽器沒法事前曉得是不是會有裝置的Service Worker。假如裝置了Service Worker,則瀏覽器須要為這個分外的線程消費分外的CPU和內存,不然瀏覽器將消費在襯着網頁上。

最重要的是,假如你只是在你的頁面上裝置一個Service Worker,你可以會有耽誤加載和襯着的風險 – 而不是儘快讓你的用戶可以運用這個頁面。

請注重,這僅在第一次接見頁面時才顯得重要。後續頁面接見不受Service Worker裝置的影響。一旦在第一次接見頁面時激活Service Worker,它可以處置懲罰加載/緩存事宜,以便隨後接見您的Web運用程序。這統統都是有原理的,因為它須要準備好處置懲罰有限的收集銜接。

激活

裝置Service Worker以後,下一步是將其激活。這一步是治理之前緩存的好機會。

一旦激活,Service Worker將最先掌握一切屬於其局限的頁面。一個風趣的事實是:初次註冊Service Worker的頁面將不會被掌握,直到該頁面再次被加載。一旦處於Service Worker掌握之下,它將處於以下狀況之一:

  • 它將處置懲罰從頁面發出收集請求或音訊時發作的fetch和message事宜
  • 它將被住手以節約內存

以下是生命周期的表面:
《Javascript事情道理(八):Service Workers,生命周期和運用案例》

在ervice Worker內部處置懲罰裝置

在頁面加快註冊歷程以後,讓我們看看Service Worker劇本中發作了什麼,它經由歷程向Service Worker實例增加事宜偵聽器來處置懲罰install事宜。

這些是install事宜處置懲罰時須要採用的步驟:

  • 翻開緩存
  • 緩存我們的文件
  • 確認是不是緩存了一切必須的資本

這是一個簡樸的install在Service Worker內:

var CACHE_NAME = 'my-web-app-cache';
var urlsToCache = [
'/',
'/styles/main.css',
'/scripts/app.js',
'/scripts/lib.js'
];
self.addEventListener('install', function(event) {
// event.waitUntil takes a promise to know how
// long the installation takes, and whether it
// succeeded or not.
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
console.log('Opened cache');
return cache.addAll(urlsToCache);
})
);
});

假如一切文件勝利被緩存,Service Worker會被裝置。假如任何文件下載失利,install步驟會失利。所以重要注重你須要緩存的文件。

處置懲罰install事宜是可選的,你可以防止處置懲罰它。在這類狀況下,上面三個步驟你都無需處置懲罰。

在運轉時緩存請求

這部份是關鍵地點。這裏您將看到怎樣阻攔請求並返回建立的緩存(並建立新緩存)。

裝置Service Worker而且用戶導航到另一個頁面或革新他地點的頁面后,Service Worker將收到fetch事宜。下面是一個演示怎樣返回緩存資本或實行新請求然後緩存效果的示例:

self.addEventListener('fetch', function(event) {
event.respondWith(
// This method looks at the request and
// finds any cached results from any of the
// caches that the Service Worker has created.
caches.match(event.request)
.then(function(response) {
// If a cache is hit, we can return thre response.
if (response) {
return response;
}
// Clone the request. A request is a stream and
// can only be consumed once. Since we are consuming this
// once by cache and once by the browser for fetch, we need
// to clone the request.
var fetchRequest = event.request.clone();

// A cache hasn't been hit so we need to perform a fetch,
// which makes a network request and returns the data if
// anything can be retrieved from the network.
return fetch(fetchRequest).then(
function(response) {
// Check if we received a valid response
if(!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
// Cloning the response since it's a stream as well.
// Because we want the browser to consume the response
// as well as the cache consuming the response, we need
// to clone it so we have two streams.
var respOnseToCache= response.clone();
caches.open(CACHE_NAME)
.then(function(cache) {
// Add the request to the cache for future queries.
cache.put(event.request, responseToCache);
});
return response;
}
);
})
);
});

簡而言之,這就是發作的歷程:

  • event.respondWith()將決議我們怎樣相應fetch事宜。我們傳遞了一個來自caches.match()的promise,它檢察請求並發現是不是有任何已建立的緩存的緩存效果。
  • 假如存在緩存,則返回效果。
  • 不然,將實行fetch事宜。
  • 搜檢狀況是不是為200。我們還搜檢相應範例是不是basic,這表明它是來自我們origin的請求。在這類狀況下,不會緩存對第三方資本的請求。
  • 相應效果被增加到緩存中。

要乞降相應必須被克隆,因為它們是流。流的主體只能被運用一次。而且因為我們想要運用它們,瀏覽器也要運用它們,所以必須克隆它們。

更新效勞工作者

當用戶接見您的Web運用程序時,瀏覽器會嘗試從新下載包括Service Worker代碼的.js文件。這發作在背景。

假如與當前Service Worker的文件比擬,如今下載的Service Worker文件中以至存在單字節差別,則瀏覽器將假定有轉變而且必須啟動新的Service Worker。

新的Service Worker將啟動而且install事宜將被觸發。然則,在這一點上,舊的Service Worker仍在掌握你的收集運用程序的頁面,這意味着新的Service Worker將進入waiting狀況。

一旦您的Web運用程序當前翻開的頁面封閉,舊的Service Worker將被瀏覽器住手,新裝置的Service Worker將完整掌握。這是當它的激活事宜將被觸發。

為何須要這些?為了防止兩個版本的Web運用程序同時運轉在差別的選項卡上 – 這在收集上實際上異常罕見,而且可以會建立異常蹩腳的毛病(比方,在瀏覽器中存儲數據時存在差別形式的狀況)。

從緩存中刪除數據

activate回調中最罕見的步驟是緩存治理。你如今要如許做,因為假如你在裝置步驟中刪除了一切舊的緩存,舊的Service Workers將倏忽住手供應緩存中的文件。

下面是一個示例,您可以從緩存中刪除某些未列入白名單的文件(在這類狀況下,其稱號中包括page-1或page-2):

self.addEventListener('activate', function(event) {
var cacheWhitelist = ['page-1', 'page-2'];
event.waitUntil(
// Retrieving all the keys from the cache.
caches.keys().then(function(cacheNames) {
return Promise.all(
// Looping through all the cached files.
cacheNames.map(function(cacheName) {
// If the file in the cache is not in the whitelist
// it should be deleted.
if (cacheWhitelist.indexOf(cacheName) === -1) {
return caches.delete(cacheName);
}
})
);
})
);
});

HTTPS請求

在構建Web運用程序時,您可以經由歷程當地主機運用Service Worker,然則一旦將其布置到臨盆環境中,則須要準備好HTTPS(這是您具有HTTPS的末了一個緣由)。

運用Service Worker,您可以挾制銜接並製造相應。 經由歷程不運用HTTPs,您的Web運用程序變得輕易遭到進擊。

為了讓事變更平安,您須要在經由歷程HTTPS供應的頁面上註冊Service Worker,以便您曉得瀏覽器吸收的Service Worker在經由歷程收集中未被修正。

瀏覽器支撐

效勞人員的瀏覽器支撐正在變得愈來愈好:
《Javascript事情道理(八):Service Workers,生命周期和運用案例》

Service Worker運用場景

Service Worker供應的一些奇特功用是:

  • 推送關照 – 許可用戶挑選從收集運用程序實時更新。
  • 背景同步 – 許可您推延操縱,直到用戶具有穩固的銜接。如許,您可以確保不管用戶想要發送什麼,實際上都邑發送。
  • 按期同步(未支撐) – 供應治理按期背景同步功用的API。
  • Geofencing(將來支撐) – 您可以定義參數,也稱為繚繞感興趣地區的地輿圍欄。當裝備逾越地輿圍欄時,Web運用程序會收到關照,這可以讓您依據用戶的地輿位置供應有效的體驗。

推荐阅读
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
author-avatar
c_陈可儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有