サブフローをモジュールとしてパッケージ化

サブフローモジュールは、Node-RED 1.3で追加されました。
現段階では、実験的な機能です。 もし、自身のサブフローを公開する場合は、よくテストしてください。

サブフローをnpmモジュールとしてパッケージ化し、他のノードと同じ様に配布できます。

インストールすると、通常のノードとしてパレットに表示されます。ユーザは、サブフローの内部のフローを参照したり、編集したりすることはできなくなっています。

現段階は、サブフローモジュールの作成は、サブフローのJSONを手動で編集する作業になっています。将来的には、これを自動化するツールを提供する予定ですが、この手順は着手するための手助けになるはずです。

サブフローの作成

どんなサブフローもモジュールとしてパッケージ化できます。それを行う前に、どの様に使われるかを考える必要があります。以下のチェックリストは、考慮すべき点を気づくために役立つでしょう:

  • 構成 - ユーザはサブフローに何を設定する必要があるか。サブフロープロパティの編集ダイアログを介して、サブフローのプロパティや、プロパティを設定するためのUIを定義できます。
  • エラーハンドリング - サブフローはエラーを適切にハンドリングするか。いくつかのエラーは、サブフロー内でハンドリングする方法が適切である場合があります。また、エンドユーザーがそれらのエラーをハンドリングできる様に、サブフローから外へ渡す必要がある場合もあります。
  • ステータス - 「ステータス」ノードを用いて、カスタムステータスの出力する様に、サブフローに機能追加できます。
  • 外観 - サブフローが提供する機能に適した、アイコン、色、カテゴリをサブフローに与えるようにしてください。

サブフローのメタデータを追加

サブフローは、パッケージ化されるモジュールを定義するための、追加のメタデータを持つことができます。

サブフロープロパティの編集ダイアログにて、以下のプロパティを設定できます:

  • モジュール - npmパッケージ名
  • ノードの型 - デフォルトでは、サブフローのidプロパティが使われます。より適切な型を指定すると良いでしょう。通常のノードの型と同様に、他のノードとの競合を避けるために、一意である必要があります。
  • バージョン
  • 説明
  • ライセンス
  • 作者
  • キーワード

モジュールの作成

この手順は、Node-REDの外部で行う手動の作業です。

  1. モジュールに付ける名前でディレクトリを作成します。この例では node-red-example-subflow を使用します。

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

  2. package.json ファイルを作成するために npm init を使用します:

    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. In the Node-REDエディタ上で、ワークスペースに新しいサブフローのインスタンスを追加します。
  2. インスタンスを選択後、そのノードを書き出し(Ctrl-E または メニュー->書き出し)、JSONをテキストエディタへ貼り付けます。書き出しダイアログのJSONタブにおいて ‘インデント付きのJSONフォーマット’ オプションを選択しておくと、次のステップがより容易になるでしょう。

このJSONは、ノードのオブジェクトから成る配列として構造化されています。後ろから2つ目のエントリは、サブフローの定義です。また、最後のエントリは、ワークスペースに追加したサブフローのインスタンスです。

[
   { "id": "ノード1", ... },
   { "id": "ノード2", ... },
   ...
   { "id": "ノードn", ... },
   { "id": "サブフロー定義ノード", ... },
   { "id": "サブフローのインスタンスノード", ... }
]
  1. サブフローのインスタンスノード(配列の末尾のエントリ)を削除
  2. サブフロー定義ノードをファイルの先頭(配列の [ の直後)へ移動
  3. サブフロー定義ノード の中に "flow" という新規プロパティを作成し、残りのノードの配列をその中へ移動
  4. 移動したエントリの間のカンマを整える
  5. subflow.json というファイル名で保存
{
    "id": "サブフロー定義ノード",
    ...
    "flow": [
       { "id": "ノード1", ... },
       { "id": "ノード2", ... },
       ...
       { "id": "ノードn", ... }
    ]
}

package.jsonを更新

最後のタスクは、Node-REDがモジュールの内容を認識できるように package.json を更新することです。

.js ファイルのエントリを持つ "nodes" セクションを含む "node-red" セクションを追加します:

{
    "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"
    }
}