TL;DR
ElectronのRendererProcess
でElm(v0.17)でコンパイルされたJSを動かすには
Elmのサンプルで
var app = Elm.Main.fullscreen();
となっている部分を
var app = module.exports.Main.fullscreen();
とすれば動く
何が起こっているか
Elmが生成するJSの変化
Elmは0.17でかなりドラスティックなアーキテクチャの変更を行った事は知られているが、実はコンパイルされるJSも結構変化している。
具体的にはv0.16では問答無用にグローバルなElm
というオブジェクトを作っていたが、v0.17以降はmodule
のtypeを調べ、objectとして存在する場合はmodule.exports
にElm
を渡す以下のようなコードが生成される。
if (typeof module === "object")
{
module['exports'] = Elm;
return;
}
これは一部界隈で時々話題に挙がるサーバーサイドでのElmの活用を睨んだ変化だと考えられる(要出典)
ElectronのnodeIntegration
一方でElectronのRendererProcess
を生成する、
BrowserWindow
というAPIには、nodeIntegration
というオプションが存在し、
Electronの各種APIを活用するにはほぼ必須のオプションとなっている。
このオプションは様々なフレームワークと一緒に使う場合に
同様の競合を引き起こすらしく、FAQにもその事に関する記述がある。
本当に単純なWebアプリをデスクトップ化したいだけなら思い切って
nodeIntegration
をOff(false
)にしてしまうのも手かもしれない。
その場合は従来通りグローバルなElmオブジェクトが生成され、サンプル通りのコードで動く。
その他
elm+electronに関してはこれまで記事に書いてきたりしましたが、
v0.17になり陳腐化しています。
elmtrnも現状ではv0.16対応です。(そのうち直す気はあります。)
追記
elmtrn v0.17 対応完了しました。