Obecně mě zaujala myšlenka virtuálního DOMu, kompletní umístění view logiky na frontend (konec dvoukolejnosti) a její znovupoužitelnost
EDIT: jo, ještě jsem zapomněl důležitou poznámku: SPAs mě nezajímají, dělám klasické "stránkové" aplikace, i když třeba s dynamickým obsahem ládovaným pomocí WS.
S umístění view logiky na frontend jsem začal s Angularem - a v momentě, kdy to uděláš, tak na backendu v podstatě nepotřebuješ framework a vznikne ti SPA. Následně jsem zjistil (možná to jiní budou mít jinak), že už nikdy žádný backendový framework nechci potkat. Je to trošku syndrom "když máš kladivo, je všechno pro tebe hřebík", ale psaní aplikací tímhle způsobem je prostě komfortní a hlavně z ničeho nic můžeš mít naprosto "normální" backend psaný v "normálním" jazyce bez nějakých frameworkových vymyšleností (nemám zkušenosti s tím, jak frameworky "pomáhají" řešení autorizace, nevím, nakolik to u REST API jde principiálně zjednodušit). Mám trochu pocit, že SPA a "view logika na frontendu" je v podstatě totéž (protože když už tu view logiku děláš na frontendu, tak mi trochu nedává smysl dělat ovládání toho view na backendu).
Mám trochu zkušenosti s GHCJS.
+ Sdílení kódu s backendem
+ Prakticky neřešíš API mezi backendem a frontendem - stačí mít serializační instance pro data (auto-generované), která si posíláš, "a je to". Když v API něco změníš, kompilátor ti pohlídá, že ti to na frontendu i backendu souhlasí
+ Normální (i nenormální - s extensionama) haskell
- Pokud knihovna používá nějaké C FFI, tak to nemusí fungovat - ale většina běžných knihoven funguje, je možnost to doplnit přes "JS shims"
- V angularu jsem byl zvyklý používat angular-bootstrap jako UI knihovnu - v ghcjs (resp. reflex) to není, a je to potřeba napsat (možná časem něco zveřejním)
- Reflex (FRP)....je trochu zvláštní. Když máš stránku, kde na sobě navzájem závisí několik různých prvků, tak skončíš s "pavučinou" napsanou v RecursiveDo. Zatím mi to nepřipadá úplně "skvělé a úžasné", na druhou stranu nevím, jestli principiálně existuje možnost to zjednodušit, protože na té stránce skutečně ty prvky mezi sebou mají pavučinu závislostí. Asi se časem poohlédnu po alternativách - existují bindingy React, možná se s tím bude psát lépe? Když v jQuery člověk napíše nějaký selector, tak je to vlastně strašně silný nástroj, jenže bez typové kontroly....
- Zkompilovaný js je VELKÝ (1MB+)
- Rychlost - není to úplná tragédie, zas to není nějaká extra výhra. Ono se to tak trochu renderuje "postupně" ("Dynamic v Dynamicu") a pokud je nějaká výrazně dynamičtější stránka (generovaná stylem dynamic v dynamicu), tak to je vidět
* kupodivu to funguje jak má - ne že by člověk nenarazil občas na chybu, ale zatím nic zákeřného
Alternativa je Haste, který by se měl kompilovat do výrazně menšího JS, zas spoustu věcí z haskellu neumí, což je trochu problém. Sdílení kódu (nebo aspoň datových struktur) s PureScriptem a Elemem je prý možné, ale nic moc...