Chrome扩展迁移Manifest V3 Service Worker的全局变量存储方案咨询
Manifest V3 Service Worker 全局变量存储方案
Manifest V3 后台运行环境为 Service Worker,不存在 window 全局对象,且 Service Worker 会在无事件响应时被浏览器自动终止回收,内存中存储的非持久化变量会在SW重启后丢失,可根据数据的生命周期需求选择对应存储方式:
1. 仅需SW运行周期内生效的临时变量
直接在 Service Worker 脚本的顶层作用域声明变量即可,SW运行期间所有事件回调、引入的脚本都可以全局访问该变量。
注意:该方式存储的数据会在SW被休眠终止后清空,仅适合存储不需要跨重启保留的临时状态。
对应原有代码的改造示例:
// 顶层作用域声明变量,SW存活期间全局可访问 let _linkedin_pixel_data = {}; const matchingUrls = ["<all_urls>"]; chrome.runtime.onInstalled.addListener(() => { // 直接操作顶层声明的变量即可 _linkedin_pixel_data = {}; }); // 其他后台逻辑中可直接读写上述两个变量
避坑提示:不要把变量的初始化逻辑仅放在onInstalled回调中——SW重启时不会触发onInstalled事件,会导致变量未定义报错,初始值、常量必须声明在SW顶层作用域。
如果你需要拆分后台逻辑到多个JS文件,可通过importScripts引入其他脚本,所有引入的脚本共享同一个SW顶层作用域,顶层声明的变量可跨文件访问,和MV2后台页window共享逻辑一致。
2. 需要持久化保留、SW/浏览器重启后不丢失的数据
如果数据需要跨SW生命周期、甚至跨浏览器重启保留,不能仅存在内存中,需使用Chrome扩展官方提供的存储API,根据场景选择即可:
chrome.storage.local:本地持久化存储,默认容量上限10MB(可申请无限制存储权限扩容),数据仅存在用户本地设备,读写速度快,适合存储体积较大、不需要跨设备同步的数据chrome.storage.session:会话级存储,数据仅保留在当前浏览器运行周期内,浏览器关闭后自动清空,容量上限10MB,不会因SW休眠丢失数据,适合存储敏感的临时会话数据chrome.storage.sync:账号同步存储,数据会自动同步到用户登录的所有同账号Chrome设备,容量较小(单条Key上限8KB,总容量约100KB),适合存储用户偏好配置类小体积数据
以chrome.storage.local为例的实现代码:
// 安装扩展时初始化存储数据 chrome.runtime.onInstalled.addListener(async () => { await chrome.storage.local.set({ linkedin_pixel_data: {}, matching_urls: ["<all_urls>"] }); }); // 业务逻辑中读写存储数据 async function getPixelData() { const res = await chrome.storage.local.get("linkedin_pixel_data"); return res.linkedin_pixel_data; } async function updatePixelData(newVal) { await chrome.storage.local.set({ linkedin_pixel_data: newVal }); }
内容的提问来源于stack exchange,提问作者Shaun Peh
相关产品推荐
相关产品推荐

