前置き
釣りなタイトルでスミマセン。
シリーズ化するかしないかはまだ決めていませんが、今後も地雷を踏むようであればまた書こうと思いますので、今回はhtmlグローバル汚染編と付けました。
Node-REDのv1.0が2019/09/30に出ました。いくつかの大きな変更があり、外観もさることながら内部の処理も変更になっています。既に公開されている多くのカスタムノードはv1.0未満で動作するよう書かれていますが、v1.0にすると動かなくなることもあると思います。このシリーズのエントリーでは、それがどういう現象なのか、どうして起こったのか、どう実装すれば良いのか、などを書いていきたいと思います。(前置き長っ)
現象 (不具合の内容)
インストール済のカスタムノードのうち、これに該当するものは、パレットに出現しなくなる。下記の画像はcustomカテゴリにカスタムノードをyour node 1, your node 2, your node 3の3種類を定義して再現させた図です。
原因や発生条件
htmlファイルのscriptブロックにおいて、RED.nodes.registerType()以外に、何かしらの定義がconstで行われており、その名称が他のノードの命名と被っている場合。
対応
各カスタムノードのスクリプトは、無名関数内で実行されるようにする。
<script type="text/javascript"> // グローバル名前空間の汚染を避ける (() => { // ここにいつも書いている処理を書く. // oneditprepareやoneditsaveなどで呼び出されるような // 共通のfunction定義. const yourCommonFunctionFromCustomNode = () => { // 何かしらの処理. }; // カスタムノードの定義. RED.nodes.registerType('your-custom-node', { // category: '', // ... // (略) }); })(); </script>
あとがき
結構ハマりました。
参考
そもそもv1.0で何が変わったの?はコチラへ。