VS Code 扩展开发如何保持用户视觉体验一致

news2024/11/15 13:23:35

本文介绍如何在 VS Code 插件的 webview 中加载本地的资源文件,并如何使用 VS Code 自身的 UI 来实现用户视觉体验的一致。

背景

最近想做一个 VS Code 的插件用来简便我使用 VS Code 来编辑 Markdown 博客的体验,在设计插件的过程中,因为需要在 webview 界面中使用到下拉框,想到为了节省插件大小,并考虑到用户体验一致性,故需要使用 VS Code 自身的 UI 库。

寻找蛛丝马迹:获取安装目录

因为我不清楚到底要如何去做,就先自己探索。先打开了 VS Code 的开发人员工具进行元素审查,看到是 workbench.desktop.main.css 这个文件。

审查html

<link rel="stylesheet" type="text/css" data-name="vs/workbench/workbench.desktop.main" href="vscode-file://vscode-app/d:/Program%20Files/Microsoft%20VS%20Code/resources/app/out/vs/workbench/workbench.desktop.main.css">

根据以上信息我们可以得知,其实际目录需要特殊的魔法去获取,因为引用的路径是安装目录的位置,不同电脑的肯定是不一样的。

这里我们就前往 VS Code 的仓库去扒拉源代码,最后虽然根据 vs/workbench/workbench.desktop.main 找到了一些线索,但是不堪大用啊,还是需要找到安装目录才行。几番折腾发现源码里获取软件版本信息 product.json 的方法,原来里面有环境变量啊。

const product = JSON.parse(fs.readFileSync(path.join(env.appRoot, 'product.json'), { encoding: 'utf-8' }));

那么,若在插件中要想获取到安装目录,直接使用下面的方法就好了:

const vscodeInstallPath = vscode.env.appRoot;

插件中获取

一波三折,并不顺利

首先在插件中,我们获取 html 内容后替换占位符信息如下:

const appRoot = vscode.Uri.file(vscode.env.appRoot);
this.view.webview.html = html.replace(/\[insert-vscode-root\]/g,`${appRoot}`);

通过替换 webview 页面的引用信息,实现动态的 workbench.desktop.main.css 资源引用后,不出意外的出了意外了:

出错

虽然看起来引用的路径是没有什么问题了,但是结果却令人糟心啊:

Not allowed to load local resource

期间我尝试了 vscode-file://vscode-app/ 协议直接拼接 appRootasWebviewUri 但是并没有成功获取到,都是网络错误。

asWebviewUri 看起来似乎有些靠谱,观察开发人员工具中的网络请求似乎很多都是这样类似的连接:

https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/sangsq/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/workbench/workbench.desktop.main.css

不过这个 net::ERR_ABORTED 401 却是让人高兴不起来,貌似权限问题。此时凌晨已至,夜寒露重,故搜索了一遍 Stackoverflow 后,便提了一个问题关机睡觉。

继续探索

在没有获得到答案后,还是要靠自己。认真看看官方文档,在扩展指南的加载本地内容中得到了一些答案。

出于安全原因,Webview 运行在隔离的环境中,无法直接访问本地资源。想从扩展加载图片、样式表或其他资源,或者从用户当前的工作区加载任何内容,必须使用 Webview.asWebviewUri 来转换为一个特殊的 URI 来使用。

前面已经提到我用过了 Webview.asWebviewUri 但是还有一些其他限制,默认情况下 Webview 只能访问以下位置的资源:

  • 扩展程序的安装目录
  • 用户当前的活动工作区

使用 WebviewOptions.localResourceRoots 可以允许访问其他本地资源。

createWebviewPanel 方法的第4个参数 webviewOptions.localResourceRoots 是一个只读数组,默认情况就是之前提的扩展程序的安装目录和用户当前的活动工作区。当然你也可以设置成空数组,这样就禁止访问任何本地资源。

这样在创建时稍作修改就可以了。

this.view = vscode.window.createWebviewPanel(
    "blogPreview",
    "Markdown Blog Preview",
    vscode.ViewColumn.Two,
    {
        enableScripts: true,
        localResourceRoots: [
            vscode.Uri.file(path.join(context.extensionPath, "html")),
            vscode.Uri.file(vscode.env.appRoot)
        ]
    }
);

在 html 内容中替换指定的字符串:

<link rel="stylesheet" type="text/css" href="[insert-vscode-css]">
const cssfile = vscode.Uri.file(path.join(vscode.env.appRoot,"out/vs/workbench/workbench.desktop.main.css"));
const cssurl = this.view.webview.asWebviewUri(cssfile);
this.view.webview.html = html.replace(/\[insert-vscode-css\]/g,`${cssurl}`);

最后成果

在 workbench 目录中还存在有其他可用资源,这里仅对 select 的效果做个演示。

未使用 VS Code 的 UI 时:

未使用

使用 VS Code 的 UI 时:

使用

另外在 Webview 的 html 显示中会被加入当前的样式和主题信息,需要自行进行适配调整。

<html lang="zh-CN" style="--vscode-font-family:………略,太多了………">
<body role="document" class="vscode-dark" data-vscode-theme-kind="vscode-dark" data-vscode-theme-name="Dark+ (default dark)" data-vscode-theme-id="Default Dark+">

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

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

相关文章

计算机毕业论文Java项目源码下载S2SH智慧社区管理系统[包运行成功]

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《基于S2SH实现的智慧社区管理系统》该项目采用技术jsp、strust2、Spring、hibernate、tomcat服务器、mysql数据库 &#xff0c;项目含有源码、答…

力扣hot100——第6天:32最长有效括号、33搜索旋转排序数组、34在排序数组中查找元素的第一个和最后一个位置

文章目录1.32最长有效括号1.1.题目1.2.解答2.33搜索旋转排序数组2.1.题目2.2.解答3.34在排序数组中查找元素的第一个和最后一个位置【代码随想录已刷】1.32最长有效括号 参考&#xff1a;力扣题目链接&#xff1b;题解1&#xff0c;题解2 1.1.题目 1.2.解答 这道题目官方的题…

FAT12文件系统

简介 FAT12文件系统是指&#xff1a;在磁盘上规定一种特定的存储格式&#xff0c;这种存储格式高效方便&#xff0c;功能强大&#xff0c;因此形成了统一的规定。 基础知识 具体来说FAT12文件系统为1.44M的软盘设计。1.44M的软盘有2880个扇区&#xff0c;一个扇区有512个字节&…

大数据下一代变革之必研究数据湖技术Hudi原理实战双管齐下-后续

文章目录集成Flink编程示例打包运行CDC入湖概述MySQL 启用 binlog初始化MySQL 源数据表准备Jar包依赖flink读取mysql binlog写入kafkaflink读取kafka数据并写入hudi数据湖调优MemoryParallelismCompaction集成Hive集成步骤Flink同步HiveHive Catalog集成Flink 编程示例 本节通…

[附源码]计算机毕业设计springboot右脑开发教育课程管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

微服务框架 SpringCloud微服务架构 10 使用Docker 10.4 容器命令案例1

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.4 容器命令案例110.4.1 直接开干10.4.2 总结10 使用Docke…

03_openstack之项目及用户管理

目录 一、环境准备 二、项目管理 1、项目介绍 2、创建项目 三、用户管理 1、用户介绍 2、创建用户 一、环境准备 部署openstack私有云环境&#xff0c;步骤&#xff1a;02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 以下操作均基于上述环境 二、项目管理 1、…

[附源码]计算机毕业设计springboot在线票务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于采样的规划算法之RRT家族(三):RRT*

RRT算法是边随机产生节点边生长一棵路径树,当这棵树与目标点相遇,便从相遇点回溯到起点得到路径解。对于新产生的随机节点,原始RRT算法将路径树上距离它最近的节点作为它的父节点,并不能保证新节点通过该父节点就是最短路径。并且,就算新节点连接是最优的,也无法保证未来…

快速统计文本数字之和

实例需求&#xff1a;A列到F列为文本数据&#xff0c;每个单元格中包含3个数字&#xff0c;数字之间使用竖线分隔&#xff0c;现需要计算每个单元格中的数字之后。 例如F15单元格内容为10┃5┃18&#xff0c;则需要计算10、5、18三个数字之和&#xff0c;结果为33&#xff0c;…

【RTS】李宇翔 monibuca 讲座 学习

不解码,如何跳帧、追帧。启动工程,方便二次开发 按需引入引擎和插件流媒体应用 监控 : 物联网。转发 :用于会议,里面有很多会控逻辑,不同于流媒体本身。 起源于 FLASH视频会议 cs fms ams ,red5crtmpserver 很多问题 streaming服务器很难开发monaserver 基础上开发monib…

事业编招聘:新华社2023校园招聘正式启动

新华社是党中央一手创办和领导的新闻舆论机构&#xff0c;随着中国人民的革命事业和社会主义建设事业的发展而成长壮大&#xff0c;是一个具有光荣历史和优良传统作风的新闻机构。 新华社作为党中央喉舌、耳目、智库&#xff0c;是党的新闻舆论工作主力军、主渠道、主阵地。 …

【随笔记】分享一下26个常用的IDEA插件

文章目录1. Chinese Language2. Atom Material Icon3. Rainbow Brackets4. Translation5. Codota6. GenerateAllSetter7. GsonFormatPlus8. Alibaba Java Coding Guidelines9. Free Mybatis Tool10. maven-search11. Maven Helper12. CodeGlance Pro13. MyBatisCodeHelperPro14…

[附源码]计算机毕业设计学生在线考试系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计颐养天年辅助平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]JAVA毕业设计健康生活网站(系统+LW)

[附源码]JAVA毕业设计健康生活网站&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

114页5万字字智能交通大数据综合服务平台建设方案

目录 1.项目概述 1 1.1 项目名称 2 1.2 项目承担单位 2 1.3 建设方案编写单位 2 1.4 建设方案编制依据 2 1.5 建设目标、规模、周期 4 2.项目建设的必要性和可行性 6 2.1 现状及成果 6 2.1.1 xxx县交通运输局 6 2.2.2 公路管理领域 7 2.2.3 港航管理领域 7 2.2.4 工程质监领域 …

URL转发请求

URL转发请求目录概述需求&#xff1a;设计思路实现思路分析1.一种方法2.第二种方法&#xff1a;参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for ch…

谷粒商城十二性能压测

在分布式开发中&#xff0c;我们将每一一种服务都抽取成一个独立的模块&#xff0c;微服务模块在真正的上线之前&#xff0c;甚至是上线以后&#xff0c;我们都要进行压力测试&#xff0c;才能投入正常的使用。 压力测试是为了我们的系统在当前软硬件环境下&#xff0c;最大的…

uni-app引入海康威视h5player实现视频监控的播放

uni-app引入海康威视h5player实现视频监控的播放知识储备工具下载webplayer.htmlh5player.vue知识储备 uni-app web-view组件相关知识&#xff1a;点击学习。海康威视相关工具下载&#xff1a;点击跳转下载。web-view组件不全屏显示&#xff1a;uni-app web-view 如果设置不全…