将子流程打包为模块

子流程模块在 Node-RED 1.3 中添加。
在这个阶段,它们应被视为实验性。如果您选择发布自己的子流程,请确保它经过充分测试。

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

安装后,它们将作为常规节点出现在调色板中。用户无法查看或修改子流程内部的流程。

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

创建子流程

任何子流程都可以打包为模块。在您这么做之前,您需要考虑它将如何使用。以下清单是一个有用的提醒,帮助您考虑各个方面:

  • 配置 - 用户需要在子流程中配置什么。您可以定义子流程属性以及提供设置这些属性的用户界面,通过 子流程属性编辑对话框
  • 错误处理 - 您的子流程妥善处理错误吗?某些错误在子流程内处理可能是合理的,而某些错误可能需要传出子流程,以便最终用户处理。
  • 状态 - 您可以向子流程添加一个自定义状态输出,可以由“状态”节点处理。
  • 外观 - 确保给您的子流程一个适合其功能的图标、颜色和类别。

添加子流程元数据

子流程可以持有额外的元数据,这些数据可以用来定义将要打包的模块。

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

  • Module - npm 包名
  • Node Type - 默认为子流程的 id 属性。提供一个更好的类型值是有帮助的。与常规节点类型一样,必须是唯一的,以避免与其他节点发生冲突。
  • Version
  • Description
  • 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": "子流程定义节点", ... },
   { "id": "子流程实例节点", ... }
]
  1. 删除子流程实例节点——数组中的最后一个条目。
  2. 将子流程定义节点移动到文件的顶部——在数组的开头 [ 之上。
  3. 将剩余的节点数组 放入 子流程定义节点内部,作为一个新的属性 "flow"
  4. 确保整理移动条目之间的任何尾随逗号。
  5. 将此文件保存为 subflow.json
{
    "id": "子流程定义节点",
    ...
    "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" 部分。

```json { “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” } }