扩展是什么
VS Code 扩展是一份带 package.json 清单的程序。它通过两类手段给编辑器加能力:在清单里做静态声明(贡献点),在代码里调用 vscode 模块(扩展 API)。
入口通常是 main 指向的 Node.js 文件,或 browser 指向的网页扩展文件。入口导出 activate,需要时再导出 deactivate。
扩展能做什么
官方把常见能力分成几类:
- 语言功能:悬停、转到定义、诊断、补全、CodeLens。用
vscode.languages.*直接实现,或再包一层语言服务器。 - 工作台界面:资源管理器右键、侧栏树、活动栏、状态栏、源代码管理。
- 自定义界面:原生控件不够时,用 Webview 画 HTML。
- 主题、代码片段、语法高亮、调试器、任务、终端、认证。
扩展不能做什么
扩展跑在扩展宿主里,不能改 VS Code 界面的 DOM,也不能给编辑器随便加 CSS。这样扩展不会把界面拖死,VS Code 改自己的 DOM 时也不必担心弄坏扩展。
需要自定义界面时,走 Webview:它像一块由扩展控制的 iframe,用消息和扩展通信,而不是直接操作主界面节点。
和普通 Node 程序的差别
扩展不是自己 node extension.js 拉起来的。VS Code 按激活事件决定何时加载它,只调用一次 activate。文件、配置、界面都要走 vscode API。远程开发时,读工作区文件和弹界面可能发生在不同机器上,不能假设 fs 和用户眼前的窗口在同一台电脑。
最小骨架
import * as vscode from 'vscode';
// VS Code 在激活事件发生时调用,整个生命周期只调用一次
export function activate(context: vscode.ExtensionContext) {
const disposable = vscode.commands.registerCommand('demo.hello', () => {
vscode.window.showInformationMessage('Hello');
});
context.subscriptions.push(disposable);
}
export function deactivate() {
// 进程退出前的清理;没有异步工作时可以不返回 Promise
}