CHROME扩展开发之·使 Service Worker 保持活跃状态

根据定义,Service Worker 由事件驱动,在闲置时终止。这样,Chrome 就可以优化扩展程序的性能和内存消耗。如需了解详情,请参阅我们的 Service Worker 生命周期文档。特殊情况可能需要采取额外的措施来确保 Service Worker 延长的活跃时间。

在长时间运行的操作完成之前使 Service Worker 保持活跃状态

在长时间运行的 Service Worker 操作(不调用扩展 API)期间,Service Worker 可能会在操作过程中关闭。例如:

  • fetch() 请求的用时可能会超过 5 分钟(例如,网络连接状况不佳的情况下下载大量内容)。
  • 复杂的异步计算需要超过 30 秒。

在这些情况下,要延长 Service Worker 的生命周期,您可以定期调用一个普通的扩展 API 来重置超时计数器。请注意,这仅适用于特殊情况,在大多数情况下,通常有一种更好的平台惯用方式可以实现相同的结果。

以下示例展示了一个 waitUntil() 辅助函数,该函数会在给定 promise 解析之前使 Service Worker 保持活跃状态:

javascript 复制代码
async function waitUntil(promise) = {
  const keepAlive = setInterval(chrome.runtime.getPlatformInfo, 25 * 1000);
  try {
    await promise;
  } finally {
    clearInterval(keepAlive);
  }
}

waitUntil(someExpensiveCalculation());

使 Service Worker 连续保持活跃状态

在极少数情况下,您需要无限期延长生命周期。我们已将企业和教育机构视为最大的用例,并明确允许此类用例,但总体上不支持此功能。在这些特殊情况下,可以通过定期调用普通扩展 API 来使 Service Worker 保持活跃状态。请务必注意,此建议仅适用于在企业或教育用例的受管理设备上运行的扩展程序。在其他情况下则不允许。Chrome 扩展程序团队保留对此类扩展程序采取措施的权利。

使用以下代码段使 Service Worker 保持活跃状态:

javascript 复制代码
/**
 * Tracks when a service worker was last alive and extends the service worker
 * lifetime by writing the current time to extension storage every 20 seconds.
 * You should still prepare for unexpected termination - for example, if the
 * extension process crashes or your extension is manually stopped at
 * chrome://serviceworker-internals. 
 */
let heartbeatInterval;

async function runHeartbeat() {
  await chrome.storage.local.set({ 'last-heartbeat': new Date().getTime() });
}

/**
 * Starts the heartbeat interval which keeps the service worker alive. Call
 * this sparingly when you are doing work which requires persistence, and call
 * stopHeartbeat once that work is complete.
 */
async function startHeartbeat() {
  // Run the heartbeat once at service worker startup.
  runHeartbeat().then(() => {
    // Then again every 20 seconds.
    heartbeatInterval = setInterval(runHeartbeat, 20 * 1000);
  });
}

async function stopHeartbeat() {
  clearInterval(heartbeatInterval);
}

/**
 * Returns the last heartbeat stored in extension storage, or undefined if
 * the heartbeat has never run before.
 */
async function getLastHeartbeat() {
  return (await chrome.storage.local.get('last-heartbeat'))['last-heartbeat'];
}
相关推荐
冬奇Lab2 分钟前
每日一个开源项目(第137篇):Penpot - 真正开源的设计协作工具,SVG 原生格式消灭设计-开发鸿沟
前端·开源·设计
nuIl19 分钟前
实现一个 Coding Agent(7):Skills
前端·agent·cursor
nuIl24 分钟前
实现一个 Coding Agent(8):会话持久化与多会话
前端·agent·cursor
jt君424261 小时前
React Native JSI 深入剖析 — 第 5 部分中文技术整理:用 HostObject 把 C++ 类暴露给 JavaScript
前端·react native
胡萝卜术1 小时前
滑动窗口最大值:从暴力到单调队列,层层优化全解析
前端·javascript·面试
fluffyox2 小时前
Notion 的公式栏里,藏着一台虚拟机——逆向 + 用 600 行 JS 复刻它的编译器与栈式 VM
前端
kyriewen3 小时前
2026 年了,这 6 个 npm 包可以卸载了——浏览器原生 API 已经能替代
前端·javascript·npm
Csvn5 小时前
Monorepo 迁移血泪史:从 Multi-Repo 到 Turborepo,这 3 个坑我帮你踩完了
前端
星栈6 小时前
Dioxus 多页面怎么做:`dioxus-router`、嵌套路由、`Outlet` 和页面组织,一篇给你讲顺
前端·rust·前端框架
用户987409238876 小时前
用 Remotion + edge-tts 打造中文教学视频全自动流水线
前端