在 vscode 扩展中订阅命令的目的?
Posted
技术标签:
【中文标题】在 vscode 扩展中订阅命令的目的?【英文标题】:Purpose for subscribing a command in vscode extension? 【发布时间】:2019-08-28 10:58:20 【问题描述】:为什么 VSCode 扩展教程建议将注册的命令订阅到context.subscriptions
?
据我目前所知,这似乎没有必要或有用。
这是来自 VSCode 扩展 official tutorial 的 code snippet:
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 - 我是否应该订阅我的命令,为什么?
任何解释或见解将不胜感激!
【问题讨论】:
【参考方案1】:是的,您应该将您的命令添加到subscriptions
。订阅可确保在卸载扩展程序时正确注销您的命令。
vscode.commands.registerCommand
返回一个一次性对象。处理返回的对象会取消注册命令,从而允许 VS Code 清理它可能拥有的任何内部状态/句柄。
简而言之,您的扩展程序创建的所有一次性对象都应该以某种方式进入subscriptions
,以便在卸载您的扩展程序时可以正确清理它们。未能注册一次性可能不会在 99% 的情况下给用户带来明显的问题,但在用户启用和禁用您的扩展程序而不重新启动 vscode 等情况下可能会导致问题
【讨论】:
以上是关于在 vscode 扩展中订阅命令的目的?的主要内容,如果未能解决你的问题,请参考以下文章
VSCode Prettier 扩展 vs 命令行 Prettier