Elm の port に関連して, さらにハマったのでメモ.

詳細

port unusedFucntion : () -> Cmd msg -- Elm コード中で呼ばれていない
port usefulFunction : () -> Cmd msg -- Elm コード中で呼ばれている

のような場合を考えます.

このとき, 以下のような JavaScript コードを実行しているとします.

const { Elm } = require("./main.js");

const app = Elm.Main.init({
  node: document.getElementById("elm"),
});

app.ports.unusedFucntion.subscribe((data) => {
  // ...
});

app.ports.usefulFunction.subscribe((data) => {
  // ...
});

ここで, Elm のコンパイルを行うと, dead code elimination によって unusedFucntion が消去されます. すると, app.ports.unusedFucntion が見つからないのでエラーとなり, app.ports.usefulFunction.subscribe も正しく実行されず, 結果 Elm 側から usefulFunction を呼び出しても何も起こらない, ということになります.

普通に開発してたらすぐ気づきそうなものですが,

  • Electron の Renderer プロセス上で動かしていた
  • デバッグのために unusedFucntion に相当する処理を一時的にコメントアウトしていた

などの状況が重なったせいでしばらく気づけずハマりました.

参考

https://discourse.elm-lang.org/t/typeerror-accessing-port/3119