跳到主要内容

为什么要判断配置变更是否影响自己?

结论​

onDidChangeConfiguration 在任何设置变化时都会触发。回调里先用 affectsConfiguration 判断是不是自己的键,再重读和重建。不判断的话,用户改一个无关设置,你也会重启语言服务器或刷新整棵树。

展开​

vscode.workspace.onDidChangeConfiguration((event) => {
if (!event.affectsConfiguration("myext", documentUri)) {
return;
}
reload();
});

第二个参数同样是作用域。多根窗口里,另一个文件夹改了配置,不应把当前文件夹的服务重启掉。

回调里做的事要和键匹配。启用开关变化可以重启后台;仅仅改了界面字号就推倒语言服务器,会让输入卡一下,用户也找不到原因。

键可以写到具体项,例如 myext.enable,也可以写 section myext。监听整个 section 时,里面任一键变化都会为真。

不要在回调里无条件 config.update。设置变化再写设置,容易和别的监听器互相触发。

如果重建很贵,对连续修改做防抖,停手之后再重启一次。

容易讲错的点​

  • 事件不带「新值」这一个字段给你直接用。要自己 getConfiguration 再读。
  • affectsConfiguration 为真只说明相关层发生了变化,不说明值一定和内存里不同。比较之后再决定要不要重启。
  • 监听器必须放进 subscriptions。漏了的话,重载插件后旧监听还在用旧闭包。