Elm の未使用関数削除と port の呼び出し
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