日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

手把手教你開發(fā)自己的VSCode插件

來源: 責(zé)編: 時(shí)間:2024-03-19 09:26:36 195觀看
導(dǎo)讀一、前言在VSCode市場(chǎng)上搜索一個(gè)PDF閱讀插件,找到了下載量最高的插件。在檢查了插件的源代碼之后,發(fā)現(xiàn)它直接嵌入了pdf.js的Web界面。圖片開發(fā)這樣的插件并不復(fù)雜,只需要一些插件開發(fā)的知識(shí)。接下來,將在這里與大家分享這

一、前言

在VSCode市場(chǎng)上搜索一個(gè)PDF閱讀插件,找到了下載量最高的插件。在檢查了插件的源代碼之后,發(fā)現(xiàn)它直接嵌入了pdf.js的Web界面。33q28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片33q28資訊網(wǎng)——每日最新資訊28at.com

開發(fā)這樣的插件并不復(fù)雜,只需要一些插件開發(fā)的知識(shí)。33q28資訊網(wǎng)——每日最新資訊28at.com

接下來,將在這里與大家分享這個(gè)插件是如何開發(fā)的。雖然與源代碼可能有些許不同,但基本原理是相同的。33q28資訊網(wǎng)——每日最新資訊28at.com

二、定義自定義編輯器

默認(rèn)情況下,VSCode不直接支持查看某些特定類型的文件。但是,你可以通過使用自定義編輯器(customerEditors)來擴(kuò)展其功能。33q28資訊網(wǎng)——每日最新資訊28at.com

通過customerEditors,你可以創(chuàng)建完全可自定義的讀/寫編輯器,以替換VSCode的標(biāo)準(zhǔn)文本編輯器,用于處理特定類型的資源。33q28資訊網(wǎng)——每日最新資訊28at.com

例如,在編輯Markdown文件時(shí),可以創(chuàng)建一個(gè)自定義編輯器,從而實(shí)時(shí)預(yù)覽Markdown的渲染效果。33q28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于PDF文件的預(yù)覽,同樣也可以使用customerEditors功能。33q28資訊網(wǎng)——每日最新資訊28at.com

首先,在插件的pacakge.json文件中定義它:33q28資訊網(wǎng)——每日最新資訊28at.com

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

三、注冊(cè)自定義編輯器

創(chuàng)建一個(gè)實(shí)現(xiàn)vscode.CustomEditorProvider接口的類。該接口包含了用于管理自定義編輯器(例如打開和保存)的方法。例如:33q28資訊網(wǎng)——每日最新資訊28at.com

class PdfEditorProvider implements Partial { constructor() { // 可在此處進(jìn)行初始化操作 }resolveCustomEditor(document: CustomDocument, webviewPanel: WebviewPanel, _token: CancellationToken) { // 基于URI創(chuàng)建一個(gè)自定義文檔,并返回一個(gè)自定義文檔對(duì)象 }openCustomDocument(uri: vscode.Uri, openContext: vscode.CustomDocumentOpenContext, token: vscode.CancellationToken) { // 將自定義文檔與Webview面板關(guān)聯(lián),并處理編輯器內(nèi)容與Webview之間的交互 }} // 注冊(cè)你的提供程序const myProvider = new PdfEditorProvider();const disposable = vscode.window.registerCustomEditorProvider('dodo-reader.pdfEditor', myProvider);context.subscriptions.push(disposable);

四、改進(jìn)視圖提供程序

如上所述注冊(cè)自定義編輯器之后,下一步就是加強(qiáng)PdfEditorProvider接口,以定義視圖的顯示方式。33q28資訊網(wǎng)——每日最新資訊28at.com

顯示涉及使用網(wǎng)絡(luò)視圖,而你將使用pdf.js的Web視圖程序。首先,下載預(yù)構(gòu)建的程序(現(xiàn)代瀏覽器),并將其提取到你的項(xiàng)目目錄中。33q28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片33q28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)程序可以直接在瀏覽器中訪問。在目錄中啟動(dòng)一個(gè)服務(wù),并打開地址:33q28資訊網(wǎng)——每日最新資訊28at.com

你可以通過添加查詢參數(shù)?file=fileUrl來打開PDF文件。33q28資訊網(wǎng)——每日最新資訊28at.com

4.1 openCustomDocument

當(dāng)打開PDF文件時(shí),首先會(huì)調(diào)用openCustomDocument方法。你可以基于傳入的URI創(chuàng)建一個(gè)自定義文檔對(duì)象。該文檔對(duì)象將包含你想要編輯的內(nèi)容。在這個(gè)程序中,不進(jìn)行任何處理,而是直接返回一個(gè)包含URI的對(duì)象,該對(duì)象將傳遞給resolveCustomEditor方法的document參數(shù)。33q28資訊網(wǎng)——每日最新資訊28at.com

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

4.2 resolveCustomEditor

在resolveCustomEditor方法中,可以定義要顯示的視圖,程序如下。33q28資訊網(wǎng)——每日最新資訊28at.com

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

要顯示PDF文件,只需將下載的PDF程序的HTML內(nèi)容替換為當(dāng)前的webviewPanel.webview.html值。最初認(rèn)為可以更改為:33q28資訊網(wǎng)——每日最新資訊28at.com

// 嵌入一個(gè)iframe以查看PDFwebviewPanel.webview.html = `                            `

這個(gè)方法是最簡(jiǎn)單的,但令人意外的是,iframe沒有顯示內(nèi)容。這可能是由于VSCode的安全策略限制造成的。33q28資訊網(wǎng)——每日最新資訊28at.com

因此,在這里考慮了另一種方法:讀取PDF視圖主頁的HTML內(nèi)容,并將其賦值給webviewPanel.webview.html。33q28資訊網(wǎng)——每日最新資訊28at.com

然而,這種方法可能會(huì)遇到一個(gè)問題:如何向PDF視圖程序提供文件鏈接。33q28資訊網(wǎng)——每日最新資訊28at.com

如前所述,PDF視圖程序?qū)⑼ㄟ^查詢參數(shù)“file.”獲取文件鏈接。如果沒有提供此參數(shù),程序?qū)⒆x取默認(rèn)鏈接。以下是一個(gè)相關(guān)的源代碼示例:33q28資訊網(wǎng)——每日最新資訊28at.com

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

然而,直接賦值HTML文本不能通過URL提供“file”的值。這可能需要修改源代碼。盡管修改源代碼可能會(huì)帶來一些不便,但一開始似乎也沒有其他辦法,所以不得不嘗試一下。一種方法是改變獲取“file”值的方式,直接從全局變量中獲取。可以使用如下方法在HTML內(nèi)容中添加“file”值:33q28資訊網(wǎng)——每日最新資訊28at.com

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

然后將上述源代碼修改為:33q28資訊網(wǎng)——每日最新資訊28at.com

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

然而,就在我以為成功即將到來的時(shí)候,出現(xiàn)了一個(gè)紅色錯(cuò)誤:“加載PDF時(shí)出現(xiàn)錯(cuò)誤。文件來源與閱覽器不匹配”。33q28資訊網(wǎng)——每日最新資訊28at.com

經(jīng)過進(jìn)一步調(diào)查,在相應(yīng)的源代碼中發(fā)現(xiàn)了一個(gè)“fileinputchange”事件監(jiān)聽處理程序,如下所示:33q28資訊網(wǎng)——每日最新資訊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 });};

從代碼中很容易看出,一旦檢測(cè)到文件發(fā)生更改,就會(huì)立即調(diào)用open方法打開文件。重要的是要注意,該open方法并不驗(yàn)證URL是否與當(dāng)前源相匹配。目前,它使用了一個(gè)blob鏈接。在這種情況下,我們是否可以在初始化后直接調(diào)用open方法來打開文件呢?經(jīng)過一些改造,最終證明是可行的。以下是修改后的代碼示例:33q28資訊網(wǎng)——每日最新資訊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('', `          `)}

對(duì)上面的關(guān)鍵代碼進(jìn)行分析:33q28資訊網(wǎng)——每日最新資訊28at.com

  • localResourceRoots參數(shù):該參數(shù)的目的是定義可以通過Web URL訪問的目錄。在這里,需要明確定義兩個(gè)目錄:一個(gè)用于打開PDF文件的當(dāng)前目錄,另一個(gè)用于插件所在的目錄。確保兩者都正確定義,否則可能在訪問時(shí)遇到401錯(cuò)誤。
  • tag:通過設(shè)置tag,可以為網(wǎng)頁內(nèi)部加載資源提供基本路徑。確保資源能夠正確加載。
  • setTimeout函數(shù):在調(diào)用程序打開文件時(shí)使用setTimeout的目的是在打開默認(rèn)PDF文件后再打開所需的PDF文件。這樣可以防止后面執(zhí)行打開默認(rèn)PDF的操作覆蓋想要打開的PDF(盡管實(shí)際上會(huì)出現(xiàn)默認(rèn)文件錯(cuò)誤,但不會(huì)產(chǎn)生實(shí)質(zhì)性影響)。

與之前提到的PDF插件實(shí)現(xiàn)相比,這種實(shí)現(xiàn)要簡(jiǎn)單得多,但原理基本相同。33q28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-77691-0.html手把手教你開發(fā)自己的VSCode插件

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 探索 useSyncExternalStore,一個(gè)鮮為人知的 React Hook

下一篇: 英特爾俄亥俄州新晶圓廠投運(yùn)時(shí)間推遲至 2027~2028 年

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場(chǎng)的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號(hào)為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號(hào)的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • Redmi Pad評(píng)測(cè):紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍(lán)牙耳機(jī)到筆記本電腦,紅米不知不覺之間也已經(jīng)形成了自己頗有競(jìng)爭(zhēng)力的產(chǎn)品體系,在中端和次旗艦市場(chǎng)上甚至要比小米新機(jī)的表現(xiàn)來得更好,正所謂“大丈夫生居
  • 5月安卓手機(jī)好評(píng)榜:魅族20 Pro奪冠

    性能榜和性價(jià)比榜之后,我們來看最后的安卓手機(jī)好評(píng)榜,數(shù)據(jù)來源安兔兔評(píng)測(cè),收集時(shí)間2023年5月1日至5月31日,僅限國(guó)內(nèi)市場(chǎng)。第一名:魅族20 Pro好評(píng)率:97.50%不得不感慨魅族老品牌還
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優(yōu)化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫(kù),還使用這些庫(kù)實(shí)現(xiàn)了一個(gè)流處理程序
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團(tuán)隊(duì)做了容器化,但是帶來的問題是服務(wù)配置文件很麻煩,然后大家在群里進(jìn)行了“親切友好”的溝通圖片圖片圖片圖片對(duì)比就對(duì)比,簡(jiǎn)單對(duì)比下獨(dú)立配置中心和k8s作為配
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數(shù)量是否小于或等于一個(gè)數(shù)字。例如,一個(gè)擁有三個(gè)或更多子項(xiàng)的grid。你可能會(huì)想,為什么需要這樣做呢?在某些情況下,一個(gè)組件或一個(gè)布局可能會(huì)
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個(gè)月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當(dāng)時(shí)用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • OPPO K11樣張首曝:千元機(jī)影像“卷”得真不錯(cuò)!

    一直以來,OPPO K系列機(jī)型都保持著較為均衡的產(chǎn)品體驗(yàn),歷來都是2K價(jià)位的明星機(jī)型,去年推出的OPPO K10和OPPO K10 Pro兩款機(jī)型憑借各自的出色配置,堪稱有
  • 華為舉行春季智慧辦公新品發(fā)布會(huì) 首次推出電子墨水屏平板

    北京時(shí)間2月27日晚,華為在巴塞羅那舉行春季智慧辦公新品發(fā)布會(huì),在海外市場(chǎng)推出之前已經(jīng)在中國(guó)市場(chǎng)上市的筆記本、平板、激光打印機(jī)等辦公產(chǎn)品,并首次推出搭載
Top 主站蜘蛛池模板: 乌兰县| 兴安县| 靖西县| 临泉县| 黔江区| 双城市| 武山县| 彩票| 宁武县| 阜新市| 江达县| 南汇区| 平泉县| 景泰县| 凌源市| 乐清市| 平罗县| 廊坊市| 德兴市| 甘孜县| 富川| 南京市| 筠连县| 高雄市| 泰顺县| 浮梁县| 平远县| 雷山县| 安龙县| 永德县| 太仓市| 辰溪县| 洞口县| 施秉县| 武乡县| 万州区| 安陆市| 天长市| 新邵县| 富平县| 铅山县|