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'];
}
相关推荐
掘金挖土4 小时前
前端手摸手跑路之 AI 应用开发(三)
前端·后端
计算机魔术师4 小时前
OpenAI 宣称破解千禧年难题,数学家却说是「反例搜索」?
前端
志尊宝4 小时前
Vue3 零基础每日笔记(015):条件渲染 v-if 与 v-show——控制 DOM 生死还是控制显隐
前端·vue.js·笔记
掘金者阿豪4 小时前
OceanBase 和金仓怎么选?别只看分布式,复杂查询更考验架构取舍
前端·后端·架构
Bug修理工Bubble4 小时前
Swift ARC:一个对象到底什么时候才会被释放?
前端
ClouGence4 小时前
GPT-6 做 UI 自动化测试:Demo 惊艳,但真的适合长期回归吗?
前端·chatgpt·测试
阿酷tony5 小时前
视频专栏列表的防录屏水印和跑马灯效果(也可网站调用)
java·前端·音视频
凌风的跨境分享5 小时前
Temu店群运维提效:定时策略自动化任务全场景实操指南
大数据·运维·前端·人工智能·架构·自动化
linux_cfan6 小时前
videojs v10 源代码系列解读:06 · DOM 工具箱:事件、聚焦、Shadow DOM、定位
前端
尾善爱看海6 小时前
Vue 面试进阶篇:Composition API、插槽、自定义指令……8 个章节 + 高频面试题全解析
前端·javascript·vue.js·面试·vue