首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Workbox运行时缓存不能与带查询参数的url一起工作?

基础概念

Workbox 是一个用于简化渐进式Web应用(PWA)中Service Worker开发的库。它提供了一套工具和策略,帮助开发者实现离线优先的应用体验。Workbox 的运行时缓存(Runtime Caching)允许你在Service Worker中动态地缓存和检索资源。

问题描述

Workbox 运行时缓存不能与带查询参数的URL一起工作。

原因

Workbox 的默认行为是基于URL进行缓存匹配的,而带查询参数的URL会导致每次请求的URL都不同,即使资源内容相同,也会被视为不同的请求,从而无法正确地从缓存中获取资源。

解决方法

1. 使用 urlPatternhandler

你可以使用 urlPatternhandler 来精确控制哪些URL需要缓存,以及如何处理这些请求。

代码语言:txt
复制
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';

registerRoute(
  ({ url }) => url.pathname.startsWith('/api/'),
  new StaleWhileRevalidate({
    cacheName: 'api-cache',
  })
);

在这个例子中,我们只缓存以 /api/ 开头的URL,并且使用 StaleWhileRevalidate 策略。

2. 使用 CacheKeyGenerator

你可以自定义 CacheKeyGenerator 来生成唯一的缓存键,即使URL带有查询参数。

代码语言:txt
复制
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'work.js';

class QueryParamCacheKeyGenerator {
  generateKey(request) {
    const url = new URL(request.url);
    url.search = '';
    return url.toString();
  }
}

const cacheKeyGenerator = new QueryParamCacheKeyGenerator();

registerRoute(
  ({ request }) => request.destination === 'script',
  new StaleWhileRevalidate({
    cacheName: 'scripts',
    cacheKeyGenerator: cacheKeyGenerator,
  })
);

在这个例子中,我们移除了URL中的查询参数,生成了一个唯一的缓存键。

3. 使用 NetworkFirst 策略

如果你希望优先从网络获取资源,然后再使用缓存,可以使用 NetworkFirst 策略。

代码语言:txt
复制
import { registerRoute } from 'workbox-routing';
import { NetworkFirst } from 'workbox-strategies';

registerRoute(
  ({ url }) => url.pathname.startsWith('/api/'),
  new NetworkFirst({
    cacheName: 'api-cache',
  })
);

应用场景

  • API请求:对于需要频繁更新的数据,使用 NetworkFirst 策略可以确保获取最新的数据。
  • 静态资源:对于不经常变化的资源,可以使用 StaleWhileRevalidate 策略来提高加载速度。

参考链接

通过以上方法,你可以有效地解决Workbox运行时缓存不能与带查询参数的URL一起工作的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Workbox5+Webpack4构建离线应用

service worker缓存优缺点: 优点: 非侵入式缓存 缓存内容开发者完全可控 持续性缓存 独立于主线程之外,堵塞进程 缺点: 权限太大,能拦截所有fetch请求,需要控制一下 发版更新处理比较麻烦...详细介绍请查阅官方文档 配置 Workbox可以修改缓存名称,可以用setCacheNameDetails设置预缓存运行时缓存名称,还可以通过workbox.core.cacheNames.precache...,第一个参数是一个正则表达式,用来匹配路径,第二个参数是对匹配路径进行处理函数,可以用workbox封装缓存策略处理函数,也可以自定义,上述示例就是使用workbox内部封装CacheFirst...如果第二个参数使用自定义函数,那么这个函数有三个默认参数,示例如下: import {registerRoute} from 'workbox-routing'; const handler = async...只简单应用运行时缓存功能 不适用: 需要使用service worker 其他功能场景,如push等 需要在service worker中导入其他脚本或添加其他逻辑 具体配置文件可查阅官方文档

1.2K10
  • Service Worker:让你 Web 应用牛逼起来

    他基于h5web worker,所以绝对不会阻碍当前js线程执行,sw最重要工作原理就是 1、后台线程:独立于当前网页线程; 2、网络代理:在网页发起请求时代理,来缓存文件; 兼容性 ?...var shouldRespond; // 对url进行一些处理,移除一些不必要参数 var url = stripIgnoredUrlParameters...precache对应是在installing阶段进行读取缓存操作。它让开发人员可以确定缓存文件时间和长度,以及在不进入网络情况下将其提供给浏览器,这意味着它可以用于创建Web离线工作应用。...工作原理 首次加载Web应用程序时,workbox会下载指定资源,并存储具体内容和相关修订信息在indexedDB中。...runtimecache 运行时缓存是在install之后,activated和fetch阶段做事情。

    2.3K50

    PWA 实践应用(Google Workbox

    一起使用 Service Worker 和 CacheStorage API 时,可以控制网站上使用资源(HTML、CSS、JS、图像等)如何从网络或缓存中请求,甚至允许在离线时返回缓存内容。...Workbox 主要特性之一是它路由和缓存策略模块。 路由和缓存策略 Workbox 允许使用不同缓存策略来管理 HTTP 请求缓存。...预缓存 除了在发出请求时进行缓存运行时缓存)之外,Workbox 还支持预缓存,即在安装 Service Worker 时缓存资源。...有许多资源是非常适合预缓存:Web 应用程序起始 URL、离线回退页面以及关键 JavaScript 和 CSS 文件。...离线回退 让 Web 应用在离线工作时感觉更健壮常见模式是提供一个后退页面,而不是显示浏览器默认错误页面。通过 Workbox 路由和预缓存,你可以在几行代码中设置这个模式。

    1.5K40

    PWA 实践应用(Google Workbox

    一起使用 Service Worker 和 CacheStorage API 时,可以控制网站上使用资源(HTML、CSS、JS、图像等)如何从网络或缓存中请求,甚至允许在离线时返回缓存内容。...Workbox 主要特性之一是它路由和缓存策略模块。 路由和缓存策略 Workbox 允许使用不同缓存策略来管理 HTTP 请求缓存。...预缓存 除了在发出请求时进行缓存运行时缓存)之外,Workbox 还支持预缓存,即在安装 Service Worker 时缓存资源。...有许多资源是非常适合预缓存:Web 应用程序起始 URL、离线回退页面以及关键 JavaScript 和 CSS 文件。...离线回退 让 Web 应用在离线工作时感觉更健壮常见模式是提供一个后退页面,而不是显示浏览器默认错误页面。通过 Workbox 路由和预缓存,你可以在几行代码中设置这个模式。

    44110

    【腾讯云前端性能优化大赛】前端首屏性能优化

    我们资源总是在更新,所以我们没必要让用户每次访问都重新去拉取一遍资源,我们可以让这些资源缓存在用户本地,等待用户再次访问时候,可以直接拿出来用。从本地读取肯定是要比网络请求快。...// registerRoute 是最重要方法,用来拦截请求,第一个参数可以是正则也可以是一个函数 // 是正则的话,当请求URL匹配时候,就会对这个请求执行对应得 CacheHandler registerRoute...:这个策略工作路线如下图,它会优先从缓存中读取数据,同时每次请求也会在后台去服务器请求来更新数据。...image-20211227184911526.png Cache First:这个策略工作路线如下图,它同样优先去读取缓存内容,但是如果能读到,就不会发起网络请求,只有在读不到缓存时候,才会发起网络请求...因为CacheFirst策略在有缓存时候会始终读取缓存,虽然这里存是不常变化内容,但是我们仍然希望无限增加缓存内容并且无限期保留缓存,这个插件就可以很好帮我们实现这些功能。

    1.6K41

    【腾讯云前端性能优化大赛】前端性能和加载体验优化实践(附:PWA、离线包、内存优化、预渲染)

    一起使用 Service Worker 和 CacheStorage API 时,可以控制网站上使用资源(HTML、CSS、JS、图像等)如何从网络或缓存中请求,甚至允许在离线时返回缓存内容。...Workbox 主要特性之一是它路由和缓存策略模块。 路由和缓存策略 Workbox 允许使用不同缓存策略来管理 HTTP 请求缓存。...预缓存 除了在发出请求时进行缓存运行时缓存)之外,Workbox 还支持预缓存,即在安装 Service Worker 时缓存资源。...离线回退 让 Web 应用在离线工作时感觉更健壮常见模式是提供一个后退页面,而不是显示浏览器默认错误页面。通过 Workbox 路由和预缓存,你可以在几行代码中设置这个模式。...JavaScript 对内存占用受代码影响,如果在运行时缓存和计算大量数据、处理巨量字符串等耗费空间行为,那么内存就会极速飙升,极端情况下会导致承载网页应用闪退。

    2.7K121

    前端性能和加载体验优化实践

    一起使用 Service Worker 和 CacheStorage API 时,可以控制网站上使用资源(HTML、CSS、JS、图像等)如何从网络或缓存中请求,甚至允许在离线时返回缓存内容。...Workbox 主要特性之一是它路由和缓存策略模块。 路由和缓存策略 Workbox 允许使用不同缓存策略来管理 HTTP 请求缓存。...首先确定正在处理请求是否符合条件,如果符合,则对其应用缓存策略。匹配是通过返回真值回调函数进行缓存策略可以是 Workbox 一种预定义策略,也可以创建自己策略。...解决办法是拉上后端一起梳理下哪些数据才是首屏所需要,用一个接口把首屏数据输送给前端。 5....JavaScript 对内存占用受代码影响,如果在运行时缓存和计算大量数据、处理巨量字符串等耗费空间行为,那么内存就会极速飙升,极端情况下会导致承载网页应用闪退。

    1.5K20

    为 vue 项目添加 PWA 支持

    支持 运行时缓存runtimeCaching,Workbox 强大所在,阅读这些内容会使你更好地了解如何配置以及具体能做什么: Workbox Routing Workbox Strategies...SW 在接管页面,新 SW 仍旧是 waiting 状态 想要实现在结束 session 情况下更新 SW,必须使用 skipWaiting,目前有两种常见处理方法 注:以下方法中提到registerServiceWorker.js...之类运行时操作行为而用户又没有刷新页面,就有可能会出现问题 即除非你能保证同一个页面在两个版本 SW 相继处理情况下依然能够正常工作,否则不要使用这个方法 方法二:等待用户同意再 skipWaiting...(好下面我就开始云了) 我们需要在workboxOptions中将skipWaiting设置为false,或者设置,因为默认值为false 此处,官方文档中提到,当skipWaiting为false...Workbox 放置在项目内,并配置workboxOptions中importWorkboxFrom为disable,然后在importScripts中指定本地workbox-sw.js路径 接着在

    3.7K00

    WorkBox 之底层逻辑Service Worker

    前言 在前几天师夷长技以制夷:跟着PS学前端技术文件中,我们提到了WorkBox,然后自己也对这块很感兴趣,所以就利用业余时间进行相关资源查询学习和实践。...预缓存运行时缓存 Service worker与Cache实例之间交互涉及两个不同缓存概念: 「预缓存」(Precaching caching) 「运行时缓存」(Runtime caching)...运行时缓存是指在运行时从网络请求资源时应用缓存策略。这种类型缓存非常有用,因为它保证了用户已经访问过页面和资源离线访问。...在我们主JavaScript文件中,使用Worker构造函数创建一个新Worker对象。此构造函数接受一个参数,即我们在第1步中创建JavaScript文件URL。...,或者在用户会话持续很长时间任何情况下,手动更新可能不是必要

    39920

    ServiceWorker工作机制与生命周期:资源缓存与协作通信处理

    Service Worker 他基于h5web worker,所以绝对不会阻碍当前js线程执行,sw最重要工作原理就是 后台线程:独立于当前网页线程; 网络代理:在网页发起请求时代理,来缓存文件—...如果注册成功,service worker就会被下载到客户端并尝试安装或激活(见下文),这将作用于整个域内用户可访问URL,或者其特定子集。...self.skipWaiting();     // Perform install steps     //首先 event.waitUntil 你可以理解为 new Promise,     //它接受实际参数只能是一个...流程如下: 首先老sw为A,新sw版本为B。 B进入install阶段,而A还处于工作状态,所以B进入waiting阶段。只有等到A被terminated后,B才能正常替换A工作。...workbox缓存策略  workbox.strategies,有如下属性:staleWhileRevalidate networkFirst cacheFirst networkOnly cacheOnly

    1.5K20

    前端“秀肌肉”,云端 Photoshop 亮相

    工作内容还可跨设备实现无缝衔接。 通过链接形式共享工作流程。Photoshop 文档可以通过 URL 访问,而不再隐藏于文件系统之内。如此一来,创作者可以轻松将链接发送给其他协作伙伴。...作为运行时,Web 抽象掉了底层操作系统,使得 Photoshop 能够覆盖用户手中多种不同平台。...这种本地高性能文件系统,让 Photoshop 具备了在浏览器端严格处理文件工作流程能力。...在首次访问之后,后续加载往往非常快(以 M1 Macbook 平台为例): Adobe 还使用 Workbox 库,轻松将 Service Worker 缓存集成至整个构建过程当中。...Chrome DevTool 能够分析 WASM 代码、设置断点并检查各种变量,由此体现 JavaScript 自身可调试性优势: 将设备上机器学习功能与 TensorFlow.js 相集成 Web

    24810

    不只是离线缓存! - 论如何善用ServiceWorker

    SW可以完全脱离PWA存在,当然,PWA可离不开SW :) And WorkBox ? WorkBox是谷歌开发一款基于SW缓存控制器,其主要目的是方便维护PWA。...同时,WorkBox只能简单缓存数据,并不能做到拦截篡改请求功能,尤其不能精准把握每一个资源缓存情况,自定义程度并不高。...fetch只能传递Requset对象,而Requset对象有两个参数(url,[option]),第一个参数是网址,第二个参数为Request内容,例如body或header。...,它就立刻把Response丢给了下一个管道函数,而此时status正确,abort打断了包括这一个fetch所有请求,fetch就直接工作不正常。...此时如果fetch失败将直接报错,写入缓存。 在下一次获取同一个URL时候,缓存匹配到将不再是空白值,此时fetch执行,直接返回缓存,大大提升了速度。

    3.5K21

    从 PageRank Example 谈 Spark 应用程序调优

    相同资源和参数下分别使用默认MEMORY_ONLY和压缩MEMORY_ONLY_SER测试3次迭代性能,下图是使用默认MEMORY_ONLY方式缓存时,links在内存中大小,可以看到links...改用压缩MEMORY_ONLY_SER缓存方式后,links缓存后只占用了861.8M内存,仅为之前6.6G12%。...使用压缩MEMORY_ONLY_SER缓存方式时,如下图所示,links仅占用549.5M,相比为String类型时861.8M,也缩小了近一半。...分别测试runV3和runV5版本,迭代3次,在没有数据倾斜情况下,相同数据、资源和参数下runV3运行时间306s,runV5运行时间311s,但是在有数据倾斜情况下,相同数据、资源和参数下runV3...原始测试数据(使用压缩MEMORY_ONLY_SER缓存方式)情况如下表: 磁盘中大小 links缓存大小 分区数 1.5G 549.5M 20 运行3次迭代,一开始大概估计使用如下资源,使用5个

    3.3K41

    从 PageRank Example 谈 Spark 应用程序调优

    相同资源和参数下分别使用默认MEMORY_ONLY和压缩MEMORY_ONLY_SER测试3次迭代性能,下图是使用默认MEMORY_ONLY方式缓存时,links在内存中大小,可以看到links...改用压缩MEMORY_ONLY_SER缓存方式后,links缓存后只占用了861.8M内存,仅为之前6.6G12%。 ?...使用压缩MEMORY_ONLY_SER缓存方式时,如下图所示,links仅占用549.5M,相比为String类型时861.8M,也缩小了近一半。...分别测试runV3和runV5版本,迭代3次,在没有数据倾斜情况下,相同数据、资源和参数下runV3运行时间306s,runV5运行时间311s,但是在有数据倾斜情况下,相同数据、资源和参数下runV3...原始测试数据(使用压缩MEMORY_ONLY_SER缓存方式)情况如下表: 磁盘中大小 links缓存大小 分区数 1.5G 549.5M 20 运行3次迭代,一开始大概估计使用如下资源,使用5个

    33840

    从 PageRank Example 谈 Spark 应用程序调优

    相同资源和参数下分别使用默认MEMORY_ONLY和压缩MEMORY_ONLY_SER测试3次迭代性能,下图是使用默认MEMORY_ONLY方式缓存时,links在内存中大小,可以看到links...改用压缩MEMORY_ONLY_SER缓存方式后,links缓存后只占用了861.8M内存,仅为之前6.6G12%。 ?...使用压缩MEMORY_ONLY_SER缓存方式时,如下图所示,links仅占用549.5M,相比为String类型时861.8M,也缩小了近一半。...分别测试runV3和runV5版本,迭代3次,在没有数据倾斜情况下,相同数据、资源和参数下runV3运行时间306s,runV5运行时间311s,但是在有数据倾斜情况下,相同数据、资源和参数下runV3...原始测试数据(使用压缩MEMORY_ONLY_SER缓存方式)情况如下表: 磁盘中大小 links缓存大小 分区数 1.5G 549.5M 20 运行3次迭代,一开始大概估计使用如下资源,使用5个

    39020

    在“小程序”PWA上开发WebRTC

    这与“普通”书签工作方式不同,即你在书签上任何页面URL都是你获得URL。即使用户从一篇文章中添加它,也允许CNN PWA始终从根路经开始加载。...它存在于自己线程中,独立于代码执行和运行时环境中其他网络应用程序,甚至可以在网页未打开时运行代码。这是你编写缓存策略并设置推送通知地方。...服务工作线程只能缓存它所在同一文件夹中或者是子文件夹下资源。为了获得最大缓存能力,我建议尽可能地将其放置在根目录中。 务必注意,服务工作线程运行时生命周期与网络应用程序其余部分完全分离。...上面所提到Workbox库已经建立了解决这个问题方式,并确保在应用程序更改时重新生成有有效缓存。 推送通知 我也特别想提一提推送通知。...应用 应用程序选项卡是一个你可以在其中找到制作应用程序部分概述地方。它会读取你应用程序清单,并为缺少工作部分提供提示和线索。

    1.2K10

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券