# 扩展指南 ## 加节点不用重启 **先说清楚以前为什么会必须重启。** `shared/nodes.js` 里那三个导出 (`NODE_LIBRARY` / `NODE_BY_TYPE` / `NODE_CATEGORIES`)以前是 `Object.freeze` 的模块级常量,只在**首次 import 那一刻**算一次: | | 怎么拿到节点库 | 改了之后 | |---|---|---| | 面板 | 浏览器经 `/module/…` **从磁盘现拉** | 刷新页面就生效 | | 宿主 | `host/index.js` 静态 import,进了 ESM 缓存 | 进程活着就永远是旧的 → **只能重启** | 所以那三个导出改成了**同一批对象、原地重建**(引用不变、内容更新), 所有持有者自动跟着变。在此之上有两条路: ### 一、用户节点:丢一个 JSON 就多一个节点 写在 `<工作区>/library/nodes/*.json`(工作区里已经放了一个能用的例子 `library/nodes/wave-line.json`): ```json { "type": "waveLine", "title": "波形线", "category": "自定义", "inputs": [{ "id": "uv", "type": "vec2", "def": 0 }], "outputs": [{ "id": "out", "type": "vec4" }], "params": { "thickness": { "type": "float", "value": 0.02, "min": 0.002, "max": 0.2, "label": "线宽" } }, "glslPrelude": "vec4 st_waveLine(vec2 uv, float w) { … }", "code": "st_waveLine($in.uv, $p.thickness)" } ``` 宿主每次用到工作区时按「文件名 + mtime + size」的签名比对,变了就重读; 面板点节点库右上角的 **↻** 同步(重开面板也会同步)。**全程不重启。** 用户节点在库里带「用户」标记,和内置节点区分开。写错了不会静默: 坏文件的文件名 + 原因会进诊断日志,好文件照常加载。 ### 二、组(Group)元节点:搭好一张子图,打包成节点 画布上框选若干节点 → 右键 → **打成 Group**:它们变成一个 `group` 节点, 内部连线留在子图里,**跨边界的连线自动变成组的输入/输出端口**, 所以打完组图的语义完全不变。右键「拆开组」可以还原。 组是元节点:子图**内联**在组节点的 `params.graph` 里(不是引用外部文件), 所以材质自包含,宿主和浏览器两侧的生成器各自递归展开就行。 **这才是给工作台加能力的正路:搭图 + 打包,不碰插件源码,也就不涉及重启。** ### 三、真的改了内置节点源码 节点库右上角 **↻** 会同时带查询串重新 import 插件的 `shared/nodelib.js` (Node 的 ESM 缓存按完整 URL 算,拿到的是新副本),再原地重建注册表 —— **连改内置节点也不用重启进程**。也可以直接调接口: ```bash curl -X POST http://127.0.0.1:19387/plugins/dsh-shader-workbench/api \ -H 'content-type: application/json' -d '{"action":"nodelib.reload","builtin":true}' ``` ---