vs code 本身不提供一键生成插件骨架功能,必须先全局安装 yo 和 generator-code,再运行 yo code 选择 typescript 模板创建项目;生成后需编译、正确配置 package.json 的 activationevents、contributes.commands 和 main 字段,并使用 type: "extensionhost" 的 launch.json 调试。

VS Code 本身不提供“一键生成插件骨架”的内置功能
所谓“自动生成插件骨架”,实际依赖 yo code 这个外部脚手架工具,不是 VS Code 自带能力。如果你没装 Yeoman 和官方 generator,点再多菜单也出不来 package.json 或 extension.js。
常见翻车点:直接在 VS Code 里搜“create extension”点来点去,结果弹出的是 GitHub 模板或第三方插件——那些要么过时,要么删掉重装都救不回来。
- 必须先全局安装:
npm install -g yo generator-code - 运行
yo code后,选New Extension (TypeScript)(比 JavaScript 更稳,类型报错早、API 提示全) - 项目名别带空格或大写字母,
my-awesome-extension可以,MyExtension会卡在publisher校验 - 生成后立刻检查
package.json里的"engines": {"vscode": "^1.85.0"}是否匹配你当前 VS Code 版本(Help → About查看),否则调试时提示 “Extension host terminated unexpectedly”
为什么 yo code 生成的骨架不能直接跑
生成完只是静态文件,还没编译、没注册命令、也没告诉 VS Code “这个插件该什么时候加载”。直接按 F5 调试,大概率报错 Error: Cannot find module './out/extension.js'。
TypeScript 项目必须先编译才能被 VS Code 加载,而默认配置里没开自动构建。
- 确认
tsconfig.json中"outDir": "./out"和package.json的"main": "./out/extension.js"一致 - 执行
npm run compile(或pnpm run compile),生成out/目录 - 首次调试前,先改
package.json的activationEvents:至少加一条"onCommand:myExtension.helloWorld",否则插件根本不会激活 -
extension.ts里注册的命令名(如myExtension.helloWorld)必须和package.json的contributes.commands.command完全一致,大小写、连字符都不能错
package.json 里这三项最容易配错
插件行为全靠 package.json 控制,但字段语义容易混淆,尤其对新手。
-
activationEvents不是“插件启动时触发”,而是“满足条件时才加载插件代码”。填空数组[]就等于“永远不激活”;写成["*"]虽能强制加载,但拖慢 VS Code 启动速度 -
contributes.commands里的command字段是 ID,title是菜单里显示的文字——改了title不影响调用,但改了command就得同步改extension.ts里的字符串 -
main字段路径必须指向编译后的 JS 文件(./out/extension.js),不是源码(./src/extension.ts)。TypeScript 项目切勿漏掉out/目录
调试时看不到新窗口?检查 launch.json 的 type 字段
VS Code 插件调试依赖专用的 launch.json 配置,如果用通用 Node.js 模板,F5 会直接报错 Cannot launch program 'xxx/extension.ts'; setting the 'type' attribute is necessary。
- 确保
.vscode/launch.json中"type": "extensionHost"(不是node或pwa-node) -
"request": "launch"且"args"包含--extensionDevelopmentPath=${workspaceFolder} - 如果用了 pnpm,
preLaunchTask应设为pnpm: compile,而非默认的npm: compile - 改完代码后别只按
Ctrl+S,记得再按一次Ctrl+Shift+B触发重新编译,否则新逻辑不会进out/目录
yo code 只搭砖,后面每一步都要人盯住路径、类型、生命周期三者是否对齐——少一个,插件就静默失效。











