跳到主要内容

几种状态存储的区别,令牌能不能放全局状态?

结论​

键值用 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,换机器打开同一个仓库也不会自动出现,除非你自己做同步。