VSCode扩展-多个webview之间的数据共享



我正在创建一个VSCode扩展,有2个webview(目前):侧边栏和面板。这两个webviews都是苗条的应用程序。

"main"是侧边栏的那个。在与侧边栏的交互过程中,可以打开额外的web视图。"panel"Webview作为代码编辑器区域的附加选项卡打开。

我现在的工作流程是:

  • 侧边栏选择组件发布消息(vscode.postMessage({command: "XXX", value: "XXX"})
  • 消息在侧栏提供程序
  • 中被接收
  • 提供的侧边栏创建新的面板视图

在创建面板视图期间,一些数据从侧边栏(value: "XXX")传递。只要传递的数据是简单的,那么就没有问题。

我的问题是,我必须共享连接对象,这是更复杂的,并包含方法以及。如果我尝试发送复杂对象,我得到以下错误:

DOMException: Failed to execute 'postMessage' on 'MessagePort'

据我所知,这是因为数据结构复杂。我曾试图JSON.stringify()数据发送之前,但后来我得到:

Converting circular structure to JSON

所以问题是……是否有另一种方式来共享数据之间的webviews(这是同一扩展的一部分)?是否存在诸如扩展上下文或存储之类的东西,可以从所有扩展组件设置和访问数据?或者唯一的方法是在提供者之间发布消息。

注:共享数据不应该持久

编辑

如果有人想深入研究这个问题,我会留下这个问题,但我已经意识到我的方法可能不是很好。

目前,侧边栏webview正在建立连接,并试图将其传递给其他webview。我认为更好的是所有与后端的通信都要在扩展代码本身内部实现,并且webviews只能从那里请求数据(通过简单的postMessage而不是实际与后端本身通信)。

所有视图都在iframe中,这将它们严格隔离;我怀疑他们是否有办法沟通。

我建议减少发送给简单数据的内容(带有参数或数据请求的命令)。像devalue这样的库至少可以帮助处理循环引用之类的事情。

最新更新