aboutsummaryrefslogtreecommitdiff
path: root/doc/todo/ditch_yesod.mdwn
blob: 0c85ab77d2d70294324079b3c685c7181947ea40 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
I'd like to move away from using yesod for the web app, for a number of
reasons:

* It's by far the largest use of TH in git-annex, and TH is of course very
  painful for the android port, other builds like debian mips that don't
  currently support TH, etc. (Update: mips does support it now, it seems!)
* I think it's responsible for at least 50% of the executable size, and I
  suspect a lot of that is unncessary bloat for parts of yesod that
  git-annex doesn't really use.
* Hamlet constantly annoys me by rejecting any file that contains tabs.
  **Rage**
* Hamlet contains code that's not really haskell, but looks a lot like it.
  This is a continual frustration when dealing with the hamlet files.
* I find that Hamlet does not lend itself to being refactored, everything
  is essentially an IO action with side effects of generating html, so
  can't really bring proper FP tools to bear.

At the moment, servant seems like the nicest place to end up. Just as type
safe as yesod afaik, and very lightweight and simple and rather awesome.

As for the html generation, lucid seems like a good way to do it. Just as
fast as hamlet, and pure haskell code.

Game plan:

1. Upload a yesod-lucid to hackage. (done)
2. Get servant (done), lucid (done), maybe yesod-lucid, packaged in Debian
3. Start converting individual yesod Handler Html to Handler LucidHtml.
   This will ditch the hamlet. This is by far the most work, but it can be
   done incrementally w/o breaking the build.
4. Need to find a way to deal with Hamlet widgets that add CS and JS to
   the page. Hamlet basically serves as a Writer monad to collect the HTML,
   CS, and JS that widgets add to a page, so a replacement for that would
   need to be developed.
5. Once all the hamlet is gone, remove the rest of the yesod stuff and
   re-implement the routing etc with servant.