ssr-stream.spec.js 2.3 KB

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