news 2026/6/22 4:18:52

VS Code插件开发实战文章

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VS Code插件开发实战文章

VS Code插件开发实战文章

避开基础入门教程,从零开发自定义插件,解决日常开发效率痛点,附 2026 最新发布流程

目录

  1. [引言:为什么要自己写 VS Code 插件?](#引言为什么要自己写vs-code插件)

  2. [前置准备:5 分钟搭建开发环境](#前置准备5分钟搭建开发环境)

  3. [实战 1:代码模板生成插件,告别重复编码](#实战1代码模板生成插件告别重复编码)
    3.1 [功能设计:右键一键生成团队标准模板](#功能设计右键一键生成团队标准模板)
    3.2 [核心代码实现:命令注册 + 右键菜单 + 模板插入](#核心代码实现命令注册右键菜单模板插入)
    3.3 [扩展解法:支持用户自定义模板,不用改插件代码](#扩展解法支持用户自定义模板不用改插件代码)

  4. [实战 2:自定义语法检查插件,统一团队代码规范](#实战2自定义语法检查插件统一团队代码规范)
    4.1 [功能设计:实时检查违规代码,自动提示警告](#功能设计实时检查违规代码自动提示警告)
    4.2 [核心代码实现:Diagnostics API + 实时监听文档变化](#核心代码实现diagnostics-api实时监听文档变化)
    4.3 [扩展解法:支持自定义检查规则,适配不同团队规范](#扩展解法支持自定义检查规则适配不同团队规范)

  5. [插件本地调试:快速验证功能](#插件本地调试快速验证功能)

  6. [2026 最新发布流程:从打包到上架微软市场](#2026最新发布流程从打包到上架微软市场)
    6.1 [账号准备:注册发布者与 Azure DevOps 配置](#账号准备注册发布者与azure-devops配置)
    6.2 [打包插件:生成 vsix 安装包](#打包插件生成vsix安装包)
    6.3 [发布到市场:用 vsce 完成发布,避坑指南](#发布到市场用vsce完成发布避坑指南)
    6.4 [私有部署:团队内部共享插件的方案](#私有部署团队内部共享插件的方案)

  7. [更多扩展:你还可以开发这些实用功能](#更多扩展你还可以开发这些实用功能)

  8. [总结](#总结)


引言:为什么要自己写 VS Code 插件?

日常开发中,你是不是经常遇到这些痛点:

  • 每次写 Python 类、React 组件,都要重复写一堆固定的模板代码,复制粘贴半天;

  • 团队有自己的代码规范,比如禁止用print、禁止提交debugger,但是现有的 ESLint、Pylint 配置太复杂,适配起来太麻烦;

  • 找遍了插件市场,都找不到刚好满足你需求的小工具,要么功能太多太臃肿,要么就是少了你要的那个功能。

其实,VS Code 插件开发并没有你想的那么复杂,不用懂复杂的 LSP 协议,不用学一堆新的东西,只需要一点 JavaScript/TypeScript 基础,就能自己手写一个小插件,解决自己的效率痛点。

本文就带你从零开始,开发两个非常实用的插件功能:代码模板生成自定义语法检查,然后附上 2026 年最新的完整发布流程,让你写完就能直接发布到市场,或者分享给团队的小伙伴。


前置准备:5 分钟搭建开发环境

在开始之前,我们只需要安装几个工具,5 分钟就能搭好开发环境:

  1. Node.js:版本 16 以上,因为 VS Code 插件的开发基于 Node.js;

  2. Yeoman 和 VS Code 生成器:用来快速生成插件的项目骨架,不用自己手动写配置;

  3. vsce:VS Code Extension 的命令行工具,用来打包和发布插件。

执行下面的命令就能一键安装好:

# 安装Yeoman和生成器npminstall-gyo generator-code# 安装vsce打包发布工具npminstall-g@vscode/vsce

安装完成后,执行yo code,选择New Extension (TypeScript),然后按照提示输入插件的名字、描述、作者信息,就能自动生成插件的项目骨架了,整个过程只需要 1 分钟。

生成的项目结构非常简单,核心的文件只有两个:

  • package.json:插件的配置文件,定义插件的命令、菜单、依赖等;

  • src/extension.ts:插件的核心代码,所有的功能都在这里实现。


实战 1:代码模板生成插件,告别重复编码

第一个功能,我们来做一个代码模板生成工具,解决重复写模板代码的问题。

功能设计:右键一键生成团队标准模板

我们要实现的效果是:在编辑器里右键点击,会出现一个菜单选项,比如生成Python类模板,点击之后,自动在当前光标位置插入标准的类模板代码,而且光标会自动跳转到需要你填写的位置,比如类名、描述,不用你手动移动光标。

而且,我们要支持不同的语言,比如 Python 的类模板、React 的组件模板,不同的语言显示不同的菜单选项,不会混乱。

核心代码实现:命令注册 + 右键菜单 + 模板插入

首先,我们需要在package.json里配置我们的命令和右键菜单:

{"contributes":{"commands":[{"command":"my-efficiency-tool.genPythonClass","title":"生成Python类模板","shortTitle":"Python类模板"},{"command":"my-efficiency-tool.genReactComponent","title":"生成React函数组件模板","shortTitle":"React组件模板"}],"menus":{"editor/context":[{"command":"my-efficiency-tool.genPythonClass","when":"editorLangId == python","group":"navigation"},{"command":"my-efficiency-tool.genReactComponent","when":"editorLangId == javascript || editorLangId == typescript || editorLangId == jsx","group":"navigation"}]}}}

这里的when配置,就是用来控制什么时候显示这个菜单,比如只有当当前文件是 Python 的时候,才显示生成 Python 类模板的选项,只有当是 JS/TS 的时候,才显示 React 组件的选项,非常灵活。

然后,我们在src/extension.ts里实现命令的逻辑:

import*asvscodefrom'vscode';exportfunctionactivate(context:vscode.ExtensionContext){// 1. 注册Python类模板生成命令letgenPythonClass=vscode.commands.registerCommand('my-efficiency-tool.genPythonClass',()=>{consteditor=vscode.window.activeTextEditor;if(!editor){vscode.window.showErrorMessage('没有打开的编辑器!');return;}// 模板内容,${1}、${2}是Snippet的光标占位符,按Tab可以跳转consttemplate=`class \${1:ClassName}: """ \${2:类的功能描述} """ def __init__(self): super().__init__() \${3:初始化代码} def run(self): """业务逻辑入口""" \${4:业务代码}`;// 插入Snippet模板,自动处理光标跳转editor.insertSnippet(newvscode.SnippetString(template));vscode.window.showInformationMessage('✅ Python类模板生成成功!');});// 2. 注册React组件模板生成命令letgenReactComponent=vscode.commands.registerCommand('my-efficiency-tool.genReactComponent',()=>{consteditor=vscode.window.activeTextEditor;if(!editor){vscode.window.showErrorMessage('没有打开的编辑器!');return;}consttemplate=`import React from 'react'; export interface \${1:Component}Props { \${2:属性定义} } const \${1:Component}: React.FC<\${1:Component}Props> = (props) => { return ( <div> \${3:组件内容} </div> ); }; export default \${1:Component};`;editor.insertSnippet(newvscode.SnippetString(template));vscode.window.showInformationMessage('✅ React组件模板生成成功!');});// 把命令注册到上下文context.subscriptions.push(genPythonClass,genReactComponent);}exportfunctiondeactivate(){}

这里我们用到了 VS Code 的 Snippet 功能,所以模板里的${1}这样的占位符,会自动帮你处理光标跳转,你输入完类名,按 Tab,就自动跳到描述的位置,不用手动移动光标,非常方便。

扩展解法:支持用户自定义模板,不用改插件代码

上面的方案是硬编码的模板,不够灵活,不同的用户、不同的团队,模板可能不一样,我们可以扩展一下,支持用户自定义模板,不用改插件的代码。

首先,我们在package.json里添加配置项,让用户可以在 VS Code 的设置里配置自己的模板:

{"contributes":{"configuration":{"title":"My Efficiency Tool","properties":{"my-efficiency-tool.templates":{"type":"object","default":{},"description":"自定义代码模板,key是模板ID,value是模板配置","additionalProperties":{"type":"object","properties":{"name":{"type":"string","description":"模板名称,会显示在右键菜单里"},"content":{"type":"string","description":"模板内容,支持Snippet占位符"},"languages":{"type":"array","items":{"type":"string"},"description":"支持的语言ID,比如python、javascript"}}}}}}}}

然后,用户就可以在自己的 settings.json 里配置自己的模板了,比如:

"my-efficiency-tool.templates":{"go-service":{"name":"Go服务模板","content":"type Service struct {\n\tName string\n}\n\nfunc NewService() *Service {\n\treturn &Service{}\n}\n","languages":["go"]},"java-method":{"name":"Java方法模板","content":"/**\n * \${2:方法描述}\n */\npublic void \${1:methodName}() {\n\t\${3:代码}\n}\n","languages":["java"]}}

然后,我们的插件会自动读取用户的配置,动态注册命令和菜单,这样用户不用改插件的代码,就能自己加自己的模板,非常灵活,适配不同的团队、不同的用户的需求。


实战 2:自定义语法检查插件,统一团队代码规范

第二个功能,我们来做一个自定义的语法检查工具,解决团队代码规范的问题。

功能设计:实时检查违规代码,自动提示警告

我们要实现的效果是:当你写代码的时候,插件会实时检查你的代码,比如有没有用print语句,有没有留debugger,如果有的话,会在代码下面画波浪线,提示警告,而且会在问题面板里显示,和 ESLint 的效果一样,但是比 ESLint 简单太多,不用复杂的配置,刚好满足小团队的需求。

核心代码实现:Diagnostics API + 实时监听文档变化

VS Code 提供了 Diagnostics API,专门用来做代码诊断、语法检查的,我们用这个 API 就能轻松实现我们的功能。

首先,我们在src/extension.ts里添加检查的逻辑:

import*asvscodefrom'vscode';exportfunctionactivate(context:vscode.ExtensionContext){// 1. 创建诊断集合,用来存储我们的检查结果constdiagnosticsCollection=vscode.languages.createDiagnosticCollection('my-code-lint');context.subscriptions.push(diagnosticsCollection);// 2. 监听文档的变化,当文件打开、修改的时候,自动触发检查vscode.workspace.onDidOpenTextDocument(doc=>validateDocument(doc,diagnosticsCollection),null,context.subscriptions);vscode.workspace.onDidChangeTextDocument(event=>validateDocument(event.document,diagnosticsCollection),null,context.subscriptions);// 对已经打开的文档,先做一次检查vscode.workspace.textDocuments.forEach(doc=>{validateDocument(doc,diagnosticsCollection);});// ... 之前的模板生成的代码 ...}// 检查文档的核心函数functionvalidateDocument(document:vscode.TextDocument,collection:vscode.DiagnosticCollection){constdiagnostics:vscode.Diagnostic[]=[];consttext=document.getText();// 规则1:检查禁止使用print语句constprintPattern=/print\(/g;letmatch;while((match=printPattern.exec(text))!==null){// 计算匹配到的位置,用来画波浪线conststart=document.positionAt(match.index);constend=document.positionAt(match.index+match[0].length);constrange=newvscode.Range(start,end);// 创建诊断信息constdiagnostic=newvscode.Diagnostic(range,'❌ 禁止使用print语句,请使用项目的日志库',vscode.DiagnosticSeverity.Warning);diagnostic.source='my-code-lint';diagnostics.push(diagnostic);}// 规则2:检查禁止提交debugger语句constdebuggerPattern=/debugger/g;while((match=debuggerPattern.exec(text))!==null){conststart=document.positionAt(match.index);constend=document.positionAt(match.index+match[0].length);constrange=newvscode.Range(start,end);constdiagnostic=newvscode.Diagnostic(range,'❌ 禁止提交debugger语句,请删除后再提交',vscode.DiagnosticSeverity.Error);diagnostic.source='my-code-lint';diagnostics.push(diagnostic);}// 规则3:检查禁止使用console.logconstconsolePattern=/console\.log/g;while((match=consolePattern.exec(text))!==null){conststart=document.positionAt(match.index);constend=document.positionAt(match.index+match[0].length);constrange=newvscode.Range(start,end);constdiagnostic=newvscode.Diagnostic(range,'⚠️ 禁止使用console.log,请使用项目的日志库',vscode.DiagnosticSeverity.Warning);diagnostic.source='my-code-lint';diagnostics.push(diagnostic);}// 把检查结果应用到文档上,VS Code会自动显示波浪线和问题collection.set(document.uri,diagnostics);}exportfunctiondeactivate(){}

就这么简单,我们就实现了实时的语法检查,当你写了print或者debugger,VS Code 会自动在下面画波浪线,提示你,和原生的检查效果一模一样,而且是实时的,你改了代码,马上就会更新检查结果。

扩展解法:支持自定义检查规则,适配不同团队规范

和模板一样,我们也可以把检查规则做成可配置的,让用户自己定义规则,不用改插件的代码。

首先,在package.json里添加配置项:

"contributes":{"configuration":{"title":"My Efficiency Tool","properties":{// ... 之前的模板配置 ..."my-efficiency-tool.lintRules":{"type":"array","default":[],"description":"自定义语法检查规则","items":{"type":"object","properties":{"pattern":{"type":"string","description":"正则表达式,用来匹配违规代码"},"message":{"type":"string","description":"提示信息"},"severity":{"type":"string","enum":["error","warning","info"],"default":"warning","description":"严重程度"}}}}}}}

然后,用户就可以在自己的 settings 里配置自己的规则了,比如:

"my-efficiency-tool.lintRules":[{"pattern":"alert\\(","message":"禁止使用alert弹窗,请用项目的提示组件","severity":"warning"},{"pattern":"TODO","message":"TODO任务请及时处理,不要提交到主分支","severity":"info"}]

然后,我们的插件会自动读取用户的规则,动态检查,这样不同的团队可以配置自己的规范,不用改插件的代码,非常灵活,比硬编码的规则好用太多。


插件本地调试:快速验证功能

写完代码之后,我们可以快速调试,验证功能是不是正常:
直接按F5,VS Code 会自动编译代码,然后弹出一个新的Extension Development Host窗口,这个窗口就是加载了你的插件的测试窗口。

在这个窗口里,你可以打开一个 Python 文件,右键点击,就能看到我们的生成Python类模板的选项,点击之后,就能自动生成模板,然后你写个print,就能看到语法检查的警告,非常方便。

如果代码有问题,你可以在原来的窗口里加断点,调试代码,就和调试普通的 TypeScript 代码一样,非常简单。


2026 最新发布流程:从打包到上架微软市场

写完插件,调试好之后,我们就可以把它发布出去,要么发布到公共的 VS Code 市场,分享给所有人,要么打包成 vsix 文件,分享给团队的小伙伴。

注意:2026 年,微软市场已经不再支持账号密码登录了,所有的发布都必须用 Azure DevOps 的个人访问令牌(PAT),旧的发布流程已经不能用了,下面是最新的完整流程。

账号准备:注册发布者与 Azure DevOps 配置

首先,我们需要准备两个东西:

  1. VS Code 市场的发布者账号:用来标识你的插件的发布者,名字是唯一的,不能重复;

  2. Azure DevOps 的个人访问令牌(PAT):用来登录 vsce,授权发布插件。

步骤如下:

  1. 打开VS Code 市场的发布者页面,用你的 Microsoft 账号登录,创建一个发布者,输入发布者 ID(小写,不能有空格,比如your-name),显示名称,然后创建;

  2. 打开Azure DevOps,用同一个 Microsoft 账号登录,创建一个组织(如果没有的话);

  3. 点击右上角的头像,选择Personal access tokens,然后点击New Token

  4. 填写 Token 的名称,比如VS Code Plugin Publish,组织选择All accessible organizations,过期时间选你想要的,然后范围选择Custom defined,然后勾选Marketplace下的Manage权限;

  5. 点击创建,然后一定要马上复制这个 Token,它只会显示这一次,关掉就再也看不到了,保存好它。

打包插件:生成 vsix 安装包

接下来,我们打包插件,生成 vsix 安装包,这个包可以本地安装,也可以用来发布。

在插件的项目根目录,执行下面的命令:

# 打包插件,生成.vsix文件vsce package

执行完成后,你会看到根目录下生成了一个my-efficiency-tool-0.0.1.vsix文件,这个就是插件的安装包,你可以直接把这个文件发给团队的小伙伴,他们执行下面的命令就能安装:

code --install-extension my-efficiency-tool-0.0.1.vsix

不用发布到市场,团队内部就能用,非常方便。

发布到市场:用 vsce 完成发布,避坑指南

如果你想要发布到公共市场,让所有人都能下载,那接下来执行发布的步骤:

  1. 首先,登录 vsce,执行:
vsce login<你的发布者ID>

然后,会提示你输入 Personal Access Token,把你刚才复制的 PAT 粘贴进去,就登录成功了。
2. 然后,执行发布命令:

vsce publish

vsce 会自动打包插件,然后上传到市场,几分钟之后,你的插件就会出现在 VS Code 市场里了,所有人都能搜索到,下载安装。

这里有几个常见的坑,一定要注意:

  1. PAT 的权限:一定要勾选 Marketplace 的 Manage 权限,不然会提示权限不足,发布失败;

  2. 版本号:每次发布,都要升级package.json里的version,不能用已经发布过的版本号,不然会发布失败;

  3. .vscodeignore:一定要配置这个文件,忽略不需要的文件,比如node_modules里的测试文件,src源码文件,不然包会很大,而且会把源码也打包进去;

  4. [README.md](README.md):一定要有这个文件,市场需要用它来展示插件的介绍,没有的话会发布失败;

  5. 插件名称:插件的名字不能和市场里已有的重复,不然会发布失败。

私有部署:团队内部共享插件的方案

如果你的插件是团队内部用的,不想发布到公共市场,除了刚才的分享 vsix 文件的方式,你还可以搭建私有市场,或者用 GitHub Packages 来托管,这样团队的小伙伴可以像安装公共插件一样安装你的私有插件,不用手动传文件。


更多扩展:你还可以开发这些实用功能

有了这个基础,你还可以扩展更多的实用功能,比如:

  1. 批量代码处理:比如批量给选中的代码加注释,批量重命名变量,批量转换代码格式;

  2. 快捷命令:比如一键打开当前项目的 Git 仓库,一键部署测试环境;

  3. 自定义状态栏:在状态栏显示当前的分支、构建状态,不用打开终端看;

  4. AI 辅助功能:比如集成你自己的 AI 模型,做自定义的代码补全、注释生成。

这些功能的开发都非常简单,基于 VS Code 的 API,你只需要写很少的代码,就能实现,解决你自己的效率痛点。


总结

VS Code 插件开发并没有你想的那么复杂,不用学复杂的协议,不用懂很深的原理,只需要一点前端的基础,就能自己手写一个小插件,解决自己的日常开发痛点。

本文我们实现了两个非常实用的功能:代码模板生成和自定义语法检查,解决了重复编码和代码规范的问题,然后附上了 2026 年最新的完整发布流程,让你写完就能直接用,或者分享给别人。

如果你也有自己的开发痛点,不妨试试自己写个小插件,比找遍市场的插件要好用太多,而且开发起来非常快,几个小时就能搞定。

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

炉石传说终极插件HsMod:55项专业级功能深度定制体验革命

炉石传说终极插件HsMod&#xff1a;55项专业级功能深度定制体验革命 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 在炉石传说的竞技场与收藏界面之间&#xff0c;你是否曾为重复的动画感…

作者头像 李华
网站建设 2026/6/9 22:36:12

Skills Hub:AI编程Agent技能的“App Store“,一次安装全局同步

&#x1f525; 核心事件*&#xff1a;在AI编程Agent爆发的2026年&#xff0c;一个令开发者头疼的问题浮出水面——Claude Code、Cursor、Codex、Hermes Agent、OpenCode、Gemini CLI……每个工具都有自己的Skills目录&#xff0c;一个技能需要在N个地方分别安装。Skills Hub&am…

作者头像 李华
网站建设 2026/6/8 22:15:55

怀旧推荐:俄罗斯经典游戏,新玩法!

今天给大家推荐一款安卓端的俄罗斯方块游戏。之前一直想找些干净无广告的经典游戏&#xff0c;但很多用着用着就开始弹窗&#xff0c;实在不敢随便推荐。这款目前还能用&#xff0c;以后会不会加广告不好说&#xff0c;且用且珍惜吧。这款游戏除了经典模式外&#xff0c;还有“…

作者头像 李华
网站建设 2026/6/10 0:05:11

手把手教你用Python脚本+FOFA高效筛选CNVD通用漏洞目标(附代理池配置)

Python自动化筛选CNVD通用漏洞目标的工程实践在安全研究领域&#xff0c;效率往往决定着成果的产出速度。当面对海量企业数据时&#xff0c;如何快速识别符合特定条件的潜在目标&#xff0c;成为许多研究人员面临的共同挑战。本文将分享一套基于Python的自动化工作流&#xff0…

作者头像 李华
网站建设 2026/6/10 7:10:00

docker ps

原来你的项目是部署在 Docker 容器里的&#xff01;这就解释了为什么你之前直接 kill 进程后&#xff0c;服务可能会自动重启&#xff08;Docker 的守护机制&#xff09;。既然使用了 Docker&#xff0c;更新代码的流程就与直接运行 Java 有所不同。你需要重新构建镜像并启动新…

作者头像 李华