为什么VSCode Extension教程为何建议向context.subscriptions
订阅已注册的命令?
根据我到目前为止所讲的内容,这似乎没有必要或没有用。
这是VSCode扩展名code snippet的official tutorial:
let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {
// The code you place here will be executed every time your command is executed
// Display a message box to the user
vscode.window.showInformationMessage('Hello World!');
});
context.subscriptions.push(disposable);
但这本身似乎还可以:
vscode.commands.registerCommand('extension.helloWorld', () => {
vscode.window.showInformationMessage('Hello World!');
});
此外,我尝试禁用有扩展名和没有将其注册命令添加到context.subscriptions
的扩展名-在这两种情况下都禁用后,命令不可用。
VS Code Api Reference将subscriptions
定义为:
订阅:{dispose} []
可以添加一次性用品的阵列。停用此扩展程序后,将丢弃一次性用品。
这是否意味着如果不处理已注册的命令,那么即使关闭扩展名,它们的侦听器也会以某种方式徘徊?
TDLR-我是否应该订阅命令,为什么?
任何解释或见解将不胜感激!
答案 0 :(得分:3)
是的,您应该将命令添加到subscriptions
。订阅可确保卸载扩展程序时正确注销命令。
vscode.commands.registerCommand
返回一次性对象。处理返回的对象将取消注册该命令,从而使VS Code可以清理该命令可能具有的所有内部状态/句柄。
简而言之,扩展程序创建的所有一次性对象都应以某种方式进入subscriptions
,以便在卸载扩展程序时可以正确清理它们。未能注册一次性使用品可能不会在99%的时间内给用户带来明显的问题,但是在用户启用和禁用您的扩展程序而无需重新启动vscode的情况下,可能会导致问题