Follow the Readme in my sample repository.
Once you've built the app and have started the webserver, go to localhost:8080 and observe the output in the console.
Client side hydration should work.
Client side hydration bails because there is a mismatch between the client-side rendered vnodes and the server-side rendered nodeList.
I found out that something must have gone wrong with indentation in the template compilation process or with the v-if / v-else directives.
Compare this App.vue template (hydration bails):
<a v-else class="disabled">< prev</a>
to this (hydration works):
<a v-else class="disabled">< prev</a><span>bar</span>
Maybe we need to detect the whitespace text node and ignore it when hydrating.
ignore text nodes between v-if conditions (fix #4533)