将子流打包为模块

子流模块是在 Node-RED 1.3 中添加的。
在此阶段,它们应被视为实验性功能。如果您选择发布自己的子流,请确保它已经过彻底测试。

子流可以打包为 npm 模块,并像任何其他节点一样分发。

当它们被安装后,会像常规节点一样出现在节点面板中。用户无法查看或修改子流内部的流。

在现阶段,创建子流模块是一个需要手动编辑子流 JSON 的过程。我们将来会提供工具来帮助自动化这个过程——但目前,这些说明应该能帮助您入门。

创建一个子流

任何子流都可以打包成一个模块。在您这样做之前,需要考虑它将如何被使用。以下清单可以有效提醒您需要考虑的事项:

  • 配置 - 用户需要在子流中配置什么。您可以通过子流属性编辑对话框定义子流属性以及用于设置这些属性的UI界面。
  • 错误处理 - 您的子流是否正确处理了错误?有些错误在子流内部处理可能更合理,有些可能需要传递出子流,让最终用户来处理。
  • 状态 - 您可以为您的子流添加一个自定义状态输出,这个状态可以被“Status”(状态)节点处理。
  • 外观 - 确保为您的子流提供一个与其功能相符的图标、颜色和分类。

添加子流元数据

子流可以包含额外的元数据,用于定义它将被打包成的模块。

子流模块属性编辑对话框中,您可以设置以下属性:

  • 模块 (Module) - npm 包名
  • 节点类型 (Node Type) - 这将默认为子流的 id 属性。提供一个更好的类型值会很有帮助。与常规节点类型一样,它必须是唯一的,以避免与其他节点冲突。
  • 版本 (Version)
  • 描述
  • 许可证 (License)
  • 作者 (Author)
  • 关键词 (Keywords)

创建模块

这是在 Node-RED 之外需要手动操作的地方。

  1. 创建一个目录,并以您想给模块起的名字命名。在本例中,我们将使用 node-red-example-subflow

    mkdir node-red-example-subflow cd node-red-example-subflow

  2. 使用 npm init 创建一个 package.json 文件。

    npm init

它会问一系列问题——请提供与您添加到子流元数据中的值相匹配的答案。

  1. 添加一个 README.md 文件——因为所有好的模块都必须有一个 README。

  2. 为您的模块创建一个 JavaScript 包装器。在本例中,我们将使用 example.js

     const fs = require("fs");
     const path = require("path");
    
     module.exports = function(RED) {
         const subflowFile = path.join(__dirname,"subflow.json");
         const subflowContents = fs.readFileSync(subflowFile);
         const subflowJSON = JSON.parse(subflowContents);
         RED.nodes.registerSubflow(subflowJSON);
     }
    

    它会读取一个名为 subflow.json 文件的内容——我们稍后会创建这个文件——解析它,然后将其传递给 RED.nodes.registerSubflow 函数。

添加您的子流 JSON

完成所有这些准备工作后,您现在可以将子流添加到模块中了。这需要对子流 JSON 进行一些仔细的编辑。

  1. 在 Node-RED 编辑器中,将您的子流的一个新实例添加到工作区。
  2. 选中该实例后,导出节点(Ctrl-E菜单->导出),并将 JSON 粘贴到文本编辑器中。如果您在导出对话框的 JSON 选项卡上选择“格式化”选项,接下来的步骤会更容易。

JSON 的结构是一个节点对象的数组。倒数第二个条目是子流定义,最后一个条目是您添加到工作区的子流实例。

[
   { "id": "Node 1", ... },
   { "id": "Node 2", ... },
   ...
   { "id": "Node n", ... },
   { "id": "Subflow Definition Node", ... },
   { "id": "Subflow Instance Node", ... }
]
  1. 删除子流实例节点——即数组中的最后一个条目。
  2. 将子流定义节点移动到文件的顶部——在数组的起始 [ 之前。
  3. 将剩余的节点数组移动到子流定义节点*内部*,作为一个名为 "flow" 的新属性。
  4. 确保清理掉移动条目之间多余的逗号。
  5. 将此文件另存为 subflow.json
{
    "id": "Subflow Definition Node",
    ...
    "flow": [
       { "id": "Node 1", ... },
       { "id": "Node 2", ... },
       ...
       { "id": "Node n", ... }
    ]
}

更新您的 package.json

最后的任务是更新您的 package.json,以便 Node-RED 知道您的模块包含什么。

添加一个 "node-red" 部分,其中包含一个 "nodes" 部分,该部分包含一个指向您的 .js 文件的条目。

{
    "name": "node-red-example-subflow",
    ...
    "node-red": {
        "nodes": {
            "example-node": "example.js"
        }
    }
}

添加依赖项

如果您的子流使用了任何非默认节点,您必须确保您的 package.json 文件将它们列为依赖项。这将确保它们会与您的模块一起被安装。

这些模块被列在标准的顶层 "dependencies" 部分*以及* "node-red" 部分中的 "dependencies" 部分。

{
    "name": "node-red-example-subflow",
    ...
    "node-red": {
        "nodes": {
            "example-node": "example.js"
        },
        "dependencies": [
            "node-red-node-random"
        ]
    },
    "dependencies": {
        "node-red-node-random": "1.2.3"
    }
}