扩展钩子
在 Comfy 执行的不同阶段,应用会调用#invokeExtensionsAsync 或 #invokeExtensions,并传入钩子的名称。
这些方法会在所有已注册的扩展上调用同名方法(如果存在),比如上面例子中的 setup。
Comfy 提供了多种钩子,供自定义扩展代码使用,以修改客户端行为。
下面介绍了一些最重要的钩子。由于 Comfy 仍在积极开发中,新的钩子会不时加入,因此可以在 app.js 中搜索 #invokeExtensions 以查找所有可用钩子。
另请参阅钩子的调用顺序。
常用钩子
从beforeRegisterNodeDef 开始,大多数扩展都会用到它,通常也是唯一需要的钩子。
beforeRegisterNodeDef()
对每种节点类型(即AddNode 菜单中可用的节点列表)调用一次,用于修改节点的行为。
nodeType 参数本质上是该类型所有节点的模板,因此对 nodeType.prototype 的修改会应用到所有该类型节点上。nodeData 封装了 Python 代码中定义的节点相关信息,如类别、输入和输出。app 是主 Comfy app 对象的引用(你应该已经导入了它!)
常见做法是检查 nodeType.ComfyClass,它保存了该节点对应的 Python 类名,以判断是否需要修改该节点。通常这意味着只修改你自己添加的自定义节点,但有时也可能需要修改其他节点(或其他自定义节点也可能修改你的节点!),此时要注意兼容性。
在 beforeRegisterNodeDef 中非常常见的做法是”劫持”已有方法:
?.apply 保证即使没有原方法也不会出错),然后执行额外操作。根据你的代码逻辑,可能需要在新方法的其他位置调用 apply,甚至有条件地调用。
以这种方式劫持方法时,建议查看核心 comfy 代码(断点调试很有用),以确保方法签名一致。
nodeCreated()
nodeType 上的 ComfyNode() 构造函数结束时)。在这个钩子里你可以修改节点的具体实例。
init()
LiteGraph 对象)的方法,从而修改核心 Comfy 行为。详见Comfy 对象与劫持。
setup()
调用顺序
以下顺序是通过在 Comfyapp.js 文件中插入日志代码获得的。你也可以用类似方法帮助理解执行流程。