关于 Manifest V3 中的 storage 配额

这几天在开发浏览器插件,用的是 Plasmo + Redux 做状态管理,中途遇到了一个很“诡异”的问题,简单来说就是 Redux 的状态持久化刚开始能用,但数据量多起来之后,就会丢失状态。
在配置页面点击添加,当场是能看到变化的,但是刷新之后状态又会恢复到之前那样,如果 A 配置有 5 个,那么 B 配置只能存 1 个,反之 A 有 1 个,B 能存 2 个。
刚开始我在怀疑是 Plasmo 的问题,于是去 issues 里搜索,发现没有人问过,后来猜想可能是 storage 的配额问题,查了一下 MV3 的文档,果不其然。
在文档中可以知道 MV3 有 4 种 storage,分别是 local、session、managed 和 sync,其中前两个大家都很熟悉,这两个的配额都是 10MB,managed 是管理员下发的配置,是只读的,所以没有配额上限。
sync 是很特殊的,它能在多个设备之间同步,即便你浏览器关闭了同步功能,但他的配额也是最少的,只有 100 KB,而且由于他是键值对存储,所以规定了每个项目不能超过 8KB,所以你可以看到 Tampermonkey 等插件都不依赖 sync 来做同步,他们更喜欢用 Google Drive 等网盘。
那么回到 Plasmo,这个框架提供了 @plasmohq/redux-persist 这个库,用于 Redux 状态的持久化,在他的样例代码里默认使用的就是 syncStorage,对应 MV3 中的 stroage.sync。
我计算了一下我的配置大小,B 配置每个占用 3KB 上下,那么按他项目(状态树)的配额限制,确实最多只能存下两个,所以解决起来最简单的办法就是换用 storage.local 来储存配置。
如果觉得 local 和 session 配额不够的话,可以申请 unlimitedStorage 权限,它会解除这两种的配额上限(sync 的不行,毕竟云空间要花钱)。




