当前位置:首页 > 科技  > 软件

手把手教你开发自己的VSCode插件

来源: 责编: 时间:2024-03-19 09:26:36 133观看
导读一、前言在VSCode市场上搜索一个PDF阅读插件,找到了下载量最高的插件。在检查了插件的源代码之后,发现它直接嵌入了pdf.js的Web界面。图片开发这样的插件并不复杂,只需要一些插件开发的知识。接下来,将在这里与大家分享这

一、前言

在VSCode市场上搜索一个PDF阅读插件,找到了下载量最高的插件。在检查了插件的源代码之后,发现它直接嵌入了pdf.js的Web界面。3An28资讯网——每日最新资讯28at.com

图片图片3An28资讯网——每日最新资讯28at.com

开发这样的插件并不复杂,只需要一些插件开发的知识。3An28资讯网——每日最新资讯28at.com

接下来,将在这里与大家分享这个插件是如何开发的。虽然与源代码可能有些许不同,但基本原理是相同的。3An28资讯网——每日最新资讯28at.com

二、定义自定义编辑器

默认情况下,VSCode不直接支持查看某些特定类型的文件。但是,你可以通过使用自定义编辑器(customerEditors)来扩展其功能。3An28资讯网——每日最新资讯28at.com

通过customerEditors,你可以创建完全可自定义的读/写编辑器,以替换VSCode的标准文本编辑器,用于处理特定类型的资源。3An28资讯网——每日最新资讯28at.com

例如,在编辑Markdown文件时,可以创建一个自定义编辑器,从而实时预览Markdown的渲染效果。3An28资讯网——每日最新资讯28at.com

对于PDF文件的预览,同样也可以使用customerEditors功能。3An28资讯网——每日最新资讯28at.com

首先,在插件的pacakge.json文件中定义它:3An28资讯网——每日最新资讯28at.com

"contributes": {  "customEditors": [    {      "viewType": "dodo-reader.pdfEditor",      "displayName": "PDF Viewer",      "selector": [        {          "filenamePattern": "*.pdf"        }      ]    }  ]}

三、注册自定义编辑器

创建一个实现vscode.CustomEditorProvider接口的类。该接口包含了用于管理自定义编辑器(例如打开和保存)的方法。例如:3An28资讯网——每日最新资讯28at.com

class PdfEditorProvider implements Partial { constructor() { // 可在此处进行初始化操作 }resolveCustomEditor(document: CustomDocument, webviewPanel: WebviewPanel, _token: CancellationToken) { // 基于URI创建一个自定义文档,并返回一个自定义文档对象 }openCustomDocument(uri: vscode.Uri, openContext: vscode.CustomDocumentOpenContext, token: vscode.CancellationToken) { // 将自定义文档与Webview面板关联,并处理编辑器内容与Webview之间的交互 }} // 注册你的提供程序const myProvider = new PdfEditorProvider();const disposable = vscode.window.registerCustomEditorProvider('dodo-reader.pdfEditor', myProvider);context.subscriptions.push(disposable);

四、改进视图提供程序

如上所述注册自定义编辑器之后,下一步就是加强PdfEditorProvider接口,以定义视图的显示方式。3An28资讯网——每日最新资讯28at.com

显示涉及使用网络视图,而你将使用pdf.js的Web视图程序。首先,下载预构建的程序(现代浏览器),并将其提取到你的项目目录中。3An28资讯网——每日最新资讯28at.com

图片图片3An28资讯网——每日最新资讯28at.com

这个程序可以直接在浏览器中访问。在目录中启动一个服务,并打开地址:3An28资讯网——每日最新资讯28at.com

你可以通过添加查询参数?file=fileUrl来打开PDF文件。3An28资讯网——每日最新资讯28at.com

4.1 openCustomDocument

当打开PDF文件时,首先会调用openCustomDocument方法。你可以基于传入的URI创建一个自定义文档对象。该文档对象将包含你想要编辑的内容。在这个程序中,不进行任何处理,而是直接返回一个包含URI的对象,该对象将传递给resolveCustomEditor方法的document参数。3An28资讯网——每日最新资讯28at.com

openCustomDocument(uri: vscode.Uri, openContext: vscode.CustomDocumentOpenContext, token: vscode.CancellationToken) { return {   uri,   dispose: () => { } };}

4.2 resolveCustomEditor

在resolveCustomEditor方法中,可以定义要显示的视图,程序如下。3An28资讯网——每日最新资讯28at.com

resolveCustomEditor(document: CustomDocument, webviewPanel: WebviewPanel, _token: CancellationToken) {   webviewPanel.webview.html = 'Hello World!';}

要显示PDF文件,只需将下载的PDF程序的HTML内容替换为当前的webviewPanel.webview.html值。最初认为可以更改为:3An28资讯网——每日最新资讯28at.com

// 嵌入一个iframe以查看PDFwebviewPanel.webview.html = `                            `

这个方法是最简单的,但令人意外的是,iframe没有显示内容。这可能是由于VSCode的安全策略限制造成的。3An28资讯网——每日最新资讯28at.com

因此,在这里考虑了另一种方法:读取PDF视图主页的HTML内容,并将其赋值给webviewPanel.webview.html。3An28资讯网——每日最新资讯28at.com

然而,这种方法可能会遇到一个问题:如何向PDF视图程序提供文件链接。3An28资讯网——每日最新资讯28at.com

如前所述,PDF视图程序将通过查询参数“file.”获取文件链接。如果没有提供此参数,程序将读取默认链接。以下是一个相关的源代码示例:3An28资讯网——每日最新资讯28at.com

file = params.get("file") ?? _app_options.AppOptions.get("defaultUrl");

然而,直接赋值HTML文本不能通过URL提供“file”的值。这可能需要修改源代码。尽管修改源代码可能会带来一些不便,但一开始似乎也没有其他办法,所以不得不尝试一下。一种方法是改变获取“file”值的方式,直接从全局变量中获取。可以使用如下方法在HTML内容中添加“file”值:3An28资讯网——每日最新资讯28at.com

window.file = 'https://...'

然后将上述源代码修改为:3An28资讯网——每日最新资讯28at.com

file = window.file ?? _app_options.AppOptions.get("defaultUrl");

然而,就在我以为成功即将到来的时候,出现了一个红色错误:“加载PDF时出现错误。文件来源与阅览器不匹配”。3An28资讯网——每日最新资讯28at.com

经过进一步调查,在相应的源代码中发现了一个“fileinputchange”事件监听处理程序,如下所示:3An28资讯网——每日最新资讯28at.com

var webViewerFileInputChange = function (evt) { if (PDFViewerApplication.pdfViewer?.isInPresentationMode) {   return; } const file = evt.fileInput.files[0]; PDFViewerApplication.open({   url: URL.createObjectURL(file),   originalUrl: file.name });};

从代码中很容易看出,一旦检测到文件发生更改,就会立即调用open方法打开文件。重要的是要注意,该open方法并不验证URL是否与当前源相匹配。目前,它使用了一个blob链接。在这种情况下,我们是否可以在初始化后直接调用open方法来打开文件呢?经过一些改造,最终证明是可行的。以下是修改后的代码示例:3An28资讯网——每日最新资讯28at.com

resolveCustomEditor(document: CustomDocument, webviewPanel: WebviewPanel, _token: CancellationToken) {   webviewPanel.webview.options = {     enableScripts: true,     localResourceRoots: [vscode.Uri.file(path.dirname(document.uri.fsPath)), this.context.extensionUri]  };   const base = vscode.Uri.joinPath(this.context.extensionUri, 'dist/web/pdf/web/')   webviewPanel.webview.html = readFileSync(path.join(base.fsPath, 'viewer.html'), 'utf8').replace('', `          `)}

对上面的关键代码进行分析:3An28资讯网——每日最新资讯28at.com

  • localResourceRoots参数:该参数的目的是定义可以通过Web URL访问的目录。在这里,需要明确定义两个目录:一个用于打开PDF文件的当前目录,另一个用于插件所在的目录。确保两者都正确定义,否则可能在访问时遇到401错误。
  • tag:通过设置tag,可以为网页内部加载资源提供基本路径。确保资源能够正确加载。
  • setTimeout函数:在调用程序打开文件时使用setTimeout的目的是在打开默认PDF文件后再打开所需的PDF文件。这样可以防止后面执行打开默认PDF的操作覆盖想要打开的PDF(尽管实际上会出现默认文件错误,但不会产生实质性影响)。

与之前提到的PDF插件实现相比,这种实现要简单得多,但原理基本相同。3An28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-77691-0.html手把手教你开发自己的VSCode插件

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 探索 useSyncExternalStore,一个鲜为人知的 React Hook

下一篇: 英特尔俄亥俄州新晶圆厂投运时间推迟至 2027~2028 年

标签:
  • 热门焦点
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    7月27日消息,据外媒报道,从三星电子所发布的财报来看,他们主要利润来源的存储芯片业务在今年二季度仍不乐观,营收同比仍在大幅下滑,所在的设备解决方案
  • OPPO K11搭载高性能石墨散热系统:旗舰同款 性能凉爽释放

    OPPO K11搭载高性能石墨散热系统:旗舰同款 性能凉爽释放

    日前OPPO官方宣布,将于7月25日14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top