Hi Joe,
a quick heads up first: I will soon start working on a learning section for neo, since some of the blog posts are a bit outdated by now and it is too hard to find infos.
For the neo scope, your apps (including your components) live within the application webworker. This can be either a shared or dedicated worker depending on your settings. Within the worker scope, there is no direct access to window or window.document => the DOM. This makes using vdom mandatory when we want to fully embrace the multithreading performance boost.
Obviously there are a couple of helper functions like getBoundingClientRect(), but they become async (returning the value as a postMessage to the app worker. For using main thread based APIs (e.g. charts, webcomponents), we can use optional main thread addons.
The benefit of vdom which i like best is that we can flag sub-trees with removeDom: true, in which case we keep our structure in place, but can remove or drop the the real DOM counterparts back in. E.g. a card layout where all inactive cards should get removed or a table where you dynamically want to hide and show columns at run-time.
Another benefit is the DOM updating logic: you can manipulate the vdom a lot (several add, edit, move and remove OPs) and then just ask the engine to give you an optimised version of the deltas (DOM OPs) which is needed to get from the previous to the latest state. This part is optional as well: you could manually craft your deltas, for OPs where you exactly know what to do (e.g. happening inside the helix demo).
I will add more infos into the learning section once I get there. Pretty busy at the moment with a relocation.
Best regards,
Tobias