ssr-stream.spec.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import Vue from '../../dist/vue.common.js'
  2. import { createRenderer } from '../../packages/vue-server-renderer'
  3. const { renderToStream } = createRenderer()
  4. describe('SSR: renderToStream', () => {
  5. it('should render to a stream', done => {
  6. const stream = renderToStream(new Vue({
  7. template: `
  8. <div>
  9. <p class="hi">yoyo</p>
  10. <div id="ho" :class="[testClass, { red: isRed }]"></div>
  11. <span>{{ test }}</span>
  12. <input :value="test">
  13. <b-comp></b-comp>
  14. <c-comp></c-comp>
  15. </div>
  16. `,
  17. data: {
  18. test: 'hi',
  19. isRed: true,
  20. testClass: 'a'
  21. },
  22. components: {
  23. bComp (resolve) {
  24. return resolve({
  25. render () {
  26. return this.$createElement('test-async-2')
  27. },
  28. components: {
  29. testAsync2 (resolve) {
  30. return resolve({
  31. created () { this.$parent.$parent.testClass = 'b' },
  32. render () {
  33. return this.$createElement('div', { class: [this.$parent.$parent.testClass] }, 'test')
  34. }
  35. })
  36. }
  37. }
  38. })
  39. },
  40. cComp: {
  41. render () {
  42. return this.$createElement('div', { class: [this.$parent.testClass] }, 'test')
  43. }
  44. }
  45. }
  46. }))
  47. let res = ''
  48. stream.on('data', chunk => {
  49. res += chunk
  50. })
  51. stream.on('end', () => {
  52. expect(res).toContain(
  53. '<div server-rendered="true">' +
  54. '<p class="hi">yoyo</p> ' +
  55. '<div id="ho" class="a red"></div> ' +
  56. '<span>hi</span> ' +
  57. '<input value="hi"> ' +
  58. '<div class="b">test</div> ' +
  59. '<div class="b">test</div>' +
  60. '</div>'
  61. )
  62. done()
  63. })
  64. })
  65. it('should catch error', done => {
  66. const stream = renderToStream(new Vue({
  67. render () {
  68. throw new Error('oops')
  69. }
  70. }))
  71. stream.on('error', err => {
  72. expect(err.toString()).toMatch(/oops/)
  73. done()
  74. })
  75. stream.on('data', _ => _)
  76. })
  77. })