Immutable.jsとElectronとipc
Electronアプリで「statesはmain processで持つ」「statesはimmutable.jsのMap/List/Recordで持つ」とすると,rendererに送るときにPOJO化しちゃって旨味が半減するのが厳しい
— izumin (@izumin5210) November 16, 2016
どういう構成?
- Redux/FluxのStoreをmain process側で持ってる
- 『Electron + React + Redux - KAYAC engineers' blog』の後半の構成に近い
- Storeは
Immutable.Map,個々のStateはImmutable.Record,もしくはImmutable.List - 参考: 『React使い必見! Immutable.jsでReactはもっと良くなる by 森脇 健斗 | Wantedly Engineer Blog』
- rendererでActionをipcRendererでmainに送る(
ipcRenderer.send()) - mainのipcMainでActionを受け取って,それをStoreにdispatchする
- Storeが更新されたらrendererに送りつける(
mainWindow.webContents.send())
なにが問題?
main -> rendererにStoreを送る際,Immutable.RecordでつくったModelクラスのメソッドとかが全て消滅する.別プロセスにオブジェクトを送ってるので当たり前っちゃ当たり前ではある.
そのままだと使いづらさの極みみたいなオブジェクトが送られることになるので,toJS()してあげないといけない.これでPlainなJS Objectになるのでとりあえず扱いやすい形にはなる.が,Modelつくったメリットをrenderer側で享受することはできない.
属性値から別の値を計算するみたいなの(e.g. カート内アイテムの合計金額)はModelのインスタンス作るときにキャッシュしといてtoJS()しても残るようにしといたほうが良さそう.
雑
Immutable.jsいらんくね
renderer側でImmutable.jsの恩恵ないならムリして使う必要も無い気もする,が,reducerでstate更新するの楽なんやで.
mainでstore持つ意味なくね
やってみたかっただけ.
あとでWebに持っていくときにWorkerに移しやすいかなと思って.