0

0

Service Worker能为网页应用带来什么变革【教程】

紅蓮之龍

紅蓮之龍

发布时间:2026-01-24 15:59:03

|

475人浏览过

|

来源于php中文网

原创

Service Worker的核心能力是拦截并重写fetch请求,需显式监听且仅对HTTPS生效;其缓存策略、生命周期管理及业务语义适配需手动设计,无开箱即用的“银弹”。

service worker能为网页应用带来什么变革【教程】

Service Worker 本身不是“魔法”,它带来的变革取决于你用它解决什么问题——离线能力、资源预缓存、后台同步、消息推送,这些功能都得自己写逻辑,不是注册一个脚本就自动生效。

Service Worker 能拦截并重写 fetch 请求

这是它最核心的能力:在页面发起 fetchXMLHttpRequest 时,SW 可以捕获请求、返回缓存、转发到网络、甚至合成响应。但要注意:

  • 只对 HTTPS 页面生效(localhost 是例外)
  • 必须用 self.addEventListener('fetch', ...) 显式监听,不写就不会拦截
  • 默认不处理 iframe 等导航类请求,除非显式匹配 request.destination === 'document'
  • 缓存策略要自己决定:是优先缓存(cache-first)、优先网络(network-first),还是 stale-while-revalidate?没有银弹

Cache API 不等于 localStorage,用错就白忙活

cache.put()cache.match() 操作的是 Cache 对象,和 localStorage 完全无关。常见误区:

蕉点AI
蕉点AI

AI电商商品图生成平台 | 智能商品素材制作工具

下载
  • cache.keys() 返回的是 Request 对象,不是字符串 URL,不能直接 console.log 出可读地址
  • 缓存键是完整 URL + method + headers,https://a.com/https://a.com/?t=1 是两个不同缓存项
  • 没调用 cache.delete()cache.addAll() 就更新 SW 版本,旧缓存会一直留着,新 SW 拿不到
  • cache.addAll() 遇到任一资源失败就会整体回滚,不适合混入不确定可用的第三方 URL

install / activate / fetch 三阶段生命周期容易误判状态

SW 不是“启动即运行”,它有明确的状态流转:

  • install 阶段里如果 event.waitUntil() 中的 Promise 拒绝,安装失败,SW 不会进入 waiting 状态
  • 新 SW 默认处于 waiting 状态,直到所有旧页面关闭或手动调用 skipWaiting(),否则不会 activate
  • activate 阶段适合清理旧缓存(用 cache.keys().then(keys => keys.forEach(...))),但此时 fetch 还没接管,别在这儿做网络请求
  • 页面刷新 ≠ 新 SW 立即生效;硬刷新(Ctrl+F5)会绕过磁盘缓存,但不强制跳过 SW,真正生效要看 activate 是否完成

真正难的不是注册 SW,而是设计缓存粒度、降级路径和版本迁移逻辑——比如一个 JSON 接口该不该缓存?缓存多久?失效后怎么通知页面重试?这些没法靠工具自动生成,得结合业务接口语义来判断。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

417

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

93

2023.09.25

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

67

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.5万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号