GM_setValue 与 GM_getValue:脚本数据的读写与持久化
脚本要「记住事」,用的是 GM 存储函数。这套存储独立于网页本身:页面清缓存不影响它,换浏览器不带走它(除非同步/导出)。以下内容依据官方文档 GM_values 分组整理。
单键读写
// 写
GM_setValue("someKey", "someData");
await GM.setValue("otherKey", "otherData");
// 读(第二个参数是缺省值)
const a = GM_getValue("someKey", null);
const b = await GM.getValue("otherKey", null);
- 键是字符串,值可以是对象、字符串、数字、布尔或 null(嵌套对象也支持);
- 读取时给缺省值,键不存在时返回它,避免 undefined 扩散。
删除与枚举
GM_deleteValue("someKey"); // 删单键
const keys = GM_listValues(); // 列出所有键
批量操作(v5.3+)
GM_setValues({ foo: 1, bar: 2 }); // 一次写多键
const vals = GM_getValues({ foo: 0, bar: 0 }); // 键名+缺省值对象,一次读多键
GM_deleteValues(["foo", "bar"]); // 一次删多键
异步版本对应 GM.setValues 等,返回 Promise。
变更监听
GM_addValueChangeListener(key, callback) 可以监听某个键的变化,回调参数含旧值、新值与 remote 标记(是否来自其他标签页/实例)——适合多标签页协作的脚本;对应的移除函数是 GM_removeValueChangeListener。
这些数据存到哪、怎么管理
- 存储属于脚本:每个脚本一个独立空间,互相不可见;
- 想人工查看/修改:编辑器 Storage 标签,见存储数据查看;
- 脚本删除时存储一并清除。
与 localStorage 的区别
| 维度 | GM 存储 | 页面 localStorage |
|---|---|---|
| 归属 | 脚本,跨页面共享 | 单个站点 |
| 存活 | 直到删脚本/清数据 | 随站点缓存策略 |
| 跨域 | 与脚本同在,配合跨域脚本用 | 受同源策略限制 |
常见坑
- 同步风格函数在事件处理器里直接调用即可;点号版要用
await或.then(); - 存了大量数据后脚本首次注入变慢——大数据考虑压缩或只存索引;
- 排查「脚本记住了旧状态」,先看 Storage 标签里的实际键值再动代码。