打算在vscode扩展中订购命令?

stu*_*art 5 visual-studio-code vscode-extensions

为什么VSCode Extension教程建议向订阅已注册的命令context.subscriptions

到目前为止,我认为这似乎没有必要或无用。

这是VSCode扩展官方教程代码片段

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);
Run Code Online (Sandbox Code Playgroud)

但这本身似乎很好用:

vscode.commands.registerCommand('extension.helloWorld', () => {
    vscode.window.showInformationMessage('Hello World!');
});
Run Code Online (Sandbox Code Playgroud)

另外,我尝试禁用在扩展名中添加和不添加其已注册命令的扩展名,context.subscriptions在两种情况下都禁用后,命令不可用。

所述VS代码API参考定义subscriptions为:

订阅:{dispose} []

可以添加一次性用品的阵列。停用此扩展后,将丢弃一次性用品。

这是否意味着如果不处理已注册的命令,那么即使关闭扩展名,它们的侦听器也会以某种方式徘徊?

TDLR-我是否应该订阅命令,为什么?

任何解释或见解将不胜感激!

Mat*_*ner 15

是的,您应该将命令添加到subscriptions. 订阅可确保在卸载扩展程序时正确注销您的命令。

vscode.commands.registerCommand返回一个一次性对象。处理返回的对象会取消注册命令,从而允许 VS Code 清理它可能拥有的任何内部状态/句柄。

简而言之,扩展程序创建的所有一次性对象都应该subscriptions以某种方式进入,以便在卸载扩展程序时可以正确清理它们。99% 的情况下,未能注册一次性工具可能不会对用户造成明显问题,但在用户启用和禁用您的扩展程序而没有重新启动 vscode 的情况下可能会导致问题