Use the high-performance Snabbdom virtual dom library written in JavaScript.
Snabbdom is a battle-tested virtual DOM library for JavaScript. It's extremely fast, lean, and modular. Snabbdom's design makes Snabbdom a natural choice for a Shpadoinkle rendering backend, as it has a similar core philosophy of "just don't do much" and is friendly to purely functional binding.
Shpadoinkle Backend Snabbdom
This package contains a script to setup the 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 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 - the following methodology is how it's currently done:
# clone outside the source directory of Shpadoinkl
git clone [email protected]: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.