A minimal WebAssembly virtual DOM to build C++ SPA (Single page applications)
- Motivation
- Inline Example
- Getting started
- Ecosystem
- Examples
- Roadmap
- Change Log
- Authors
- Copyright and License
asm-dom is a minimal WebAssembly virtual DOM to build C++ SPA (Single page applications). You can write an entire SPA in C++ and compile it to WebAssembly (or asmjs as fallback) using Emscripten, asm-dom will call DOM APIs for you. This will produce an app that aims to execute at native speed by taking advantage of common hardware capabilities
, also, you can use your C/C++ code without any change, you haven't to create a binding layer to use it (as we have to do if we want to use a C++ lib from JS). Basically we are creating an app in C++ that call javascript if needed instead of the opposite. You can write only once in C++ and share as much code as possible with desktop/mobile apps and web site. If you want to learn more about performance, please see this.
How can I structure my application with asm-dom?
asm-dom is a low-level virtual DOM library. It is unopinionated with regards to how you should structure your application.
How did you come up with the concept of asm-dom?
At the beginning asm-dom is born from the idea to test the powerful of WebAssembly in a common use case that is not gaming, VR, AR or Image / video editing. Unfortunately, at the moment, GC/DOM Integration is a future feature 🦄, so, asm-dom isn't totally developed in wasm. All interactions with the DOM are written in Javascript. This is a big disadvantage because of the overhead of the binding between JS and WASM, in the future asm-dom will be even more powerful, anyway results are satisfying.
#include "asm-dom.hpp"
using namespace asmdom;
int main() {
Config config = Config();
init(config);
// asm-dom can be used with a JSX like syntax thanks to gccx
VNode* vnode = (
<div
onclick={[](emscripten::val e) -> bool {
emscripten::val::global("console").call<void>("log", emscripten::val("clicked"));
return true;
}}
>
<span style="font-weight: bold">This is bold</span>
and this is just normal text
<a href="/foo">I'll take you places!</a>
</div>
);
// Patch into empty DOM element – this modifies the DOM as a side effect
patch(
emscripten::val::global("document").call<emscripten::val>(
"getElementById",
std::string("root")
),
vnode
);
// without gccx
VNode* newVnode = h("div",
Data(
Callbacks {
{"onclick", [](emscripten::val e) -> bool {
emscripten::val::global("console").call<void>("log", emscripten::val("another click"));
return true;
}}
}
),
Children {
h("span",
Data(
Attrs {
{"style", "font-weight: normal; font-style: italic"}
}
),
std::string("This is now italic type")
),
h(" and this is just normal text", true),
h("a",
Data(
Attrs {
{"href", "/bar"}
}
),
std::string("I'll take you places!")
)
}
);
// Second `patch` invocation
patch(vnode, newVnode); // asm-dom efficiently updates the old view to the new state
return 0;
};
asm-dom aims to be used from C++, however it can be used also from javascript, here you can find the doc of both:
Here you can find a list of related projects:
- gccx - CPX (JSX like syntax) support.
- asm-dom-boilerplate - A simple boilerplate to start using asm-dom without configuration.
Examples are available in the examples folder.
Also, here is the list of third-party examples:
- asm-dom-OO-counters
- asm-dom-cmake - Build using cmake only.
and online Demos:
- Thunks support
- asm-dom aims to be even more powerful with GC/DOM Integration. Unfortunately this is a future feature 🦄, so, we have to be patient and wait a bit.
This project adheres to Semantic Versioning.
Every release, along with the migration instructions, is documented on the Github Releases page.
Matteo Basso
Copyright for portions of project asm-dom are held by:
- Simon Friis Vindum, 2015 as part of project snabbdom
- project snabbdom-to-html
All other copyright for project asm-dom are held by Matteo Basso.
Copyright (c) 2016, Matteo Basso.
asm-dom source code is licensed under the MIT License.