Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript TextDocumentContentProvider HTML/JScontent是否可以与扩展名';s代码?_Typescript_Visual Studio Code_Vscode Extensions - Fatal编程技术网

Typescript TextDocumentContentProvider HTML/JScontent是否可以与扩展名';s代码?

Typescript TextDocumentContentProvider HTML/JScontent是否可以与扩展名';s代码?,typescript,visual-studio-code,vscode-extensions,Typescript,Visual Studio Code,Vscode Extensions,我正在构建一个VisualStudio代码扩展。此扩展有一个TextDocumentContentProvider,它与vscode.previewHtml命令一起显示 我希望此提供程序显示编译代码的结果。这似乎微不足道。但是,因为我的扩展还有一个调试器;我希望扩展上下文(或者更好的是调试器上下文)能够与预览选项卡的代码对话。通过这种方式,调试器可以更新选项卡(向其发送重新编译的数据),并可能获取一些状态数据 如果没有某种服务器,有没有办法做到这一点?我想我可以有一个从扩展上下文运行的网络服务器

我正在构建一个VisualStudio代码扩展。此扩展有一个
TextDocumentContentProvider
,它与
vscode.previewHtml
命令一起显示

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

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

我通常通过在GitHub上搜索具有类似功能的扩展来找到VSC扩展开发问题的答案(以及参考/示例),但我找不到任何能够做到这一点的扩展(包括Microsoft的)

那么,有没有人知道一个简单的方法来做到这一点,或者如果有可能的话?(或我可以调查的任何扩展)


(编辑)我倾向于使用节点WebSocket服务器(在扩展级别)和WebSocket客户端(在预览HTML级别),这是扩展用于实时预览更新的功能。对我来说似乎很有可能,但这是一种变通方法,因为我必须为操作建立自己的序列化协议。如果可能的话,拥有与VSCode命令(不仅仅是作为链接的命令)通信的类似JS上下文会更好。

更新文本内容提供程序已经内置。文本内容提供程序应具有
onDidChange
事件属性。
previewHTML
impl连接到它,以了解更新何时到期。因此,在你的扩展中,每当你觉得需要时,你会依次调用一个。这将导致
previewHTML
impl再次触发您的
providedextdocumentcontent
功能,您可以在该功能中提供更新的数据。

编辑(2018-11-01):新的webview API现在可以实现此功能。请参阅以了解问题的真正解决方案。以下答案现已过时


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

目前可用的功能包括:

  • 正在更新内容提供程序,这将调用预览内容的重新呈现
  • 通过需要单击的HTML链接从预览内容调用
    vscode
    命令
  • 通过从预览内容调用
    vscode
    命令
  • 通过编辑器界面进行一些滚动操作
这些都不适合与“预览”选项卡通信

目前,基于WebSocket的客户机/服务器体系结构是在两个上下文之间提供双向通信的唯一方法


,因此这在将来可能会发生变化。

现在可以很容易地使用。扩展可以将消息发布到webview内容,webview可以将消息发布回扩展


演示如何使用webview API和webview通信。在api和webview通信方面也有更多的细节。

这种方法的问题是
update
方法在
TextDocumentContentProvider
上下文的范围内;我正在尝试使用预览HTML的页面上下文。同样,我不能仅仅重新触发
providedextdocumentcontent
;那只会创造新的内容,不是吗?我想要的是HTML内容与扩展对话,交换信息,并更新其中一些基于JS的交互元素。很好!谢谢你,马特!正在更新,以便将您的答案标记为正确答案。