初探 VS Code + Webview

news2024/9/20 20:19:55

本文作者为 360 奇舞团前端开发工程师

介绍

VSCode 是一个非常强大的代码编辑器,而它的插件也非常丰富。在开发中,我们经常需要自己编写一些插件来提高开发效率。本文将介绍如何开发一个 VSCode 插件,并在其中使用 Webview 技术。首先介绍一下什么是Webview。

什么是 Webview?

Webview 是一种可以在 VS Code 中嵌入 Web 内容的技术。通过 Webview,开发者可以将自己的 Web 应用程序嵌入到 VS Code 中,以便在工具中执行各种任务。Webview 提供了一个 Web 浏览器的环境,可以在其中加载 HTML、CSS 和 JavaScript,从而实现各种功能。Webview 还提供了一个 API,使得开发者可以从 Web 应用程序中与 VS Code 进行交互。webview API为开发者提供了完全自定义视图的能力,Webview也能用于构建比VS Code原生API支持构建的更加复杂的用户交互界面。可以把webview看成是VS Code中的iframe,它可以渲染几乎全部的HTML内容,它通过消息机制和插件通信。这样的自由度令我们的webview非常强劲并将插件的潜力提升到了新的高度。接下来我们一起来学习。

1. 创建一个空的 VSCode 插件

首先,我们借助脚手架yomen和generator-code来快速生成项目框架:安装依赖

npm install -g yo generator-code

初始化一个 VS Code插件项目

yo code
  ? What type of extension do you want to create? New Extension (TypeScript)
  ? What's the name of your extension? HelloWorld
  ? What's the identifier of your extension? helloworld
  ? What's the description of your extension? HelloWorld
  ? Initialize a git repository? No
  ? Which package manager to use? npm
  等待安装依赖完成
  code ./helloworld

以下为初始化的项目结构

d6c0adbad77188a9e28f91cd4c74cf4b.png

2. 在插件中创建一个 Webview

在插件中创建一个 Webview,需要使用 vscode 模块中的 window.createWebviewPanel 方法。该方法需要传入一个唯一标识符、标题、视图类型和展示位置等参数。例如:

import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
	let disposable = vscode.commands.registerCommand('Hello-World.helloWorld', () => {
		let panel = vscode.window.createWebviewPanel(
			'myWebview', // 标识符,需要唯一
			'My Webview', // 标题
			vscode.ViewColumn.One, // 第一列
			{}
		);
    // 设置HTML内容
    panel.webview.html = getWebviewContent();
	});
	context.subscriptions.push(disposable);
}

3. 在 Webview 中加载 HTML 页面

在插件中创建 Webview 后,需要使用 webview.html 属性加载一个 HTML 页面。例如:

function getWebviewContent() { 
  return `
  <!DOCTYPE html>
  <html>
  <head>
      <meta charset="UTF-8">
      <title>Hello Webview</title>
  </head>
  <body>
      <h1>Hello Webview!</h1>
  </body>
  </html>
  `;
}

完成后进入 VS Code,按下F5,你会立即看到一个插件打开主机窗口,其中就运行着插件。在命令面板(Ctrl+Shift+P)中输入Hello World命令,可以看到如下效果。

bb03508ccacab63ef952f04bf313774a.gif

4. 给webview动态传值更新webview的内容

这里引用官方的例子

/**
      * 4 webview
      * 可以给webview传值,动态改变内容的webview
   */
   const cats = {
      'Coding Cat': 'https://media.giphy.com/media/JIX9t2j0ZTN9S/giphy.gif',
      'Compiling Cat': 'https://media.giphy.com/media/mlvseq9yvZhba/giphy.gif'
      };
		let disposable = vscode.commands.registerCommand('Hello-World.helloWorld', () => {
		  const panel = vscode.window.createWebviewPanel(
        'myWebview', // 标识符,需要唯一
        'My Webvie', // 标题
        vscode.ViewColumn.One, //  第一列
        {} // webview其他的选项
		  );
		  let iteration = 0;
		  const updateWebview = () => {
        const cat = iteration++ % 2 ? 'Compiling Cat' : 'Coding Cat';
        panel.title = cat;
        panel.webview.html = getWebviewContent(cat);
		  };
		   // 设置初始化内容
		  updateWebview();
       // 每秒更新内容
      setInterval(updateWebview, 1000);
    context.subscriptions.push(disposable);
function getWebviewContent(cat: keyof typeof cats) {
  return
    `
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Cat Coding</title>
        </head>
        <body>
            <img src="${cats[cat]}" width="300" />
        </body>
        </html>
  `;
}

那么如何与 VS Code 进行交互?

Webview 与 VS Code 之间的交互是通过 Webview 的 API 进行的。通过 API,开发者可以从 Webview 中向 VS Code 发送消息,并从 VS Code 中接收消息。

在 Webview 中,可以使用 vscode.postMessage 方法向 VS Code 发送消息:

1. 在 Webview 中调用插件 API

为了让 Webview 能够与插件交互,需要在 Webview 中使用 acquireVsCodeApi 方法获取一个 vscode 对象,并将其传递给 JavaScript,以便在 JavaScript 中调用插件 API。例如

const vscode = acquireVsCodeApi();
  vscode.postMessage({
      command: 'showMessage',
      text: 'Hello from Webview!'
  });

2. 在插件中监听 Webview 的消息

在 VS Code 中,可以通过监听 WebviewPanel.onDidReceiveMessage 事件来接收来自 Webview 的消息。例如:

webview.onDidReceiveMessage(message => {
    switch (message.command) {
        case 'showMessage':
            vscode.window.showInformationMessage(message.text);
            break;
    }
  });

下面我们来实现一个具体的demo,来看下webview与vscode 之间的交互:

import * as vscode from 'vscode';
  export function activate(context: vscode.ExtensionContext) {
    // 创建 Webview 面板
    const panel = vscode.window.createWebviewPanel(
      'myWebview', // 面板 ID
      'My Webview', // 面板标题
      vscode.ViewColumn.One, // 显示位置
      { enableScripts: true } // 启用 JavaScript
    );
    // 在 Webview 中加载 HTML 页面
    panel.webview.html = getWebviewContent();;
    // 监听 Webview 发送的消息
    panel.webview.onDidReceiveMessage(message => {
      if (message.type === 'buttonClick') {
        // 在 VS Code 中显示提示框
        vscode.window.showInformationMessage('Button clicked in Webview!');
      }
    });
    // 在 VS Code 中注册命令
    let disposable = vscode.commands.registerCommand('Hello-World.helloWorld', () => {
      // 向 Webview 发送消息
      panel.webview.postMessage({ type: 'showButton' });
    });
    context.subscriptions.push(disposable);
  }
  function getWebviewContent() {
    return `
      <html>
        <body>
          <button id="myButton">Click me</button>
          <script>
            const vscode = acquireVsCodeApi();
            const myButton = document.getElementById('myButton');
            myButton.addEventListener('click', () => {
              vscode.postMessage({ type: 'buttonClick' });
            });
          </script>
        </body>
      </html>
    `;
  }

下图为 点击 按钮之后的效果。


27631506867715c3c968a9c852482a2b.png

在这个示例中,我们创建了一个 Webview 面板,并在其中加载了一个简单的 HTML 页面,其中包含一个按钮。当用户点击该按钮时,我们向 VS Code 发送了一个消息,并在 VS Code 中显示了一个提示框。在 VS Code 中,我们还注册了一个命令 Hello-World.helloWorld,当用户执行该命令时,我们向 Webview 发送了一个消息,以便在 Webview 中显示按钮。

通过 Webview,我们可以在 VS Code 和 Web 应用程序之间进行双向通信,从而实现各种功能。

结论

通过以上步骤,我们可以创建一个带有 Webview 的 VSCode 插件,并在其中使用 Webview 技术。Webview 可以让我们在插件中嵌入交互式的 HTML 页面,从而提高开发效率和用户体验。而且通过 Webview,开发者可以将自己的 Web 技能应用于 VS Code 插件开发中,并实现各种功能。

参考来源

https://code.visualstudio.com/docs

‍https://code.visualstudio.com/api/get-started/your-first-extension

https://code.visualstudio.com/api/references/vscode-api#window.createWebviewPanel

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

662b79d6c2dbcd9d1b47f2e2942b9c2b.png

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

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

相关文章

功率放大器在MTT检测超声医疗中的应用

实验名称&#xff1a;MTT检测超声激活血卟啉对SW-480细胞的杀伤作用 研究方向&#xff1a;超声医疗 测试目的&#xff1a; 自提出激光与血卟啉结合具有明显的抗肿瘤效应&#xff0c;PDT法在诊治肿瘤方面已做了大量研究并在临床中得到应用。但由于激光对组织穿透力较差&#xff…

C语言CRC-8 ROHC格式校验函数

C语言CRC-8 ROHC格式校验函数 CRC校验基于前处理和后处理的不同&#xff0c;由不同的协会标准推出了一些不同格式的版本。这里介绍CRC-8 ROHC格式的校验函数。 CRC-8 ROHC格式特征 标准CRC-8的校验函数参考&#xff1a; C语言标准CRC-8校验函数 CRC-8 ROHC格式有如下的不同&…

Numpy从入门到精通——详解广播机制

这个专栏名为《Numpy从入门到精通》&#xff0c;顾名思义&#xff0c;是记录自己学习numpy的学习过程&#xff0c;也方便自己之后复盘&#xff01;为深度学习的进一步学习奠定基础&#xff01;希望能给大家带来帮助&#xff0c;爱睡觉的咋祝您生活愉快&#xff01; 这一篇介绍《…

机器学习-线性模型(波士顿房价预测)

机器学习-线性模型(波士顿房价预测) 文章目录 机器学习-线性模型(波士顿房价预测)人工智能、机器学习、深度学习的关系机器学习深度学习 波士顿房价预测数据集介绍模型假设 → \rightarrow →线性回归模型评价函数 → \rightarrow →均方误差线性回归模型网络结构实现波士顿房价…

HummerRisk V1.0 安装部署指南

HummerRisk v1.0 开始采用 springcloud 微服务架构&#xff0c;微服务架构更加易于扩展、易于容错、灵活部署&#xff0c;但是需要注意的是 HummerRisk v0.x 版本无法直接升级到 v1.0&#xff0c;如需使用 HummerRisk 请手动安装最新版本。 环境要求 全新安装的 Linux(x64)需要…

HashMap详解

手撕HashMap源码 HashMap一直是面试的重点。今天我们来了解了解它的源码吧&#xff01; 首先看一下Map的继承结构图 源码分析 什么是哈希 **Hash&#xff0c;一般翻译做“散列”&#xff0c;也有直接音译为“哈希”的&#xff0c;就是把任意长度的输入&#xff0c;通过散列算…

【Python语法系列】第三章:Python判断语句

进行逻辑判断&#xff0c;是生活中常见的行为。同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能&#xff0c;一个逻辑判断的流程非常简单&#xff0c;我们有一个判断的条件&#xff0c;那么他无非给我们返回两个结果&#xff0c;是或者否&#xff0c;是的…

Ubuntu22.04部署Pytorch2.0深度学习环境

文章目录 安装Anaconda创建新环境安装Pytorch2.0安装VS CodeUbuntu下实时查看GPU状态的方法小实验&#xff1a;Ubuntu、Windows10下GPU训练速度对比 Ubuntu安装完显卡驱动、CUDA和cudnn后&#xff0c;下面部署深度学习环境。 &#xff08;安装Ubuntu系统、显卡驱动、CUDA和cudn…

成本降低33%!英飞凌挑战智能汽车「高功率密度」瓶颈

伴随着汽车电动化、智能化的逐步推进&#xff0c;功率半导体器件的需求激增。其中&#xff0c;MOSFET作为新能源汽车中DC-DC、OBC等电源系统的重要组成部分&#xff0c;应用于汽车动力域以完成电能的转换与传输。同时&#xff0c;MOSFET还是可以用于ADAS、安全、信息娱乐等功能…

华为流程体系:MPP流程

今天主要来讲讲IPD中营销侧的另一个流程&#xff1a;MPP 流程。 在讲解MTL流程时&#xff0c;提到过MTL流程的底层逻辑是4C营销理论。 换句话说就是&#xff0c;MTL 流程是面向客户的产品上市流程。 而MPP流程则是面向产品的上市流程&#xff0c;它的底层逻辑就是经典的4P营…

新工具、新升级,推陈出新的测试好帮手

前言 【推陈出新】才是我们搞IT的正确发展方向&#xff0c;我们要以发展的眼光来看待我们使用的测试工具&#xff0c;如何升级您手中的测试工具&#xff0c;我们来品一品Eoink的Apikit五个维度对比我们之前用的测试工具&#xff1f; 我会按照&#xff1a;基础功能全面与否、大型…

Golang每日一练(leetDay0048) 链表专题

目录 141. 环形链表 Linked List Cycle &#x1f31f; 142. 环形链表 II Linked List Cycle II &#x1f31f;&#x1f31f; 143. 重排链表 Reorder List &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一…

全光谱防蓝光护眼灯有用吗?怎么分辨是全光谱灯

每个人的家里都有一两个台灯&#xff0c;孩子用来学习&#xff0c;老人用来阅读。但台灯不仅仅是用来照明而已&#xff0c;还需要呵护我们的双眼。现在的孩子患近视的人越来越多&#xff0c;很多小学生都戴上了眼镜&#xff0c;而老年人老花眼白内障的患者也在攀升&#xff0c;…

华三(H3C)GRE OVER IPsec实验

实验拓扑 目录 实验需求 1. 某企业北京总部、上海分支、武汉分支分别通过 R1&#xff0c;R3&#xff0c;R4 接入互联网&#xff0c;配置默认路由连通公网 2. 按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 分别配置 Loopback0 口匹配感兴趣流&#xff0…

电子行业数字工厂管理系统有哪些优点和不足

随着制造业的不断发展&#xff0c;其生产技术也在不断改进&#xff0c;有许多电子企业都在部署数字工厂管理系统&#xff0c;进行数字化转型。如果不了解数字工厂管理系统&#xff0c;盲目部署的话&#xff0c;容易走很多弯路。本文将跟大家探讨一下&#xff0c;电子行业数字工…

本地Linux服务器安装宝塔面板,并公网远程登录

文章目录 前言1. 安装宝塔2. 安装cpolar内网穿透3. 远程访问宝塔4. 固定http地址5. 配置二级子域名6. 测试访问二级子域名 前言 宝塔面板作为建站运维工具&#xff0c;它支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能&#xff0c;可提高运维效率。…

云原生|Packer插件开发在项目中应用

作者&#xff1a;李冠军 神州数码云基地 高级后端开发工程师 云时代我们可以在各云厂商控制台点一点&#xff0c;实例就生成了&#xff0c;但是这个点还是需要自己去点&#xff0c;如果把这些动作写成代码&#xff0c;直接运行&#xff0c;一切就完成了。 这就是Packer的作用…

使用Markdown编辑器

使用Markdown编辑器 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注…

总结833

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;背《美丽心灵》&#xff0c;背《大独裁者》五六段&#xff0c;六百四十字的文章&#xff0c;明天加…

Java中的序列化与反序列化

序列化和反序列化作为 Java 里一个较为基础的知识点&#xff0c;但我相信很多人能了解的也就是那么几句而已&#xff0c;甚至都不了解&#xff0c;如果再深究问一下 Java 如何实现序列化和反序列化的&#xff0c;就可能不知所措了&#xff01; 不知道怎么说好&#xff0c;什么是…