当前位置: 首页 > news >正文

Chrome插件开发【storage】

目录

storage简介

local

session

sync

常用方法

存储数据:chrome.storage.(api).set(object,callback)

获取数据:chrome.storage.(api).get(keys,callback)

删除数据:chrome.storage.(api).remove(keys,callback)

清空数据:chrome.storage.(api).clear(callback)

计算占用:chrome.storage.(api).getBytesInUse(keys,callback)

监听事件

onChanged.addListener(listener)

其它


storage简介

chrome.storage API提供数据的存储读取删除数据监听事件等功能

chrome.storage有三个存储区域:“local”、“sync”、“session”,三个存储区域都支持相同的方法,用法完全一样仅存储特性不同。因此下面在说明方法时,将不重点介绍某一个存储区域的某一个方法,因为它们的方法都是一样的。

storage API使用前必须在manifest.json里声明“storage”权限

{"manifest_version": 3,"name": "我的扩展","permissions": ["storage"],  // 必须声明此权限// 其他配置...
}

local

local主要用于在用户本地设备持久化存储数据

local五大特性

  1. 本地持久化:数据存储在用户的本地设备硬盘中,不会随浏览器关闭而消失,除非用户手动清除
  2. 存储范围:仅在当前设备生效,不会跨设备同步(仅在当前浏览器生效)
  3. 存储容量:限制较宽松,取决于设备的存储空间
  4. 访问权限:仅同一插件内部可以访问
  5. 异步操作:所有方法均为异步执行

session

session主要用于保存插件的临时数据

session五大特性

  • 生命周期:仅在当前Chrome会话(所有Chrome窗口)有效,关闭所有Chrome窗口后数据自动情况(关闭某个标签页不影响)
  • 存储容量:约10MB
  • 访问权限:仅同一插件内部可以访问
  • 持久化能力:数据不写入磁盘,浏览器崩溃或重启后数据会丢失
  • 异步操作:所有方法均为异步执行

sync

sync专门用于在用户登录Google账号的所有Chrome设备间同步数据,适合存储需要跨设备共享的少量关键信息

sync五大特性

  • 同步机制:自动将数据同步到用户所有登陆相同Google账号的Chrome设备,设备联网时保持数据一致
  • 存储机制:单挑数据 <= 8KB,总存储容量约100KB
  • 生命周期:持久存储,除非用户手动清除扩展数据或扩展主动删除
  • 使用场景:仅适合存储少量关键数据,不适合大量数据
  • 性能特点:同步操作有延迟,短时间内多次修改会合并同步

常用方法

存储数据:chrome.storage.(api).set(object,callback)

功能:存储键值对数据(覆盖已存在的键)

适用区域local、sync、session均支持

语法

// 语法 api -> local / session / sync
chrome.storage.(api).set(Object,callback)

参数说明

  • object必填):键值对集合,键为字符串,值为JSON可序列化类型
  • callback选填):操作完成后的回调函数,无参数

例子

// local区域存储
chrome.storage.local.set({testLocalKey:"testLocalValue"
}).then(() => {console.log('local区域已存储数据')
})
// session区域存储
chrome.storage.session.set({testSessionKey:"testSessionValue"   
}).then(() => {console.log('session区域已存储数据')
})
// sync区域存储
chrome.storage.sync.set({testSyncKey:"testSyncValue"
}).then(() => {console.log('sync区域已存储数据')
})

效果

获取数据:chrome.storage.(api).get(keys,callback)

功能:获取存储的数据(支持指定键或所有数据)

适用区域local、sync、session均支持

语法

// 语法 api -> local / session / sync
chrome.storage.(api).get(keys,callback)

参数说明

  • keys选填):
    • 若为String:获取单个键的数据
    • 若为Array:获取多个键的数据
    • 若为null不填:获取当前存储区域的所有数据
    • 若为Object:以“默认值”形式获取,当键不存在时返回Object键的值
  • callback必填):
    • 回调参数为Object,包含获取到的键值对

例子

// local区域
chrome.storage.local.set({testLocalKey:"testLocalValue"
}).then(() => {chrome.storage.local.get("testLocalKey").then((res) => {console.log('local区域已存储数据',res)})
})
// session区域
chrome.storage.session.set({testSessionKey:"testSessionValue"   
}).then(() => {chrome.storage.seesion.get("testSessionKey").then((res) => {console.log('session区域已存储数据',res)})
})
// sync区域
chrome.storage.sync.set({testSyncKey:"testSyncValue"
}).then(() => {chrome.storage.sync.get('testSyncKey').then((res) => {console.log('sync区域已存储数据',res)})
})

效果

删除数据:chrome.storage.(api).remove(keys,callback)

功能:删除指定键的数据

适用区域local、sync、session均支持

语法

// 语法 api -> local / session / sync
chrome.storage.(api).remove(keys,callback)

参数说明

  • keys必填):要删除的键,单个键使用字符串,多个键使用数组
    • 类型:String、Array
  • callback选填):操作完成后的回调函数,无参数

例子

// local区域
chrome.storage.local.remove("testLocalKey").then(() => {console.log('local区域已删除testLocalKey')
})
// session区域
chrome.storage.session.remove("testSessionKey").then(() => {console.log('session区域已删除testSessionKey')
})
// sync区域
chrome.storage.sync.remove('testSyncKey').then(() => {console.log('sync区域已删除testSyncKey')
})

效果

清空数据:chrome.storage.(api).clear(callback)

功能:清空当前区域的所有数据

使用区域:local、sync、session

语法

chrome.storage.(api).clear(callback)

参数说明

  • callback选填):操作完成后的回调函数

例子

// local区域
chrome.storage.local.clear(() => {console.log('local区域已清除')
})
// session区域
chrome.storage.session.clear(() => {console.log('session区域已清除')
})
// sync区域
chrome.storage.sync.clear(() => {console.log('sync区域已清除')
})

效果

计算占用:chrome.storage.(api).getBytesInUse(keys,callback)

功能:计算指定键(所有键)占用的存储空间

使用区域local、sync、session均支持(对sync尤其重要,监控是否超出100KB限制)

语法

// 语法 api -> local / session / sync
chrome.storage.(api).getBytesInUse(keys,object)

参数说明

  • keys选填):
    • 类型:String、Array、null
    • 若为null或不填,计算当前存储区域的所有数据的总占用空间
  • callback必填):回填参数为Number类型,表示占用的字节数

例子

// local区域
chrome.storage.local.getBytesInUse((bytes) => {console.log('local区域已使用' + bytes + '字节')
})
// session区域
chrome.storage.session.getBytesInUse((bytes) => {console.log('session区域已使用' + bytes + '字节')
})
// sync区域
chrome.storage.sync.getBytesInUse((bytes) => {console.log('sync区域已使用' + bytes + '字节')
})

效果

监听事件

onChanged.addListener(listener)

功能:监听所有存储区域的数据变化(新增、修改、删除

使用区域:全局事件,所有区域

语法

// 全局事件
chrome.storage.onChanged.addListener(listener)

参数说明

  • listener必填):有两个回调参数:
    • changes:变化的键值对集合,它有两个属性
      • 类型:Object
      • oldValue:修改前的值(删除时为undefined)
      • newValue:修改后的值(新增时为新值,删除时为undefined)
    • areaName:发生变化的存储区域
      • 类型:String
      • 值域:local / sync / session

注意:当前脚本通过set主动修改的数据不会触发该事件(避免循环触发),仅监听“外部修改”(插件其它组件、跨设备同步修改

例子

我们将创建监听,并在F12开发者工具的Application中修改数据,查看是否可以监听修改

// 创建一个监听
chrome.storage.onChanged.addListener((changes,areaName) => {console.log(`存储区域:${areaName}发生变化`)switch(areaName){case "local":console.log(`local发生变化:`,changes)break;case "session":console.log(`session发生变化:`,changes)break;case "sync":console.log(`sync发生变化:`,changes)break;}
})// 手动给三个区域先设置一个值
chrome.storage.local.set({"key1": "value1","key2": "value2"
})
chrome.storage.session.set({"key3": "value3","key4": "value4"
})
chrome.storage.sync.set({"key5": "value5","key6": "value6"
})

我们将local存储区域里的“key1”改为“key10”看一下效果:

可以看到一次修改实际上被onChanged事件监听了两次

此时,我们再将“key10”的值“value1”修改为“value11”:

这次居然只监听了一次,奇怪??

下面是我的理解:

  • 修改键时因为修改键,相当于两步:“删除键” -> “添加键”,因此会监听两次
  • 修改值时:只有一步“修改键值

其它

更多Chrome插件学习,可以参考我的专栏:

Chrome插件_是洋洋a的博客-CSDN博客

http://www.dtcms.com/a/353527.html

相关文章:

  • 重学JS-005 --- JavaScript算法与数据结构(五)回顾 DOM 操作
  • 实战Kaggle比赛:狗的品种识别(ImageNet Dogs)
  • SpringBoot整合RabbitMQ:从消息队列基础到高可用架构实战指南
  • 视频孪生技术在人工智能领域的应用价值:从虚实融合到智能决策
  • 人工智能在医疗风险预警中的技术应用综述
  • 《零基础入门AI: 目标检测基础知识》
  • Apache Commons Lang 3
  • 设备电机状态监测:通往预测性维护与效能飞升之路
  • AutoMQ 荣获 AWS Differentiated Partner 顶级认证!
  • 基于改进蜂群优化算法的高频金融波动率预测系统 (源码+论文+部署+安装)
  • ES02-常用API
  • qt c++ QTableWidget
  • Gopher URL协议与SSRF二三事
  • 帕累托优化:多目标决策的智慧与艺术
  • “下一代”图像模型——ComfyUI-Flux-Krea本地部署教程,体验划时代的图像质量
  • 计算机视觉(三):opencv环境搭建和图片显示
  • Optional 从 Java 8 到 21 的演进之路
  • 每日算法题【链表】:链表分割、链表的回文结构
  • 关于vscode的右键常用操作以及自定义快捷键
  • 密码管理中注释与重定向密码安全隐患及修复方案
  • 高并发内存池(12)-ThreadCache回收内存
  • Virtual PLCnext Controller 本地网络部署平台
  • Pandas DataFrame 列数操作完全指南
  • 高通平台蓝牙学习-- 基于WCN685x 的蓝牙低功耗(LE)功能
  • 浏览器与计算机网络
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘click’问题
  • k8s部署pgsql集群
  • 【Spring Cloud 微服务】5.架构的智慧枢纽:深度剖析 Nacos 注册中心
  • K8s持久化存储:PV与PVC
  • K8s 二次开发漫游录