2017-07-29 87 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