ssr-stream.spec.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import Vue from '../../dist/vue.common.js'
  2. import { compileToFunctions } from '../../dist/compiler.js'
  3. import createRenderer from '../../dist/server-renderer.js'
  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. preserveWhitespace: false
  82. })
  83. Object.assign(options, res)
  84. delete options.template
  85. return renderToStream(new Vue(options))
  86. }