when 实现原理: 通过字符串切割的形式实现。 主要分几个步骤:

  1. 安装/加载扩展
  2. 主进程中的扩展管理服务,会监听到扩展安装/卸载。获取到扩展的 package.json 之后,所有的贡献点会被各自贡献点服务接受到。下面就以 Menu 为例说明 When 句子的后续链路:
  3. Menu 贡献点服务会将贡献点注册到 Menu 服务中。对于每一项 Menu,通常都意味着一个 command + 一个 when 句子, when 句子用于控制 Menu 是否显示。
  4. menuService 会将 Menu 的 when 句子注册到 whenService 中。
  5. 寻找字符串中的 == != > >= 之类的判断语句,先将字符串语句切割。
  6. 分段继续搜索,找 ! && || ~= 之类的条件语句,分别会将前面的字符串切割并定义为 false 表达式,与表达式等判断。contextFalseExpr
  7. 最后只剩下字符串中的变量以及常量。对于所有不能识别出的值,默认会先认为它是变量,从上下文中搜索,是否 content 中有对应的变量,如果有,则需要将变量与 when 条件进行关连,依赖收集,用于后续变量值修改之后,重新执行 when 语句。
  8. menu 等模块,渲染具体 items 时,会将 content 注入,判断当前的 when 语句返回的值是什么,如果是 true 则渲染;如果是 false,则不渲染。并且会通过 contentService 监听 onchange 事件,如果当前 content 修改的变量是被收集到的变量,则重新执行 when 语句,判断是否需要重新渲染。
Last Updated:
Contributors: yiliang114