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

[翻译]Serviceworkers:PWA背地的好汉

原文地点:https:medium.freecodecamp.orgservice-workers-the-little-heroes-behind-progressive-web

原文地点:
https://medium.freecodecamp.org/service-workers-the-little-heroes-behind-progressive-web-apps-431cc22d0f16

作者:
Flavio Copes

择要:这篇文章简述service worker作为PWA中心手艺怎样完成资本缓存和音讯推送的功用,还协助读者明白service worker的生命周期。

Service worker是渐进式收集运用(Progressive Web Apps)的中心。它们协助我们完成原本是原生app才有资本缓存和音讯推送两大特征。

Service worker是你的网页与收集间的代办,它能够阻拦和缓存交游的收集要求。这能够协助你的运用制造一个离线环境下也能优越接见的用户体验。

起首引见一下web worker的观点。它是一个与指定网页相关联的JS文件,自力与主线程运转在一个特定的上下文环境中,如许就不会为了盘算数据去捐躯UI的机能,从而防止了壅塞的状况。而service worker是一种特别的web worker。

而恰是由于它是一个子线程,所以没法操纵DOM。一样也没法接见Local Storage API和XHR API。它只能经由过程Channel Messaging API和主线程通讯。

Service Worker能够与下面几个API协作:

  • Promises
  • Fetch API
  • Cache API

只要在HTTPS协定下的网页里它们才会起作用。(不过不包括当地的收集要求,由于它们不须要坚持平安衔接。如许也轻易我们调试。)

背景历程

Service worker能够自力于与它关联的运用顺序运转,并且在这些顺序处于非活泼状况下仍能够吸收音讯。

让我来举几个场景:

  • app处于背景非活泼状况下运转;
  • app被封闭;
  • 显现你网页的浏览器被封闭;

那末service worker将不受影响地继承事情。

Service worker的有效的处地点于:

  • 它们能够看成缓冲层,处置惩罚收集要求和缓存离线所需的资本;
  • 它们能够用来推送音讯。

Service worker只在须要的时刻运转,其他状况下都邑停止事情。

支撑离线

关于传统网页,离线状况下的用户体验异常蹩脚。假如用户没有联网,挪动端的web运用平常是直接停止事情。反观原生运用,会展现给用户一些友爱的提醒信息。

下面这张图是Chrome浏览器中离线网页显现的内容,明显这并不算是一个友爱的提醒信息:
《[翻译]Service workers:PWA背地的好汉》

或许唯一不错的处所是你能够经由过程点击恐龙来免费玩一个游戏,不过相信你很快就会变得不耐烦了。
《[翻译]Service workers:PWA背地的好汉》

不久之前,HTML5规范下的AppCache能够让web运用缓存离线资本,然则它缺少灵活性并且有一些令人困惑的行动,这也申明它没法胜任支撑离线这项事情。

而如今,service worker成了离线缓存的新规范。

那末,它完成哪些缓存呢?

装置时的预缓存

像图片、CSS文件和JS文件都邑在app的运用过程中反复用到。这些资本能够在app翻开的第一时间缓存好。

这也是所谓的APP壳架构( App Shell architecture)的基本。

缓存收集要求

我们运用Fetch API能够对效劳器返回的相应报文举行编辑,依据效劳器是不是可达来决议是不是运用缓存中的相应报文替代。

生命周期

一个service worker在启动前阅历了三步:

  • 注册(Registration)
  • 装置(Installation)
  • 激活(Activation)

注册

注册阶段是关照浏览器service worker的存在,并且在背景最先装置。

下面是写在worker.js中注册一个service worker的代码:

if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/worker.js')
.then((registration) => {
console.log('Service Worker registration completed with scope: ', registration.scope)
}, (err) => {
console.log('Service Worker registration failed', err)
})
})
} else {
console.log('Service Workers not supported')
}

不管这段代码被挪用多少次,浏览器一向只会在service worker之前没有注册过或是须要更新的状况下进入注册阶段。

Scope

register函数须要一个scope参数来指明你的web运用被该service worker治理的文件地点途径。

这个参数的默认值是一切文件以及service worker文件父级目次下的一切子文件夹。所以假如你把service worker文件放在根目次下,它会治理全部web运用。而假如在某个子文件夹中,它只会治理该途径能够接见的网页。

下面这个例子经由过程指定scope参数为/notifications/目次来注册一个service worker。

navigator.serviceWorker.register('/worker.js', {
scope: '/notifications/'
})

末端的/异常重要,能够防止/notification页面触发service worker。而假如写成下面如许:

{ scope: '/notifications' }

那末service worker就将一样作用于/notification页面。

注重:service worker没法控制本身地点目次之外的文件。也就是说,假如service worker文件被放在/notification文件夹下,它没法控制根目次/或其他不属于/notification的文件。

装置

假如浏览器发明一个service worker逾期或之前没有注册过,那末它将装置这个service worker。

self.addEventListener('install', (event) => {
//...
});

这是运用service worker初始化缓存,然后应用Cache API来缓存APP shell和静态资本的好时机。

激活

一旦service worker注册并装置胜利后 ,我们来到了第三阶段:激活。

这时候,service worker能够在加载新页面时最先事情。

它不能作用于激活前已加载过的页面,所以只要重启app或是革新已加载页面两种体式格局来使它事情。

self.addEventListener('activate', (event) => {
//...
});

监听这个事宜能够用来消灭旧缓存或者是删除新版service worker不须要的旧资本。

更新

你仅仅是修正一字节的文件就须要更新一次service worker。它会在注册的代码再次实行时被更新。

更新后的service worker只要在一切页面都被封闭后才最先替代之前的service worker事情。假如仅仅是革新页面是不会起作用的,由于之前的service worker依然在运转且没有被删除。

这类机制保证了更新不会让之前在运转的app或网页崩溃。

Fetch事宜

当浏览器发送收集要求时就会触发Fetch事宜。

我们借此能够在要求发送时搜检缓存中是不是已存储所需资本。

举个例子,下面的代码运用了Cache API来搜检要求的URL是不是已被缓存。假如是,那末返回缓存中的相应数据,不然会发送要求然后返回相应数据。

self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request)
.then((response) => {
if (response) {
//entry found in cache
return response
}
return fetch(event.request)
}
)
)
})
Background Sync

当用户在离线状况下发送收集要求时,Background Sync这个API将耽误该要求直到用户离开离线状况。

这保证了用户在离线状况下依然能够运用并操纵app,这些离线操纵会保存在行列中,以便在衔吸收集后向效劳端发出相应要求。(是不是是比展现一个无休止的loading图标要好多了?)

navigator.serviceWorker.ready.then((swRegistration) => {
//注册一个事宜event1
return swRegistration.sync.register('event1')
});

下面的代码是在service worker中监听这个事宜:

self.addEventListener('sync', (event) => {
if (event.tag == 'event1') {
event.waitUntil(doSomething())
}
})

doSomething()返回一个promise。假如返回的promise被拒,另一个同步事宜被自动地最先重试操纵,直到返回一个胜利状况的promise。

这也使得app能够在联网时马上更新效劳器发来的数据。

音讯推送

Service worker使得web运用能够像原生一样推送音讯给用户。

事实上,推送和音讯关照是两个差别的观点,它们组合而成的手艺才是我们熟习的音讯推送。推送机制使得效劳器能够向service worker发送信息,然后service worker将信息展现给用户才是音讯关照。

由于service worker能够在app封闭后继承运转,所以它们能够一向监听推送事宜。然后它们能够发送音讯关照,或者是更新app的状况。

推送事宜会在后端经由过程浏览器推送效劳后启动,比如说Firebase的推送效劳。

下面的代码演示了web worker怎样监听push事宜:

self.addEventListener('push', (event) => {
console.log('Received a push event', event)
const optiOns= {
title: 'I got a message for you!',
body: 'Here is the body of the message',
icon: '/img/icon-192x192.png',
tag: 'tag-for-this-notification',
}
event.waitUntil(
self.registration.showNotification(title, options)
)
})
关于console.log

假如你的代码中包括console.log或是其他相似的控制台输出语句,务必翻开Chrome开发工具中的Preserve log功用。

不然的话,由于service worker在网页加载前就最先实行,而此时控制台会被清空,所以你没法看到任何日记输出。

作者总结

异常感谢浏览本篇教程,事实上,关于PWA另有许多要进修的学问。假如您有什么看法迎接在下面批评。

译者注:主流浏览器最先逐步支撑service worker,今后PWA是不是会真的与原生势均力敌呢?将来怎样,我想如今多相识一点PWA的学问总不会坏事。

项目地点:
https://github.com/WhiteYin/translation


推荐阅读
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 【MEGA DEAL】Ruby on Rails编码训练营(97%折扣)限时特惠!
    本文介绍了JCG Deals商店提供的Ruby on Rails编码训练营的超值优惠活动,现在只需29美元即可获得,原价为$1,296。Ruby on Rails是一种用于Web开发的编程语言,即使没有编程或网页设计经验,也能在几分钟内构建专业的网站。该训练营共有6门课程,包括使用Ruby on Rails进行BDD的课程,使用RSpec 3和Capybara等。限时特惠,机会难得,赶快行动吧! ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
author-avatar
淘宝秀2010_958
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有