vscode插件开发之 - 消息通信

  在开发vscode插件过程中,有一个典型场景是webview与extension.ts进行通信,例如,webview上的某些信息发送改变时,需要发送消息传递给extension.ts. 如果使用react框架构建vscode插件的webview,如何实现webview与extension.ts之间通信呢?如果要实现信息通信,需要三个步骤:

  步骤一:在react的src目录下,定义一个全局变量vscode,代码如下所示:这里定义了Message数据结构,定义了VSCode别名。

interface Message {command: string;content: string;[key: string]: any;
}
type VSCode = {Uri: any;env: any;postMessage(message: Message): void;getState(): any;setState(state: any): void;
};declare const vscode: VSCode;

   步骤二:在react的source code下面,在需要发送共享消息的地方,调用vscode.postMessage()发送消息。示例代码如下所示,当input中的信息或者dropdown中的信息发生改变时,就会通过postMessage发送消息出去。

const App = () => {const [sex, setSex] = useState('');const handleChange = (event: any) => {setSex(event.target.value);vscode.postMessage({ command: "sexChange", content: event.target.value });};const handleNameChange = (event: any) => {const value = event.target.value;vscode.postMessage({ command: "nameChange", content: value });}const handelAgeChange = (event: any) => {const value = event.target.value;vscode.postMessage({ command: "ageChange", content: value });}return (<div><div><input type="text" name="name" onChange={handleNameChange}></input></div><div><input type="text" name="age" onChange={handelAgeChange}></input></div><div><select value={sex} onChange={handleChange} ><option>girl</option><option>boy</option></select></div><div><button>ShowIt</button></div></div>);
};
const rootElement = document.getElementById('root');
if (rootElement) {const root = (ReactDOM as any).createRoot(rootElement);root.render(<App />);
} else {console.error('Root element not found!');
}

  步骤三:在extension.ts代码中,增加监听消息的代码,如果是多个信息需要汇聚,那么可以定义个公共的数据对象,直接更新这个对象即可。调用webview.onDidReceiveMessage监听消息,并将接受到的内容,更新到info这个变量上。

        webviewView.webview.onDidReceiveMessage((message: any) => {if (message.command === "nameChange") {info.name = message.content} else if (message.command === "ageChange") {info.age = message.content} else if (message.command === "sexChange") {info.sex = message.content}})
export interface Info {name: string,age: number,sex: string
}export let info: Info = {name: "",age: 0,sex: "boy"
}

  修改完上述代码后,就可以进行验证,是否能在extension.ts上接受不了webview上的输入信息了,这里当trigger demo.showOne command的时候,在message上,打印了info这个对象。

    context.subscriptions.push(vscode.commands.registerCommand('demo.showOne', () => {vscode.window.showInformationMessage('I am showOne.');vscode.window.showInformationMessage(JSON.stringify(info))}));

   重新编译后,在extension的webview上输入一些信息,在点击右键菜单的showOne,在右下角的message上成功打印出了消息,说明消息传递成功。

  那么,为什么在webview的source code上定义了Message和VSCode对象后,就能调用postMessage发送消息呢?实际上如果要成功发送消息,在extension.ts的webview.html代码中还需要添加上“const vscode = acquireVsCodeApi()”才行。

    private getWebviewContent(webviewUri: vscode.Uri): string {return `<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Taoli Webview</title></head><body><div id="root"></div><script>const vscode = acquireVsCodeApi();</script><script src="${webviewUri}"></script></body></html>`;}
}

消息通信工作原理

   在 VS Code 扩展中,webview 是一个内嵌的 HTML 环境,类似于一个 iframe。acquireVsCodeApi 函数是 VS Code 提供的一个全局函数,允许 webview 内部的 JavaScript 代码获取一个 VS Code API 对象,从而与扩展主进程进行通信。调用该函数会返回一个包含一组方法的对象,这些方法用于与扩展主进程进行双向通信。主要的方法包括:
postMessage(message: any): void
getState(): any
setState(state: any): void

   在步骤一中定义的VScode和Message对象,这些代码是告诉 TypeScript 编译器,在运行时将会有一个全局的 vscode 对象,该对象符合 VSCode 类型。这是为了让 TypeScript 知道 vscode 对象的存在,并进行类型检查和自动补全。实际当webview运行的时候,使用的是acquireVsCodeApi 函数返回的VScode常量。这个常量提供的方法和之前定义的一致。通过这种方式实现了消息通信。

1.发送消息:webview 内部的代码使用 vscode.postMessage 方法发送消息到主进程。
2.接收消息:主进程使用 webview.onDidReceiveMessage 方法接收并处理这些消息。
3.双向通信:如果需要,主进程还可以使用 webview.postMessage 方法向 webview 发送消息,从而实现双向通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工厂ESOP系统促进工厂快速响应和工艺改进

在当今追求可持续发展和创新的时代&#xff0c;新能源产业正以惊人的速度崛起。新能源工厂作为这一领域的核心生产环节&#xff0c;面临着不断提高效率、优化工艺和快速应用新技术的巨大挑战。为了应对这些挑战&#xff0c;越来越多的新能源工厂开始引入 ESOP 系统&#xff08;…

为什么企业需要数据挖掘平台?哪个比较好呢?

什么是数据挖掘&#xff1f; 数据挖掘就是从大量的数据中去发现有用的信息&#xff0c;然后根据这些信息来辅助决策。听起来是不是跟传统的数据分析很像呢&#xff1f;实际上&#xff0c;数据挖掘就是智能化的数据分析&#xff0c;它们的目标都是一样的。但是&#xff0c…

【SPIE独立出版 | 往届均已完成EI检索】2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024)

2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024) 2024 International conference on Cloud Computing, Performance Computing and Deep Learning *CCPCDL往届均已完成EI检索&#xff0c;最快会后4个半月完成&#xff01; 一、重要信息 大会官网&#xff1a;www…

盘点海外大带宽服务器:哪家值得选?

针对外贸业务遭遇大流量访问时的巨大带宽需求&#xff0c;我们可能有很多人会选择寻找一些海外大带宽服务器提供商来提升网站的访问效率。所以&#xff0c;本文整理了五个海外大带宽服务器的产品商家&#xff0c;如果有需要可以选择参考。 亚马逊 AWS(Amazon Web Services) 亚马…

《深入理解Spark RDD缓存机制》(第4天)

文章目录 前言一、小试牛刀&#xff1a;解剖RDD缓存机制&#xff1f;1. 什么是Spark RDD缓存策略1.1 为什幺RDD要做缓存1.2 缓存相关API&#xff1a;1.3 缓存案例解析:1.4 图解缓存效果: 2. 什么是checkpoint缓存2.1 为什么要做checkpoint缓存2.2 checkpoint相关API:2.3 checkp…

七彩影视双端新版本源码 支持PC+WAP+APP三端 对接苹果CMS后台

下载地址&#xff1a;七彩影视双端新版本源码 支持PCWAPAPP三端 对接苹果CMS后台 适合做影视类&#xff0c;高端大气

强化学习——基本概念

何为强化学习 机器学习的一大分支 强化学习&#xff08;Reinforcement Learning&#xff09;是机器学习的一种&#xff0c;它通过与环境不断地交互&#xff0c;借助环境的反馈来调整自己的行为&#xff0c;使得累计回报最大。强化学习要解决的是决策问题——求取当前状态下最…

群晖NAS本地部署并运行一个基于大语言模型Llama2的个人本地聊天机器人

前言 本文主要分享如何在群晖 NAS 本地部署并运行一个基于大语言模型 Llama 2 的个人本地聊天机器人并结合内网穿透工具发布到公网远程访问。本地部署对设备配置要求高一些,如果想要拥有比较好的体验,可以使用高配置的服务器设备. 目前大部分大语言模型的产品都是基于网络线上…

【ai】tx2-nx:安装深度学习环境及4.6对应pytorch

参考:https://www.waveshare.net/wiki/Jetson_TX2_NX#AI.E5.85.A5.E9.97.A8 英伟达2021年发布的的tritionserver 2.17 版本中,backend 有tensorflow1 和 onnxruntime ,他们都是做什么用的,作为backend 对于 triton 推理server意义是什么,是否应该有pytorch? Triton Infer…

PS给logo加白色描边

步骤1&#xff1a;打开你的Logo文件 步骤2&#xff1a;选择Logo层 在“图层”面板中找到你的Logo所在的图层。如果你的Logo是在背景图层上&#xff0c;可以将它转换为普通图层&#xff08;右键点击背景图层&#xff0c;选择“从背景图层转换”&#xff09;&#xff08;此处也…

五大数据防泄漏系统排名|高效实用的防泄漏软件有哪些

在数字化时代&#xff0c;数据泄露已成为企业面临的重要安全挑战之一。为了有效应对这一挑战&#xff0c;企业需要借助先进的数据泄露防护系统来保护其敏感信息免受非法访问、使用和泄露。以下是五大备受推崇的数据泄露防护系统&#xff0c;它们各具特色&#xff0c;功能强大&a…

查看nginx安装/配置路径,一个服务器启动两个nginx

查看nginx安装/配置路径 查看nginx的pid&#xff1a; ps -ef | grep nginx查看pid对应服务的启动路径 ll /proc/2320/exe使用检查配置文件命令&#xff0c;查看配置文件位置 /usr/local/nginx/sbin/nginx -t一个服务启动两个nginx 拷贝一份程序&#xff0c;cpbin是我自己创…

阿里云服务器提醒漏洞要不要打补丁?

我们自己用的电脑一旦发现漏洞&#xff0c;往往是第一时间进行打补丁重启等等&#xff0c;但是作为服务器而言&#xff0c;往往没有这个习惯&#xff0c;为什么&#xff1f;因为害怕服务器打补丁以后&#xff0c;重启后出现打不开的情况&#xff0c;毕竟稳定的运行似乎在这种情…

java.io.eofexception:ssl peer shut down incorrectly

可能是因为 1)https设置 2&#xff09;超时设置 FeignConfig.java package zwf.service;import java.io.IOException; import java.io.InputStream; import java.security.KeyStore;import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory;import org.apac…

北斗短报文终端在应急消防通信场景中的应用

在应对自然灾害和紧急情况时&#xff0c;北斗三号短报文终端以其全球覆盖、实时通信和精准定位的能力&#xff0c;成为应急消防通信的得力助手。它不仅能够在地面通信中断的极端条件下保障信息传递的畅通&#xff0c;还能提供精准的位置信息&#xff0c;为救援行动提供有力支持…

Adams 插件Plugin二次开发教程

通过cmd或python开发的Adams程序&#xff0c;可以通过执行cmd&#xff08;python&#xff09;命令的方式直接运行&#xff0c;也可以根据cmd教程中提供的创建菜单和对话框的方式调用这些程序&#xff0c;当然更合适的方式是通过插件的方式对二次开发的程序进行管理&#xff0c;…

Java程序员Python一小时速成

背景 由于最近要开发一些AI LLM&#xff08;Large Language Model 大语言模型&#xff09;应用程序&#xff0c;然后又想使用LangChain&#xff08;LangChain 是一个用于构建和操作大语言模型&#xff08;LLMs&#xff09;的框架&#xff0c;旨在帮助开发者更方便地集成和使用…

Shell脚本、相关命令;重定向、管道符、变量相关命令讲解

目录 Shell脚本 概念 执行命令流程的交互区别 交互式 非交互式 Shell脚本应用场景 Shell的作用 Shell的作用 —— 命令解释器&#xff0c;“翻译官” 列出系统中全部解释器 实验 脚本的基本书写格式和执行命令 在子bash下执行脚本 指定解释器的方式执行脚本 指定…

代码讲解——ssm+jsp+maven项目目录结构说明

1 applicationContext.xml 应用上下文配置 2 db.properties 数据库配置 3 log4j.properties日志配置 4 mybatis-config.xml mybatis配置 5 springmvc.xml springmvc配置

万元主力机型该选什么固态硬盘,佰维NV7200、NV3500 的实用一定要让你知道

固态硬盘&#xff1a;变革存储技术&#xff0c;探索无尽可能 今年的固态市场价格一直是稳中上涨。 固态的价格上涨有技术上的因素&#xff0c;也有人工成本上的因素。好在国产固态技术的崛起&#xff0c;在固态价格上涨之下&#xff0c;依旧能选购到性价比和性能出众的型号。…