0

0

javascript中Service Workers是什么_如何创建离线应用?

夜晨

夜晨

发布时间:2026-01-13 20:21:08

|

395人浏览过

|

来源于php中文网

原创

Service Workers 是运行在浏览器后台的独立脚本,需手动实现缓存策略与请求拦截以支持离线访问;它不访问 DOM、无同步 API,生命周期由浏览器严格控制,注册后需显式更新并处理 install/fetch/activate 事件。

javascript中service workers是什么_如何创建离线应用?

Service Workers 是浏览器后台运行的脚本,能拦截网络请求、缓存资源、实现离线访问——但它不是“开箱即用”的离线开关,必须手动控制缓存策略和请求响应逻辑。

Service Worker 是什么?和普通 JS 脚本有何不同?

它是一个在 HTTPS(或 localhost)环境下注册的独立 JS 文件,运行在浏览器主线程之外,不访问 windowdocument 等 DOM 对象,也没有同步 API(如 XMLHttpRequest 同步模式、localStorage)。

关键差异点:

  • 生命周期由浏览器控制:安装(install)、激活(activate)、运行(fetch)阶段严格分离
  • 只能通过 navigator.serviceWorker.register() 注册,且注册路径必须是其所在目录的“作用域”前缀(例如注册脚本在 /sw.js,则作用域默认为 /
  • 首次注册后不会自动更新;新版本需等待旧版本所有页面关闭、触发 waiting → activating 流程才能生效

如何注册并监听 install / fetch 事件?

注册需在主页面 JS 中执行,且应检查兼容性;Service Worker 文件本身需导出事件监听器,不能直接执行逻辑。

立即学习Java免费学习笔记(深入)”;

主页面中注册示例:

AI小聚
AI小聚

一站式多功能AIGC创作平台,支持AI绘画、AI视频、AI聊天、AI音乐

下载
if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/sw.js')
      .then(reg => console.log('SW registered:', reg.scope))
      .catch(err => console.error('SW registration failed:', err));
  });
}

对应 sw.js 基础骨架:

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open('v1').then(cache => cache.addAll([
      '/',
      '/index.html',
      '/styles.css',
      '/app.js'
    ]))
  );
});

self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(response => {
      return response || fetch(event.request);
    })
  );
});

注意:event.waitUntil() 必须包裹异步操作,否则安装可能失败;caches.open() 返回 Promise,cache.addAll() 会逐个请求并缓存,任一失败则整个安装失败。

为什么页面仍无法离线访问?常见卡点在哪?

即使注册成功、安装完成,离线失败往往源于以下几类问题:

  • fetch 事件未覆盖动态资源(如 API 接口),只缓存了 HTML/CSS/JS,导致页面空白或功能异常
  • 缓存策略太激进:对带查询参数的请求(如 /api/data?id=123)未标准化 URL,导致每次都被当作新请求跳过缓存
  • 未处理 activate 阶段的旧缓存清理,多个版本缓存共存可能引发冲突
  • 开发时反复改 sw.js 但没跳过等待(skipWaiting()),新逻辑实际未激活
  • 使用了不支持 Cache API 的老旧浏览器(如 iOS Safari

建议在 activate 中主动清理旧缓存:

self.addEventListener('activate', event => {
  event.waitUntil(
    caches.keys().then(keys => {
      return Promise.all(keys
        .filter(key => key !== 'v1')
        .map(key => caches.delete(key))
      );
    })
  );
});

离线应用真正要解决的是“状态一致性”,不是“有没有缓存”

用户刷新页面看到旧 HTML,但 JS 已更新,或 API 返回 404 却渲染了半截数据——这类问题不会因 Service Worker 存在而自动消失。你需要明确:哪些资源必须离线可用(静态资产)、哪些可 fallback(API 请求降级为提示)、哪些需排队重试(表单提交)。这些逻辑都得自己写,Cache APIfetch 拦截只是工具

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1946

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2399

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

531

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.07.28

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.7万人学习

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

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