TextDocumentContentProvider HTML / JScontent可以与扩展程序代码对话吗?

时间:2017-07-29 21:11:48

标签: typescript visual-studio-code vscode-extensions

我正在构建Visual Studio代码扩展。此扩展程序的TextDocumentContentProvidervscode.previewHtml命令一起显示。

我希望此提供程序显示已编译代码的结果。这似乎微不足道。但是,因为我的扩展还有一个调试器;我希望扩展上下文(或更好的是,调试器上下文)能够与该预览选项卡的代码进行通信。这样,调试器可以更新选项卡(向其发送重新编译的数据),并可能返回一些数据以获取状态。

如果没有某种类型的服务器,有没有办法做到这一点?我想我可以从扩展上下文(因为它的节点)运行一个网络服务器和预览HTML中某种类型的客户端,它连接到由预览选项卡模式uri指定的端口中的服务器,但它看起来有点麻烦。

我通常通过在GitHub上搜索具有类似功能的扩展来找到VSC扩展开发问题(和参考/示例)的答案,但我找不到任何相同功能的扩展(包括Microsoft' s { {3}})。

那么,有没有人知道一个简单的方法,或者它是否可能? (或任何我可以调查的扩展名。)

(编辑)我倾向于使用Node WebSocket服务器(在扩展级别)和WebSocket客户端(在预览HTML级别),这是two TextDocumentContentProvider samples扩展用于实时预览的功能更新。对我来说似乎非常可能并且可能已经足够了,但是因为我必须为行动建立自己的序列化协议,所以需要一些解决方法。如果可能的话,拥有与VSCode命令(而不仅仅是命令作为链接)通信能力的类似JS上下文会更好。

3 个答案:

答案 0 :(得分:2)

编辑(2018-11-01):现在可以使用新的webview API。请参阅Matt Bierner's answer above以获得问题的真正解决方案。以下答案现已过时。

经过大量调查后发现,扩展/调试代码与预览(webview)上下文之间没有正常的通信方式。

目前可用的功能包括:

  • 更新内容提供商,该内容提供商调用重新呈现预览内容
  • 通过需要点击的HTML链接从预览内容中调用vscode个命令
  • injecting links
  • 从预览内容中调用vscode个命令
  • 通过编辑器界面进行一些滚动操作

这些都不适合与预览标签进行通信。

目前,基于WebSocket的客户端/服务器架构是在两种上下文之间提供双向通信的唯一方法。

An extension to the preview/webview support is being investigated,所以将来可能会改变。

答案 1 :(得分:1)

使用webview api现在很容易做到。扩展程序可以将消息发布到Webview内容,而Webview可以将消息发布回扩展程序。

This sample extension演示了如何使用Webview API和Webview通信。 webview docs还详细介绍了api和webview通信。

答案 2 :(得分:0)

已内置更新文本内容提供程序。您的文本内容提供商应具有onDidChange事件属性。 previewHTML impl连接到那个以了解何时更新到期。因此,在您的扩展程序中,只要您感到需要,就可以拨打update function of your provider triggers this even。这将导致previewHTML impl再次触发您的provideTextDocumentContent功能,您可以在其中提供更新的数据。