首页 > 其他分享 >使用 ServiceWorker 提高性能

使用 ServiceWorker 提高性能

时间:2022-10-23 16:37:15浏览次数:91  
标签:缓存 console log service 性能 worker ServiceWorker 浏览器 提高

使用 ServiceWorker 提高性能_浏览器缓存

​service worker​​​ 是一种在独立的处理线程上执行后台任务的 worker,允许用户拦截网络请求并有条件地将其存储在称为 ​​CacheStorage API​​​ 的特殊缓存中,此类缓存不同于本地浏览器缓存,因为它允许在用户脱机的情况下从缓存中提供数据,还可以提高页面的性能。其工作原理建议阅读《​​ServiceWorker工作原理、生命周期和使用场景​​》

这在大多数情况下都是很有用的,例如,如果用户在一个 WIFI 连接不好的地区,Service worker 可以帮助解决这个问题,它可以先为用户提供已经看到的缓存内容,让用户有东西可看,而不是什么都没有。

注册 service worker

首先创建一个 ​​registerServiceWorker.js​​ 文件,用来维护注册 service worker ,并将其脚本引入 html 页面或者项目。

if ("serviceWorker" in navigator) {
window.addEventListener("load", () => {
navigator.serviceWorker
.register("/service-worker.js")
.then((reg) => console.log("Service worker has been registered."))
.catch((err) =>
console.error(`Error during service worker registration:${err}`)
);
});
} else {
console.log("Service worker is not supported by browser.");
}

​navigator​​ 是一个对象,它具有关于运行脚本的应用程序的属性和方法。回到文件  ​​registerServiceWorker.js​​ 并贴入一下代码:

const cacheName = "v1";
const cachedAssets = ["script.js", "index.html"];
self.addEventListener("install", (e) => {
e.waitUntil(
caches
.open(cacheName)
.then((cache) => cache.addAll(cachedAssets))
.then(() => self.skipWaiting())
);
});

需要将存储的资源存储在一个数组中,并向 ​​window​​ 对象添加 ​​install​​ 事件监听器。一旦触发该事件,将使用 ​​cacheName​​ 和数组中的资源创建一个新的缓存文件夹。之后,需要向窗口添加 ​​activate​​ 事件,以检查是否为最新的缓存版本。

self.addEventListener("activate", (e) => {
e.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cache) => {
if (cache !== cacheName) {
return caches.delete(cache);
}
})
);
})
);
});

最重要的部分是从缓存存储中加载数据,继续添加以下代码:

self.addEventListener("fetch", (e) => {
e.respondWith(fetch(e.request).catch(() => caches.match(e.request)));
});

上面的代码实现的功能是在窗口上添加 ​​fetch​​ 监听器,当这个事件被触发时,尝试通过使用 ​​fetch​​ API 发出网络请求来访问资源。在脱机的情况下,​​fetch​​API 不会返回任何数据,可以从缓存返回资源作为对原始请求的响应。为了控制用户脱机时发生的情况,需要一种介于本地和服务器之间的机制,允许缓存数据以便脱机查看。

在现代前端开发中,通常不需要自己的编写 ​​service worker​​ 的逻辑,对于复杂情况另说。下面是一个 VUE 项目中关于 ​​service worker​​ 的代码:

import { register } from "register-service-worker";

if (process.env.NODE_ENV === "production") {
register(`${process.env.BASE_URL}service-worker.js`, {
ready() {
console.log(
"App is being served from cache by a service worker.\n" +
"For more details, visit https://goo.gl/AFskqB"
);
},
registered() {
console.log("Service worker has been registered.");
},
cached() {
console.log("Content has been cached for offline use.");
},
updatefound() {
console.log("New content is downloading.");
},
updated() {
console.log("New content is available; please refresh.");
},
offline() {
console.log(
"No internet connection found. App is running in offline mode."
);
},
error(error) {
console.error("Error during service worker registration:", error);
},
});
}

关于 ​​service worker​​ 的应用,还可以用于实现 MOCK 服务 《​​MSW:可用于浏览器和测试的Mock服务​​​​》。

Mock Service Worker 是一个 API 模拟库,它使用 Service Worker API 来拦截实际请求。 —— MSW docs

可以存储多少数据

可以存储的数据量因浏览器和设备而异,要验证可用空间,可以使用配额管理 API ​​storageQuota​​。

navigator.storageQuota.queryInfo("temporary").then(function (info) {
console.log(info.quota);
});

当达到特定阈值时,一些浏览器会提示用户是否同意继续存储更多数据,一下是主流浏览器的触发阀值:

  • Firefox 存储 50MB 数据后
  • Safari 手机最多只能使用 50MB
  • Safari 桌面没有存储限制,但在存储 5MB 后开始请求确认。

测量性能

当从 ​​service worker​​ 缓存中检索资源时,可以获得比浏览器缓存更好的性能。这意味着可以通过降低浏览器开始绘制页面所需的时间来进一步加快用户的呈现性能。数据显示,当使用 ​​service worker​​ 来增强性能时,可以看到浏览器的缓存行为可用提高 ​​50%​​。大大减少了渲染时间,这并不意味着浏览器缓存已经死了。对于WEB应用仍然需要它,可以在不支持 ​​service worker​​ 的浏览器中使用它。即使在支持 ​​service worker​​ 的浏览器中,也可以配置 ​​fetch​​ 事件代码来忽略不想拦截的请求,这时请求就会落在浏览器缓存中。

总结

当涉及到渲染时,​​service worker​​​ 可以显著提高应用程序的性能,只能在使用 https 的情况下使用,可以在不需要SSL证书的本地主机上开发它们,但在生产环境中就需要SSL证书。​​service worker​​ 可以在缓存中存储内容,离线存储页面,在互联网连接不佳的情况下显示离线页面,还可以开发像移动应用程序一样快速且用户友好的渐进式 Web 应用程序 (PWA) ,如有兴趣可以参阅《​​如何 PWA 构建现代离线应用程序​​​​》。

标签:缓存,console,log,service,性能,worker,ServiceWorker,浏览器,提高
From: https://blog.51cto.com/devpoint/5787358

相关文章

  • PostgreSQL (慢SQL|数据库整体变慢|性能抖动) 数据库性能分析与优化方法
    背景本文将介绍三种数据库变慢场景的分析与优化方法.1、已经定位出的特定慢SQL2、整个数据库实例(几乎所有SQL)变慢,或者某些时候整个数据库实例大面积SQL变慢(大面积......
  • 性能测试-实操项目
    一、项目介绍——账号信息查询:我们注册的账号后需要查询下账号的注册信息接口URL:http://sky.nnzhp.cn/api/user/user_info 二、测试——使用jmeter  线程......
  • 软件性能测试的优势
    软件性能是对应于软件功能的一个非常重要的非功能特征,反映了软件系统对时效性和经济性的要求。性能测试是重要的软件测试类型之一,有助于确定应用程序在工作负载下的性能,比......
  • 华为云大数据BI直击客户痛点,提高企业综合竞争力
    华为云大数据BI直击客户痛点,提高企业综合竞争力​科技高速发展,数据已经渗入我们生活的方方面面,小到购买日常用品,大到制造、金融、通讯、交通等,每个行业都离不开海量数据。华......
  • postgresql/lightdb vacuum对性能的影响
    zjh@postgres=#createtablebig_table(idint,vtext);CREATETABLEzjh@postgres=#ALTERTABLEbig_tableSET(autovacuum_enabled=off);#关闭自动vacuumA......
  • 应用性能管理与链路追踪的关系
    应用性能管理APM(ApplicationPerformanceMonitoring)经常和分布式追踪同时出现,但两者却有着明显的差异。APM由来已久,已经有十几年的历史,自最早的以WebLogic为代表的J2EE应用......
  • 【Odoo】Odoo16-性能优化提升
    上海序说科技,专注于基于Odoo项目实施,实现企业数智化,助力企业成长。老韩头的开发日常,博客园分享(2022年前博文)10月12日,Odoo16版本正式发布,本文将就Odoo官方在性能方面做......
  • MySQL - 数据库配置参数、性能优化教程
     将 MySQL 部署到普通的 X86 服务器上,在不经过任何优化情况下,MySQL 理论值正常可以处理 2000 左右 QPS。不过当访问量达到 1500 左右并发连接时,数据库处理性能......
  • 不锈钢螺丝的性能标准,拉力/扭力/保证应力/屈服强度/材质等
    本页所讲的不锈钢螺丝的性能标准,不是指它的具体尺寸规定,如果你想查尺寸规标准,网上很多,我们的B2B在线商城里也描述的很全,性能标准指它的一些机械性能,这里主要包装括材质——......
  • 优化 WordPress 数据库,提高 WordPress 速度
    WordPress的机制是主要使用wp_posts表来存储所有数据,包括日志,页面,附件,导航菜单等等,所以WordPress使用了一定时间之后,数据量一大还是有点慢,除了对WordPress进行全方......