在vscode扩展中订阅命令的目的是什么?

问题描述 投票:3回答:1

为什么VSCode扩展教程建议订阅注册命令到context.subscriptions

到目前为止,它似乎没有必要或有用。

这是来自VSCode扩展code snippetofficial 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 Referencesubscriptions定义为:

订阅:{dispose} []

可以添加一次性物品的阵列。当该延伸部分停用时,将丢弃一次性物品。

这是否意味着如果未处理已注册的命令,那么即使在扩展关闭后,他们的听众也会以某种方式徘徊?

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

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

visual-studio-code vscode-extensions
1个回答
3
投票

是的,您应该将命令添加到subscriptions。订阅可确保在卸载扩展时正确取消注册命令。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.