用 yo code 脚手架快速创建 vscode 插件项目最稳妥,它自动生成符合官方规范的结构,避免手动配置遗漏 activationevents 或 main 入口;需先安装 yo 和 generator-code,再运行 yo code 选择 typescript 扩展模板。

怎么快速创建一个能跑起来的 VSCode 插件项目
用 yo code 脚手架是最稳妥的起点,它生成的结构符合 VSCode 官方推荐规范,避免手动搭环境时漏掉 package.json 中关键字段(比如 activationEvents 或 main 入口)。不建议从空文件夹开始手写,容易卡在插件不加载的问题上。
执行前确保已安装:npm install -g yo generator-code。运行 yo code 后按提示选「New Extension (TypeScript)」,填完名字、ID、描述即可生成完整项目。
- 生成的
extension.ts是主逻辑入口,activate函数会在插件被激活时调用 -
package.json里的contributes.commands声明了命令,但不会自动注册——必须在activate里用vscode.commands.registerCommand手动绑定 - TypeScript 默认开启严格检查,如果改用 JavaScript,记得把
tsconfig.json换成jsconfig.json并设"checkJs": true
插件为什么装了却不响应 command palette 输入
最常见原因是没正确配置激活时机或命令注册遗漏。VSCode 不会预加载所有插件,它靠 activationEvents 决定何时拉起你的代码。如果只写了 "*",插件一启动就加载;但如果写成 "onCommand:myExtension.sayHello",却忘了在 activate 里调用 registerCommand('myExtension.sayHello', ...),那命令就永远找不到。
- 检查
package.json的activationEvents是否覆盖你触发插件的场景(如打开特定语言文件、执行某命令、编辑器就绪等) - 确认
main字段指向的 JS/TS 文件确实导出了activate和可选的deactivate - 在
activate函数开头加console.log('activated'),然后打开开发者工具(Ctrl+Shift+P→ 「Developer: Toggle Developer Tools」),看控制台有没有输出
如何让插件在编辑器右键菜单里出现
靠 package.json 的 contributes.menus 配置,不是靠写 UI 代码。VSCode 只认 JSON 声明,JS/TS 层只能提供命令逻辑。
例如想在编辑器空白处右键显示「Insert Timestamp」,要这样写:
"contributes": {
"menus": {
"editor/context": [
{
"command": "myExtension.insertTimestamp",
"when": "editorTextFocus && !editorReadonly"
}
]
}
}
-
editor/context表示编辑器右键菜单;还有explorer/context(资源管理器)、debug/callstack/context(调试栈)等 -
when条件表达式决定菜单项是否显示,常用值有editorTextFocus、resourceLangId == 'json'、editorHasSelection - 命令名(如
myExtension.insertTimestamp)必须和registerCommand传入的第一个参数完全一致,大小写敏感
调试插件时断点不命中或报错「Cannot find module」
本质是调试器没连上插件进程,或者模块路径解析失败。VSCode 插件运行在单独的 Extension Host 进程中,调试配置必须指向这个环境,而不是普通 Node.js。
- 确保
.vscode/launch.json使用的是type: "extensionHost",且request: "launch",不是node类型 - 编译后的 JS 文件默认在
out/目录,package.json的main必须指向out/extension.js(TS 项目)或对应 JS 入口 - 如果用了
import动态导入或require非相对路径,确保out/下对应文件存在,TypeScript 编译时没跳过这些模块 - 改完代码后,别忘了按
Ctrl+Shift+P→ 「Developer: Reload Window」,否则新代码不会生效
插件开发里最耗时间的往往不是写功能,而是搞清「它到底有没有运行」「运行时在哪个上下文」「依赖路径对不对」——这几个点理清了,90% 的卡点就解了一半。











