2017-07-29 85 views
2

我正在构建一个Visual Studio代码扩展。该扩展名有TextDocumentContentProvider,与vscode.previewHtml命令一起显示。TextDocumentContentProvider HTML/JScontent可以与扩展的代码对话吗?

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

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

我通常通过在GitHub上搜索具有类似功能的扩展来找到VSC扩展开发问题(和参考/示例)的答案,但是我找不到任何扩展(包括微软的two TextDocumentContentProvider samples)。

那么,有没有人知道一个简单的方法来做到这一点,或者如果有可能呢? (或者任何可以进行调查的扩展)。 (编辑)我倾向于使用Node WebSocket服务器(在扩展级别)和WebSocket客户端(在预览HTML级别),这是LaTeX preview扩展为实时预览更新所做的工作。看起来很可能并且可能对我来说已经足够了,但是有点解决方法,因为我必须建立我自己的序列化操作协议。如果可能的话,具有与VSCode命令(不仅仅是命令链接)通信能力的类似JS上下文会更好。

回答

1

经过大量调查后,事实证明扩展/调试器代码和预览(webview)上下文之间没有正常的通信方式。

目前提供的功能有:预览内容

  • 调用经由需要被点击
  • HTML链接预览内容 vscode命令

    • 更新内容提供者,这就要求重新绘制
    • 从预览内容中调用vscode命令injecting links
    • 通过编辑界面进行的某些滚动操作

    这些都不适合与预览选项卡进行通信。

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

    An extension to the preview/webview support is being investigated,所以这可能会在未来发生变化。

    0

    更新文本内容提供程序已经内置。您的文字内容提供商应该有一个onDidChange活动属性。 previewHTML impl连接到知道更新何时到期。因此,在您的分机中,只要您觉得有需要,您可以拨打update function of your provider,然后再拨打triggers this even。这会导致previewHTML impl再次触发您的provideTextDocumentContent函数,您可以在其中提供更新的数据。

    +0

    该方法的问题在于'update'方法在TextDocumentContentProvider上下文中;我正在尝试使用预览HTML的页面上下文。同样,我不能只重新触发'provideTextDocumentContent';那只会创造新的内容,不是吗?我想要的是让HTML内容与扩展和交换信息对话,并更新其中的一些基于JS的交互式元素。 – zeh