vscode插件入口文件extension.js必须导出activate和deactivate函数,缺一不可;activate接收extensioncontext参数用于注册命令与资源订阅,deactivate负责清理监听与释放资源,且vscode模块须显式导入,命令id须与package.json中contributes.commands完全一致。

插件入口文件 extension.js 必须导出 activate 和 deactivate
VSCode 插件的生命周期由 activate 和 deactivate 两个函数控制,缺一不可。编辑器启动时调用 activate,关闭前或禁用插件时尝试调用 deactivate(但不保证一定执行)。如果只写 activate 而漏掉 deactivate,VSCode 会报错:“Extension activation failed: Missing required export 'deactivate'”。
-
activate函数接收一个context参数,所有注册命令、事件监听、状态管理都必须通过context.subscriptions追踪,否则可能内存泄漏 -
deactivate应该清理所有异步监听(如vscode.workspace.onDidChangeConfiguration)、取消定时器、释放资源 - 不要在
activate里直接执行耗时操作(比如读大文件、发起网络请求),建议用vscode.window.withProgress包裹并设为延迟触发
调用 vscode API 时必须用 import 或 require,不能靠全局变量
VSCode 插件运行在 Node.js 环境中,vscode 模块不是全局对象,必须显式引入。常见错误是直接写 vscode.window.showInformationMessage(...) 却没导入,导致运行时报 ReferenceError: vscode is not defined。
- 推荐用 ES Module 方式:
import * as vscode from 'vscode';(需jsconfig.json中设置"type": "module"或使用.mjs后缀) - CommonJS 方式:
const vscode = require('vscode');,但要注意package.json中不能同时设"type": "module" - 绝对不要依赖
window.vscode或任何浏览器环境假设——插件主进程不跑在浏览器里
命令注册和执行必须匹配 command ID,且 ID 不能含空格或特殊字符
注册命令时用的字符串 ID(如 'extension.sayHello')必须和 package.json 的 contributes.commands 中声明的 command 字段完全一致,否则点击命令面板搜不到、右键菜单不显示、快捷键无效。
- ID 只能包含字母、数字、点(
.)、短横线(-),禁止空格、下划线、斜杠等,例如'my-ext/hello'会失败,应改为'my-ext.hello' - 注册命令必须绑定到
context.subscriptions:context.subscriptions.push(vscode.commands.registerCommand('extension.sayHello', handler)); - handler 函数参数顺序固定:第一个是
...args(来自命令调用上下文),不是自动传入当前编辑器或选中文本——需要手动用vscode.window.activeTextEditor获取
调试时 launch.json 的 type 必须设为 'pwa-node',且 program 指向 extension.js
旧版教程常写 "type": "node",但在 VSCode 1.80+ 版本中会导致断点不命中、require 解析失败、无法进入 vscode 源码调试。实际必须用 pwa-node(即 VS Code 自带的 JavaScript Debugger)。
-
launch.json中program字段要指向插件根目录下的extension.js,不是out/extension.js(除非你用了 TypeScript 编译且明确输出到out) - 确保
env中设置了VSCODE_LOG_LEVEL便于排查加载失败:"env": { "VSCODE_LOG_LEVEL": "debug" } - 启动调试后,若控制台出现
Activating extension 'xxx' failed,优先检查extension.js是否语法错误、vscode是否正确引入、package.json的main字段是否指向正确路径
真正容易被忽略的是:插件代码里所有对 vscode 的调用,都依赖 VSCode 主进程注入的 API 实例——它不是静态库,也不支持 mock;一旦 context 或 vscode 引用丢失,后续调用全崩,而且错误堆栈往往不指向你写的行,而是卡在 vscode\out\vs\workbench\services\extensions\node\extensionHostProcess.js 里。










