I actually did a POC of this:
and it works really well. There’s no diffing, it just queues DOM updates (from Blaze) virtually and dequeues to the real DOM in a requestAnimationFrame loop with a time limit. It’s written for famous-views to make sure that Blaze can’t block an animation frame.
I haven’t mentioned it before since I haven’t had any more time to work on it and it obviously doesn’t cover all cases… some thought would be necessary to (as you say) decide if we should allow the user to manipulate the real DOM and/or provide a more complete virtual DOM, and to decide what level of optimization we’d like, if any.
The repo is just a simple Meteor app with a replacement blaze in the packages folder (which pretty much has just one addition, a new file called virtual-dom.js, and the templating package, with just a 1 line change to use the virtual-dom too).