# Shpadoinkle Backend Snabbdom
[](https://gitlab.com/platonic/shpadoinkle)
[](https://shpadoinkle.org/backend-snabbdom)
[](https://opensource.org/licenses/BSD-3-Clause)
[](https://builtwithnix.org)
[](https://hackage.haskell.org/package/Shpadoinkle-backend-snabbdom)
[](http://packdeps.haskellers.com/reverse/Shpadoinkle-backend-snabbdom)
[](https://matrix.hackage.haskell.org/#/package/Shpadoinkle-backend-snabbdom)
This package contains a script to setup the [Snabbdom](https://github.com/snabbdom/snabbdom) virtual dom library as a backend to render Shpadoinkle applications.
> Snabbdom consists of an extremely simple, performant, and extensible core that is only ≈ 200 SLOC. It offers a modular architecture with rich functionality for extensions through custom modules. To keep the core simple, all non-essential functionality is delegated to modules.
These design decisions made Snabbdom a good fit for Shpadoinkle's first high-performance pure JavaScript backend. Right now Snabbdom is being provided statically, and a [slightly modified build](https://github.com/fresheyeball/snabbdom) is included in this repo. Although this increases the size of the resulting executable, it's necessary for reproducible and stable builds.
# Building
In order to re-build `Shpadoinkle/Backend/Snabbdom/Setup.js`, it needs to be bundled with a tool like [parcel](https://parceljs.org/) - the following methodology is how it's currently done:
```bash
# clone outside the source directory of Shpadoinkl
git clone git@github.com:snabbdom/snabbdom.git
# compile its typescript so we can bundle the javascript
cd snabbdom && npm install && npm run compile
# Setup_src.js imports the snabbdom sources locally, so we need to manually move it
cp path-to-shpadoinkle/backends/snabbdom/Shpadoinkle/Backend/Snabbdom/Setup_src.js build/package/
# nix is most reliable for running parcel
nix-shell -p nodePackages.parcel-bundler --command "parcel build build/package/Setup_src.js"
# copy the bundled output as Setup.js
cp dist/Setup_src.js path-to-shpadoinkle/backends/snabbdom/Shpadoinkle/Backend/Snabbdom/Setup.js
```
Now when you build your shpadoinkle project, this new `Setup.js` will be statically allocated with your GHCJS output.