事件(Event):VS Code 通知插件「 something 变了」
事件是什么
和 命令(用户点一下触发一次)不同,事件是 VS Code 在状态变化时 反复通知 Extension Host:「配置改了」「这个侧栏视图显示/隐藏了」等。
用法固定模式:在某个对象上调用 .onDidXxx(回调),返回 Disposable,放进 context.subscriptions。
通信方向:VS Code → Extension Host → 你的回调函数。
本项目用到的 VS Code 事件
1. vscode.workspace.onDidChangeConfiguration
做什么:用户在「设置」里改了任意配置项时触发;回调参数里可以判断是不是本插件关心的键。
在哪里:src/extension.ts
const configChangeDisposable = vscode.workspace.onDidChangeConfiguration(
(event) => {
if (
!event.affectsConfiguration("hardwareCoreMonitor.refreshIntervalMs")
) {
return;
}
monitorService.updateInterval(getRefreshIntervalMs());
},
);
通信过程:
- 用户在设置 UI 修改
hardwareCoreMonitor.refreshIntervalMs(键在package.json→contributes.configuration里定义)。 - VS Code 保存 settings,向 Extension Host 发配置变更事件。
event.affectsConfiguration("hardwareCoreMonitor.refreshIntervalMs")为 true 时,重新getRefreshIntervalMs()并传给monitorService.updateInterval。
读配置的具体 API 见 04-configuration.md。
2. treeView.onDidChangeVisibility
做什么:用户打开/关闭、或切换到别的侧栏视图,导致 本插件这棵树的视图区域显示或隐藏 时触发。event.visible 为 true 表示现在看得见。
在哪里:src/extension.ts,对象来自 createTreeView 的返回值。
先创建树视图:
const treeView = vscode.window.createTreeView(
"hardware-core-monitor.sidebarView",
{ treeDataProvider: treeProvider },
);
再监听可见性:
treeView.onDidChangeVisibility(
(event) => syncMonitoringWithSidebarVisibility(event.visible),
undefined,
context.subscriptions,
);
syncMonitoringWithSidebarVisibility 的逻辑:
const syncMonitoringWithSidebarVisibility = (visible: boolean): void => {
if (visible) {
monitorService.updateInterval(getRefreshIntervalMs());
monitorService.start();
void vscode.commands.executeCommand(
"setContext",
MONITORING_CONTEXT,
true,
);
return;
}
monitorService.stop();
void vscode.commands.executeCommand(
"setContext",
MONITORING_CONTEXT,
false,
);
};
通信过程:
- 侧栏 可见 → 启动采集、并把
hardwareMonitorIsRunning设为 true(标题栏显示 Pause)。 - 侧栏 不可见 → 停止采集、上下文设为 false(标题栏显示 Play)。
扩展刚激活时如果侧栏已经开着,会立刻同步一次:
if (treeView.visible) {
syncMonitoringWithSidebarVisibility(true);
}
本项目里的「插件自己发的事件」(给下一节对照)
下面不是 VS Code 发来的,而是 MonitorService / TreeProvider 在 Extension Host 内部 用的同一套 EventEmitter API,见 06-internal-event-bus.md:
| API | 文件 | 谁监听 |
|---|---|---|
monitorService.onDidChangeSnapshot | monitorService.ts / extension.ts | 树、状态栏、告警 |
hardwareTreeProvider.onDidChangeTreeData | hardwareTreeProvider.ts | VS Code 树视图(拉取新数据) |
区分方式:
- 订阅
vscode.xxx.onDid...→ VS Code 推给你。 - 订阅
monitorService.onDidChangeSnapshot→ 本插件别的模块推给你。 - 实现
onDidChangeTreeData并 fire → 你推给 VS Code,让它刷新树。
context.subscriptions 与事件
onDidChangeConfiguration 和 onDidChangeVisibility 的第三个参数传了 context.subscriptions,VS Code 会在扩展停用时自动取消订阅。
configChangeDisposable 也手动 push 进了 subscriptions(见 extension.ts 末尾),效果相同:避免重复激活后注册多份监听。