hydration.spec.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { basePatch as patch } from 'web/runtime/patch'
  2. import * as nodeOps from 'web/runtime/node-ops'
  3. import VNode from 'core/vdom/vnode'
  4. describe('hydration', () => {
  5. let vnode0
  6. beforeEach(() => {
  7. vnode0 = new VNode('p', { attrs: { id: '1' }}, [createTextVNode('hello world')])
  8. patch(null, vnode0)
  9. })
  10. it('should hydrate elements when server-rendered DOM tree is same as virtual DOM tree', () => {
  11. const result = []
  12. function init (vnode) { result.push(vnode) }
  13. function createServerRenderedDOM () {
  14. const root = nodeOps.createElement('div')
  15. root.setAttribute('server-rendered', 'true')
  16. const span = nodeOps.createElement('span')
  17. root.appendChild(span)
  18. const div = nodeOps.createElement('div')
  19. const child1 = nodeOps.createElement('span')
  20. const child2 = nodeOps.createElement('span')
  21. div.appendChild(child1)
  22. div.appendChild(child2)
  23. root.appendChild(div)
  24. return root
  25. }
  26. const node0 = createServerRenderedDOM()
  27. const vnode1 = new VNode('div', {}, [
  28. new VNode('span', {}),
  29. new VNode('div', { hook: { init }}, [
  30. new VNode('span', {}),
  31. new VNode('span', {})
  32. ])
  33. ])
  34. patch(node0, vnode1)
  35. expect(result.length).toBe(1)
  36. })
  37. it('should hydrate components when server-rendered DOM tree is same as virtual DOM tree', () => {
  38. const result = []
  39. function init (vnode) { result.push(vnode) }
  40. function createServerRenderedDOM () {
  41. const root = nodeOps.createElement('vue-component-1')
  42. root.setAttribute('server-rendered', 'true')
  43. const span = nodeOps.createElement('span')
  44. root.appendChild(span)
  45. const div = nodeOps.createElement('div')
  46. const child1 = nodeOps.createElement('span')
  47. const child2 = nodeOps.createElement('span')
  48. div.appendChild(child1)
  49. div.appendChild(child2)
  50. root.appendChild(div)
  51. return root
  52. }
  53. const node0 = createServerRenderedDOM()
  54. const vnode1 = new VNode('vue-component-1', {}, [
  55. new VNode('span', {}),
  56. new VNode('div', { hook: { init }}, [
  57. new VNode('span', {}),
  58. new VNode('span', {})
  59. ])
  60. ])
  61. patch(node0, vnode1)
  62. expect(result.length).toBe(1)
  63. })
  64. it('should warn message that virtual DOM tree is not matching when hydrate element', () => {
  65. function createServerRenderedDOM () {
  66. const root = nodeOps.createElement('div')
  67. root.setAttribute('server-rendered', 'true')
  68. const span = nodeOps.createElement('span')
  69. root.appendChild(span)
  70. const div = nodeOps.createElement('div')
  71. const child1 = nodeOps.createElement('span')
  72. div.appendChild(child1)
  73. root.appendChild(div)
  74. return root
  75. }
  76. const node0 = createServerRenderedDOM()
  77. const vnode1 = new VNode('div', {}, [
  78. new VNode('span', {}),
  79. new VNode('div', {}, [
  80. new VNode('span', {}),
  81. new VNode('span', {})
  82. ])
  83. ])
  84. patch(node0, vnode1)
  85. expect('The client-side rendered virtual DOM tree is not matching').toHaveBeenWarned()
  86. })
  87. })