将子流程打包为模块

Subflow Modules were added in Node-RED 1.3.
They should be considered experimental at this stage. If you chose to publish your own Subflow, please ensure it has been thoroughly tested.

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

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

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

创建子流程

任何子流程都可以打包为一个模块。在操作之前,您需要考虑它将如何被使用。以下检查清单有助于提醒需要考虑的事项:

  • 配置 - 用户需要在子流程中配置哪些内容。您可以通过子流程属性编辑对话框定义子流程属性以及设置这些属性时提供的用户界面。
  • 错误处理 - 你的子流程是否正确处理了错误?有些错误适合在子流程内部处理,有些可能需要传递到子流程外部以便最终用户处理。
  • 状态 - 您可以为子流程添加自定义状态输出,该输出可由'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"
    }
}