赞
踩
在2014年的时候,标注居委会就提出了Service Worker的概念,它主要是在页面与网络之间增加拦截器,用来缓存和拦截请求,它也作为PWA来试着解决离线存储和消息推送的问题。对于Service Worker的主要功能也是去拦截请求和缓存资源,这样使得用户在离线环境中,也可以使用网络应用。或者直接在本地中去读取缓存资源,从而加快访问速度。
为了避免JavaScript过多占用主线程时长的情况,浏览器实现了Web Worker功能,并将Web Worker运行在页面的主线程之外,由于Web Worker是在页面的主线程之外所以是没有办法操作Dom的,它可以运行一些其他脚本,并通过postMessage的将执行的结果返回给主线程,另外Web Worker在进行Js脚本执行时,并不能将执行结果保存下来,如果下次同样的操作,则会再进行执行脚本,所以Service Worker需要在Web Worker的基础上在进行加入存储功能来进行保存执行的结果值。
对于安全来讲,因为HTTP是采用明文来进行传输的,存在被监听篡改和劫持的风险,所以在Service Worker中只支持采用Https协议,防止通信数据被拦截与破解,当然Service Worder还需要同时支持Web页面的默认安全策略,比如说同源策略,SCP(本质是建立白名单,告诉外界哪些资源可用)等等。
对于Service Worker我们需要将其对应的脚本在浏览器中进行注册后使用。下面为注册所对应的代码:
// 判断浏览器是否支持serviceWorker
if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker.register('/service-worker.js').then(() => {
console.info('注册成功')
}).catch(() => {
console.info('注册失败')
});
});
}
当注册完成后,会执行安装对应路径的Service Worker脚本并触发install
事件,我们可以在Service Worder脚本文件中进行监听此事件并执行相应的回调函数。
self.addEventListener('install', event => {
console.log('安装成功')
})
下面我们将实现一个替换全局图片的功能,将全局请求的图片全部换成对应固定的图片。此例中我们将全局中后缀为.png的图片全部替换为3.png,如图所示:
我们1.png与2.png所对应的图片是两朵不一样的花,在此我们可以通过sw.js去将所有以png为后缀的图片,全部替换为一种图片,代码如下:
// 监听网络发起请求所对应的事件
self.addEventListener('fetch', function (event) {
if (/\.png$/.test(event.request.url)) {
event.respondWith(fetch('/images/3.png'));
}
});
效果图:
由此我们可以看出,对应的图片引用路径不同,但是返回的结果图片都是我们所定义的3.png。
这是通过sw实现的对应的小demo,那么由此可见,我们更可以通过将所缓存的图片转换为base64去存储进IndexDB,通过sw脚本去匹配对应的图片文件并返回来实现进一步的缓存,这里indexDB进行存储图片并返回等操作在这里不多赘述了,感兴趣的小伙伴可以自己实现一下~。
个人认为Service Worker为我们提供了一些渠道,我们可以对我们的网页进行脑洞大开的操作。Service Worker是PWA的关键,但对于PWA的应用,目前还是不太成熟,传统应用的Web应用要想实现完成的Native App应用目前还是巨大的挑战,虽然PWA技术已经被W3C列为标准,但是safrai不支持mainfest以及Service Worker这两项关键技术,而且国内各版本手机浏览器对Service Worker的支持度都不太相同,所以尽量还是只能做一些缓存还是比较稳定一些的。好啦,今天的分享到此结束啦~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。