几种状态存储的区别,令牌能不能放全局状态?
结论
键值用 globalState 和 workspaceState,密钥用 secrets,需要自己管文件时用 globalStorageUri 和 storageUri。访问令牌不能放 globalState,那里是普通状态库,不是加密存储。
展开
| 存储 | 范围 | 适合放什么 |
|---|---|---|
globalState | 本机所有窗口共享 | 上次使用的非敏感选项、功能是否点过 |
workspaceState | 当前工作区 | 折叠状态、和这个仓库绑定的面板状态 |
secrets | 密钥存储,按插件隔离 | Token、密码、刷新凭据 |
globalStorageUri | 全局目录 | 缓存索引、体积大的文件 |
storageUri | 当前工作区目录 | 和仓库绑定的缓存。没有打开文件夹时是 undefined |
globalState 最终落在状态数据库里,更新走 update(key, value)。可以用 setKeysForSync 把少量键放进设置同步。它没有加密语义,同步和本地库都可能被看到。
secrets.get/store/delete 走系统凭据链。读是异步的。不要把 token 打进日志,也不要塞进 Webview 的 URL。
文件类存储自己负责创建目录和清理。storageUri 在空窗口不存在,要先判断。
选择口诀:小配置走 Memento,秘密走 secrets,大对象走文件。
容易讲错的点
globalState.update返回 Thenable,连着写同一个键要等上一笔完成,否则会丢更新。- 设置同步同步的是标记过的
globalState键,不会自动同步secrets和存储目录。 workspaceState不跟随 Git,换机器打开同一个仓库也不会自动出现,除非你自己做同步。