typescript - ¿Puede el contenido HTML/JS de TextDocumentContentProvider comunicarse con el código de la extensión?
Estoy creando una extensión de Visual Studio Code. Esta extensión tiene un TextDocumentContentProvider que se muestra con el comando vscode.previewHtml.
Quiero que este proveedor muestre el resultado de mi código compilado. Eso parece trivial. Sin embargo, dado que mi extensión también tiene un depurador, quiero que el contexto de la extensión (o mejor aún, el contexto del depurador) pueda comunicarse con el código de esa pestaña de vista previa. De esa manera, el depurador puede actualizar la pestaña (enviándole datos recompilados) y tal vez recibir algunos datos de vuelta para el estado.
¿Hay alguna manera de hacerlo sin algún tipo de servidor? Supongo que podría tener un servidor net ejecutándose desde el contexto de la extensión (ya que es Node) y algún tipo de cliente en el HTML de vista previa que se conecte al servidor en un puerto especificado por el URI del esquema de la pestaña de vista previa, pero parece un poco engorroso.
Normalmente encuentro respuestas a preguntas sobre el desarrollo de extensiones de VSC (y referencias/ejemplos) buscando extensiones con funciones similares en GitHub, pero no puedo encontrar ninguna extensión que haga exactamente eso (incluidos los dos ejemplos de TextDocumentContentProvider de Microsoft).
Entonces, ¿alguien sabe de una manera fácil de hacer eso, o si es posible en absoluto? (O alguna extensión que haga eso que pueda investigar).
(Editar) Me inclino a usar un servidor WebSocket de Node (a nivel de extensión) y un cliente WebSocket (a nivel de HTML de vista previa), que es lo que la extensión de vista previa de LaTeX hace para actualizaciones en tiempo real de la vista previa. Me parece bastante posible y suficiente para mí, pero es un poco un arreglo temporal ya que tendré que establecer mi propio protocolo serializado para las acciones. Tener un contexto JS similar con la capacidad de comunicarse con los comandos de VSCode (no solo comandos como enlaces) sería mejor, si es posible.
Respuesta #1
Edición (01-11-2018): Esto ahora es posible con la nueva API de webview. Ve la respuesta de Matt Bierner arriba para una solución real al problema. La siguiente respuesta ahora está desactualizada.
Después de mucha investigación, resulta que no hay una manera normal de comunicarse entre el código de la extensión/debugger y el contexto de vista previa (webview).
Las funciones disponibles actualmente son:
- Actualizando el proveedor de contenido, lo que provoca una nueva renderización del contenido de vista previa
- Llamar a comandos de
vscodedesde el contenido de vista previa a través de enlaces HTML que necesitan ser clicados - Llamar a los comandos de
vscodedesde el contenido de vista previa mediante la inyección de enlaces - Alguna manipulación del desplazamiento a través de la interfaz del editor
Ninguno de estos es apropiado para la comunicación con la pestaña de vista previa.
Por ahora, una arquitectura cliente/servidor basada en WebSocket es la única manera de proporcionar comunicación bidireccional entre los dos contextos.
Se está investigando una extensión del soporte de vista previa/webview, por lo que esto podría cambiar en el futuro.
Respuesta #2
Esto ahora es fácil de hacer usando la API de webview. Las extensiones pueden enviar mensajes al contenido del webview y el webview puede enviar mensajes de vuelta a la extensión.
Esta extensión de ejemplo demuestra cómo usar la API de webview y la comunicación con webview. La documentación de webview tiene mucho más detalle sobre la API y la comunicación con webview también.