智剧通(ZJT)文档中心 智剧通 - 节点注册表系统
本文档抓取自官方文档中心(2026-10-10 快照),具体功能以实际产品为准。

节点注册表系统

概述

节点注册表系统是工作流中节点类型管理的核心机制。它负责节点类型的注册、创建和恢复,确保工作流的正确加载和运行。

架构设计

核心组件

组件文件职责
节点注册表node_registry.js中央类型分发注册表
节点基类工厂node_base.js通用节点创建工厂
输入端口注册node_base.js输入端口配置管理
各节点文件\*\_node.js具体节点类型实现

注册表结构

// node_registry.js
var nodeRegistry = {};

function registerNodeType(type, entry) {
  nodeRegistry[type] = entry;
}

function restoreNodeByRegistry(nodeData) {
  var entry = nodeRegistry[nodeData.type];
  if (entry && entry.createWithDataFn) {
    entry.createWithDataFn(nodeData);
    return true;
  }
  return false;
}

每个注册项包含:

节点基类工厂

createNodeBase

通用节点创建工厂,处理所有节点类型的通用逻辑:

createNodeBase({
  type: 'node_type',           // 节点类型标识
  title: '节点标题',           // 默认标题或函数
  defaultData: { ... },        // 默认数据对象或函数
  ports: [ ... ],              // 输入输出端口配置
  cssClass: 'extra-class',     // 额外 CSS 类
  width: 300,                  // 节点宽度
  height: 200,                 // 节点高度
  bodyHtml: '<div>...</div>',  // 节点体 HTML 或函数
  titleIcon: '<svg>...</svg>', // 标题图标 SVG
  onCreated: function(node, el, opts) { ... }  // 创建后回调
}, opts);

处理流程:

  1. 分配唯一节点 ID
  2. 计算位置(避免重叠)
  3. 创建 DOM 结构
  4. 绑定事件处理
  5. 添加调试按钮
  6. 执行 i18n 扫描
  7. 调用 onCreated 回调

createNodeWithDataFactory

高阶函数,包装创建函数以支持工作流恢复:

var createXxxNodeWithData = createNodeWithDataFactory(
  createXxxNode,                          // 原始创建函数
  function(el, node, nodeData) { ... }    // DOM 恢复逻辑
);

恢复流程:

  1. 保存当前 nextNodeId 状态
  2. 恢复保存的 nextNodeId
  3. 调用原始创建函数
  4. 合并保存的数据到节点
  5. 调用 DOM 恢复函数
  6. 恢复 nextNodeId 状态

输入端口注册

端口注册机制

// 注册输入端口
registerInputPorts('node_type', [
  { type: 'video', label: '视频输入' },
  { type: 'audio', label: '音频输入' }
]);

// 获取端口配置
var ports = getInputPorts('node_type');

预设端口类型

PORT_PRESETS = {
  VIDEO_INPUT: { type: 'video', label: '视频输入' },
  AUDIO_INPUT: { type: 'audio', label: '音频输入' },
  IMAGE_INPUT: { type: 'image', label: '图片输入' }
}

端口发现

连接系统通过 findNearestConnectablePort 自动发现可连接的端口:

注册的节点类型

新式节点(使用 createNodeBase)

类型文件说明
texttext_node.js文本注释节点
text_to_speechtext_to_speech_node.js文字转语音节点
camera_controlcamera_control_node.js相机控制节点
dialogue_groupdialogue_group_node.js对话组节点
digital_humandigital_human_node.js数字人节点
extract_frameextract_frame_node.js提取帧节点

旧式节点(手动 DOM)

类型文件说明
videovideo_node.js视频节点
imageimage_node.js图片节点
audioaudio_node.js音频节点
scriptscript_node.js剧本节点
shot_groupshot_group_node.js分镜组节点
shot_frameshot_frame_node.js分镜帧节点
image_to_videoimage_to_video_node.js图生视频节点

工作流恢复流程

恢复入口

// workflow.js
function restoreNode(nodeData) {
  // 优先使用注册表恢复
  if (typeof restoreNodeByRegistry === 'function' && restoreNodeByRegistry(nodeData)) {
    return;
  }

  // 回退到旧式手动恢复
  switch (nodeData.type) {
    case 'video': createVideoNodeWithData(nodeData); break;
    case 'image': createImageNodeWithData(nodeData); break;
    // ...
  }
}

恢复顺序

  1. 检查节点是否在注册表中注册
  2. 如果已注册,调用 createWithDataFn
  3. 如果未注册,使用 if-else 链手动恢复
  4. 合并保存的数据到新创建的节点
  5. 恢复 DOM 状态和事件绑定

新式节点开发模式

标准模板

(function() {
  // 1. 定义端口配置
  var NODE_PORTS = [
    { type: 'video', label: '视频输入', side: 'left' },
    { type: 'video', label: '视频输出', side: 'right' }
  ];

  // 2. 定义创建函数
  function createXxxNode(opts) {
    return createNodeBase({
      type: 'xxx',
      title: 'XXX 节点',
      defaultData: { key: 'value' },
      ports: NODE_PORTS,
      width: 300,
      height: 200,
      bodyHtml: function(node) {
        return '<div>...</div>';
      },
      onCreated: function(node, el, opts) {
        // 初始化逻辑
      }
    }, opts);
  }

  // 3. 定义数据恢复工厂
  var createXxxNodeWithData = createNodeWithDataFactory(
    createXxxNode,
    function(el, node, nodeData) {
      // DOM 恢复逻辑
    }
  );

  // 4. 暴露到全局并注册
  window.createXxxNode = createXxxNode;
  registerNodeType('xxx', {
    createFn: createXxxNode,
    createWithDataFn: createXxxNodeWithData
  });
})();

注意事项