news 2026/3/30 0:10:06

手把手教你写一个VSCode插件,从开发到发布全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你写一个VSCode插件,从开发到发布全流程

前言

VSCode几乎是前端开发人员的标配,而现在编辑器往往只提供代码编辑文件和项目管理终端集成源代码管理调试支持等核心功能,而一些扩展功能则交给插件来实现。

会编写VSCode插件可以极大提升我们的开发效率,本文将介绍如何编写一个简单的VSCode插件。

1、 安装工具,初始化项目

首先肯定要安装node,再通过其自带npm包管理工具安装yogenerator-code

  • yo:全称叫Yeoman,是一个现代 Web 应用的脚手架工具(命令行工具),用于快速生成项目。
  • generator-codeVS Code扩展生成器。
npminstall-g yo@5 generator-code

注意,使用yo最新的6.0.0版本运行yo命令会报错,因此这里指定安装5版本。

安装完成后,运行yo code命令,初始化项目。

yo code

这里按提示即可,我这里选择的是pnpm + Typescript

其主要项目结构如下:

my-vscode-extension/ ├── .vscode/# VS Code 调试配置│ ├── launch.json │ └── tasks.json ├── src/ │ ├── test/# 测试文件│ └── extension.ts# 插件主入口文件├── .gitignore# git 忽略文件├── .npmrc# npm 配置文件├── .vscode-test.mjs# 单测配置文件├── .vscodeignore# 插件发布忽略文件├── package.json# 项目依赖管理文件├── tsconfig.json# TypeScript 配置文件├── eslint.config.mjs# Eslint 配置文件└── README.md

介绍一下package.json中提供的几个重要命令:

{"scripts":{"vscode:prepublish":"pnpm run compile","compile":"tsc -p ./","watch":"tsc -watch -p ./","pretest":"pnpm run compile && pnpm run lint","lint":"eslint src","test":"vscode-test"},}
  • npm run compile:编译 TypeScript 代码。
  • npm run watch:监听 TypeScript 文件变化并实时编译。
  • npm run test:运行单元测试。

另外是package.json中提供的插件命令。

{"contributes":{"commands":[{"command":"my-vscode-extension.helloWorld","title":"Hello World"}]},}

在默认提供的demo中,插件命令名字叫hello world

2、调试插件

在调试插件前,需要先运行下npm run compile编译 TypeScript 代码,经编译后会生成out/文件,然后便可以开始调试了。

为什么要先编译呢?因为在package.json中定义了插件运行的入口文件,也就是main字段,默认值为./out/extension.js,所以如果不先编译生成out/文件是会运行报错的。

{"main":"./out/extension.js",}

有两种启动调试的方式:

  1. 按快捷键F5
  2. 点击编辑器左下方的Run Extension(插件名)

启动后,会自动打开一个新的 VS Code 窗口,并启动调试模式,我们可以在该窗口中调试插件。

先按Ctrl/Command + Shift + P,输入hello word,会发现找不到命令。

这里是因为我们本地安装的 vscode 版本不符合插件要求,我们在package.json找到如下配置:

{"engines":{"vscode":"^1.107.0"},}

然后我们再查看下本机的 vscode 版本,Code -> About VisualStdio Code

发现我们本地版本为1.105.1,不满足^1.107.0,于是我们把engines.vscode修改为^1.105.0

{"engines":{"vscode":"^1.105.0"},}

再通过F5或者左下角Run Extension启动调试,按Ctrl/Command + Shift + P,输入hello world,就能看到命令了。这个hello world就对应我们上面说的package.json文件中的contributes.commands.title字段。

成功运行后,会在编辑器右下角看到如下提示:

这个提示就是对应src/extension.ts的如下代码:

然后我们就可以开始编写插件的具体功能了。

3、编写插件核心逻辑

我们来实现一个简单的功能,平时我们写代码时,经常会写console.log,如果每次都写这个太麻烦了,我们希望能实现下面的功能:

  1. 通过快捷键,可以快速生成console.log语句。
  2. 光标选中变量并按下快捷键时,能把变量名也显示出来。

3.1 修改 package.json,定义插件名字、描述和快捷键

定义名字name,描述description,快捷键keybindings,通过ctrl/command+alt+l可以运行插件。

{"name":"log-util","displayName":"log-util","description":"generate log statement","contributes":{"commands":[{"command":"log-util.logUtil","title":"log util"}],"keybindings":[{"command":"log-util.logUtil","key":"ctrl+alt+l","mac":"cmd+alt+l","when":"editorTextFocus"}]},}

3.2 核心功能代码

修改src/extension.ts文件,实现插件功能。

先实现第一步,快速生成console.log语句。

import*asvscodefrom"vscode";exportfunctionactivate(context:vscode.ExtensionContext){constdisposable=vscode.commands.registerCommand("log-util.logUtil",async()=>{consteditor=vscode.window.activeTextEditor;if(!editor){vscode.window.showWarningMessage("没有打开的编辑器");return;}// 获取配置constgetConfig=()=>vscode.workspace.getConfiguration("consoleLogGenerator");constconfig=getConfig();constlogType=config.get<string>("logType","log");constprefix=config.get<string>("logPrefix","🚀 ~ ");constposition=editor.selection.active;constdocument=editor.document;constselection=editor.selection;consttext=document.getText(selection);conststatement=`console.${logType}('${prefix}:', );`;editor.edit((editBuilder)=>{constinsertPosition=newvscode.Position(position.line,position.character+1);editBuilder.insert(insertPosition,statement);}).then((success)=>{if(success){// 设置光标位置constnewPosition=newvscode.Position(position.line,statement.length+position.character-2);editor.selection=newvscode.Selection(newPosition,newPosition);}});});context.subscriptions.push(disposable);}exportfunctiondeactivate(){}

然后实现第二步,增加对光标选中变量的处理。

// 获取变量名 + let variableName = text.trim(); - const statement = `console.${logType}('${prefix}:', );`; + const statement = `console.${logType}('${prefix}${variableName ? ` → ${variableName}` : ''}:', ${variableName});`; editor.edit(editBuilder => { - const insertPosition = new vscode.Position(position.line, position.character + 1); + const insertPosition = new vscode.Position(position.line + (variableName ? 1 : 0), variableName ? 0 : position.character + 1); + if (variableName) { + editBuilder.insert(insertPosition, '\n'); + } editBuilder.insert(insertPosition, statement); }).then(success => { if (success) { // 设置光标位置 - const newPosition = new vscode.Position(position.line, statement.length + position.character - 2); + const newPosition = new vscode.Position(position.line + (variableName ? 1 : 0), variableName ? statement.length : statement.length + position.character - 2); editor.selection = new vscode.Selection(newPosition, newPosition); } });

测试插件功能:

constpath=require('path')console.log('🚀 ~ → path:',path);// 光标选中上一行的 path 变量,按 ctrl/command+alt+l 生成console.log('🚀 ~ :',);// 在当前行按 ctrl/command+alt+l 生成

效果如下:

4、发布插件

  1. 进入这个网站,点击Sign in,先注册一个开发者账号。

  2. 点击Public extensions,按照提示一步步发布即可。

小结

本文主要介绍了如何编写一个简单的 VSCode 插件,从开发到发布全流程:

  1. 安装yogenerator-code
  2. 运行yo code命令生成插件项目,这里可以选择插件的开发语言,定义插件的名称、描述等。
  3. 修改package.json文件,可以修改插件的名称、描述、入口文件,定义插件的快捷键。并要注意设置engines.vscode字段,指定插件支持的 VSCode 版本。
  4. src/extension.ts文件中编写插件逻辑。
  5. 运行npm run compile编译插件,或者运行npm run watch监听文件变化并编译。
  6. 按快捷键F5,或者点击编辑器左下方的Run Extension进行插件调试。
  7. 在调试的新窗口中,使用Ctrl/Command + Shift + P,输入配置的命令,或者按配置的快捷键,测试插件功能是否正常。
  8. 运行npm run test测试插件功能。(本文未涉及到单元测试)
  9. 发布插件。

希望本文对你有所帮助,如果你有任何问题,欢迎在评论区留言。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/29 15:40:25

24、系统管理脚本实用指南

系统管理脚本实用指南 在系统管理的日常操作中,我们常常会遇到诸如定时任务管理、数据库读写、用户管理以及图像批量处理等任务。本文将详细介绍如何使用脚本完成这些常见的系统管理任务,包括移除定时任务表、读写 MySQL 数据库、用户管理和批量图像调整大小与格式转换。 1…

作者头像 李华
网站建设 2026/3/29 10:26:23

EmotiVoice语音合成在音乐剧配音中的创造性应用

EmotiVoice语音合成在音乐剧配音中的创造性应用 在一场即将上演的原创音乐剧中&#xff0c;导演需要为主角录制一段充满悲愤情绪的独白&#xff1a;“你竟用谎言将我推入深渊&#xff01;”然而&#xff0c;原定配音演员突发疾病无法进棚。时间紧迫&#xff0c;重找声优成本高…

作者头像 李华
网站建设 2026/3/15 13:51:21

Spring Boot性能调优

一、先搞懂&#xff1a;性能瓶颈都藏在哪里&#xff1f;性能调优的前提是精准定位瓶颈&#xff0c;盲目修改配置只会事倍功半。Spring Boot应用的性能问题主要集中在四个层面&#xff0c;可通过“日志分析监控工具”组合排查&#xff1a;接入层瓶颈&#xff1a;内嵌Tomcat/Jett…

作者头像 李华
网站建设 2026/3/28 7:40:53

17、系统安全、文本编辑与特殊字符变量全解析

系统安全、文本编辑与特殊字符变量全解析 1. 系统日志处理 1.1 日志记录机制 大多数 BSD 系统会记录系统上发生的许多活动,这些活动信息会被写入位于 /var/log 目录或其子目录下的日志文件中,这一记录工作由 Syslog 工具完成。在 FreeBSD 中, syslogd (系统日志守护…

作者头像 李华
网站建设 2026/3/27 12:54:37

18、技术工具与配置全解析

技术工具与配置全解析 在技术领域,掌握各种工具和配置的使用方法至关重要。本文将详细介绍特殊 shell 字符和变量、个人配置文件、AppleScript 命令以及 Fink 软件包等内容,帮助你更好地理解和运用这些技术。 特殊 shell 字符和变量 特殊 shell 字符和变量在 shell 编程中…

作者头像 李华
网站建设 2026/3/27 1:14:30

Geo优化新范式:于磊老师揭秘两大核心与四轮驱动的精髓

Geo优化&#xff1a;于磊老师两大核心四轮驱动精髓解读在人工智能驱动的搜索时代&#xff0c;传统的搜索引擎优化&#xff08;SEO&#xff09;正逐步演进为生成引擎优化&#xff08;GEO, Generative Engine Optimization&#xff09;。面对AI摘要、对话式搜索以及多模态内容的挑…

作者头像 李华