兼容性
对 EdgeLinkd 而言,兼容 Node-RED 意味着什么,以及迁移流程前需要检查的事项。
EdgeLinkd 是兼容 Node-RED 的运行时,而不是 Node-RED 的克隆。它面向嵌入式与资源受限的部署场景,这一点从两个方向塑造了它的兼容性契约。
契约
EdgeLinkd 提供的功能,行为与 Node-RED 一致。 对它提供的每一个节点、选项与属性类型,可观察到的行为——消息语义、错误与状态、编辑器契约——都必须与固定的上游版本 Node-RED v4.0.9 相符。移植过来的规范测试正是在断言这一点。
超出预算的功能,不予提供。 如果某项功能的内存或体积开销超出目标硬件的承受范围,或者依赖 Node.js 生态,那么它就是有意不纳入范围的。这是一项设计决策,而不是缺陷,也不是待办事项。
绝不假装支持。 编辑器能够产生的任何配置,要么正常工作,要么立即、明确地失败:部署错误、节点错误或状态,或者 NotSupported。不会出现"接受了选项却悄悄忽略"的情况。
如何解读状态
- 项目 README 记录了功能级别的状态。勾选标记表示该功能已通过从 Node-RED 移植来的集成测试。
- 在线规范覆盖率页面 按版本、节点和单条测试比对移植测试与上游的
describe()与it()标题。 - 标记为
@pytest.mark.skip(reason=...)的上游测试代表一项有意的范围决策,其 reason 会写明不支持的功能。
迁移流程之前
- 盘点节点类型。
edgelinkd list会列出你的二进制中编译进来的全部节点类型,将其与flows.json中用到的类型逐一比对。 - 替换仅存在于 npm 的节点。 来自 npm 生态的第三方节点无法在 EdgeLinkd 上运行。请把相应逻辑改用核心节点或
function节点实现,或者编写一个 Rust 节点插件。 - 检查
function节点。 代码运行在 QuickJS 中,而不是 Node.js:- 没有 Node.js 的
Buffer——RED.util.ensureBuffer()返回Uint8Array; - 无法使用
require()与 npm 模块; RED.util.prepareJSONataExpression()与evaluateJSONataExpression()会以NOT_SUPPORTED失败,因为 JSONata 由 Rust 运行时负责;- 带格式字符串调用
RED.util.evaluateNodeProperty(v, "date")会以NOT_SUPPORTED失败,因为沙箱中没有moment。
- 没有 Node.js 的
- 检查 JSONata 表达式。 不支持
$moment();调用它的表达式会报错,而不是返回一个值。 - 部署并观察。 不支持的配置会在部署时或通过节点状态暴露出来——绝不会悄无声息。
反馈差异
如果某个已支持的节点与 Node-RED v4.0.9 的行为不一致,那就是缺陷。欢迎附上能复现问题的最小 flows.json,提交 issue。