这是逻辑的起点,决定了节点如何处理判定条件:
容器(Container):只要该节点有子菜单,它就是容器。它不看自己的匹配规则(URL/标题/文本)。它的存活完全取决于:“我的子孙里还有活着的吗?”
叶子(Leaf/执行项):没有子菜单的最终执行节点。它的存活取决于:“我是否完全符合当前的物理环境?”
对于叶子节点,必须通过以下所有“安检”才能存活:
| 维度 | 对应字段 | 过滤逻辑 |
| 场景标签 | Tags |
节点的标签库中必须包含当前环境激活的标签(如 chrome, file, global 等)。 |
| 文件路径 | matchExt / matchPath |
如果设置了,当前选中的文件后缀或路径必须符合正则匹配。 |
| 浏览器网址 | matchUrl |
在浏览器环境下,当前 Tab 的 URL 必须包含字段定义的关键词(如 taobao.com)。 |
| 窗口标题 | matchTitle |
当前活动窗口的 Title 必须符合正则匹配(如 旺店通, Photoshop)。 |
| 选中文本 | matchText |
如果设置了,选中的内容必须符合定义的正则(如匹配商品 ID 的数字)。 |
特殊规则:文本强制过滤
若节点拥有
text标签,但当前并未选中文本,该节点会强制隐藏,防止文本工具在非编辑场景下霸占菜单。
这是解决你提到的“父子显示冲突”的关键:
标签链条一致性:递归过程中,每一层都会检查 Tags。只有子项包含了当前场景标签(或父级的 UUID 标签),它才被允许进入候选名单。
存活向上汇报:
底层叶子节点进行“五维过滤”。
通过过滤的叶子向父级报告:“我活着”。
父级(容器)收到至少一个“活着的报告”,自己才会被渲染。
如果子项全军覆没,父级即便标签匹配也会销毁自身。
对于最终存活下来的节点,会根据热度算法进行排序:
半衰期算法:利用 usageCount(使用次数)和 updatedAt(更新时间)。
权重逻辑:最近常用的功能排在前面,久不使用的功能会随时间流逝逐渐下沉。
占位符替换:如果叶子节点是 action(动作)类型且 Data 为空,脚本会自动将 selectedText(选中文本)注入到 Data 中。这让你在查商品、查订单时,点一下就自动带入参数。
容器看子项,叶子看环境。
标签是门票,正则定生死。
文本没选中,text 标签全清空。
常用排在前,老旧后面站。
如果你发现某个菜单(如“多功能查询”)在不该出现的时候出现了,按以下步骤排查:
查标签:子项是否有不属于该环境的标签(如 chrome)?
查条件:子项是否漏设了 matchText 或 matchUrl?
查 UUID 关联:子项的 Tags 里是否正确关联了父项的 uuid?
这个逻辑确保了你的 e-commerce 菜单(如商品下载、订单登记)只在淘宝/天猫后台且标签匹配时浮现,保持界面的极简高效。