Skip to content

Commit

Permalink
fix(ssr): resolve teleports for stream render APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed May 17, 2022
1 parent 57d3a05 commit 77fef97
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
34 changes: 34 additions & 0 deletions packages/server-renderer/__tests__/ssrTeleport.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import { createApp, h, Teleport } from 'vue'
import { renderToString } from '../src/renderToString'
import { renderToSimpleStream } from '../src/renderToStream'
import { SSRContext } from '../src/render'
import { ssrRenderTeleport } from '../src/helpers/ssrRenderTeleport'

Expand Down Expand Up @@ -134,4 +135,37 @@ describe('ssrRenderTeleport', () => {
expect(html).toBe('<!--teleport start--><!--teleport end-->')
expect(ctx.teleports!['#target']).toBe(`<div>content</div><!---->`)
})

test('teleport inside async component (stream)', async () => {
const ctx: SSRContext = {}
const asyncComponent = {
template: '<teleport to="#target"><div>content</div></teleport>',
async setup() {}
}
let html = ''
let resolve: any
const p = new Promise(r => (resolve = r))
renderToSimpleStream(
h({
template: '<async-component />',
components: { asyncComponent }
}),
ctx,
{
push(chunk) {
if (chunk === null) {
resolve()
} else {
html += chunk
}
},
destroy(err) {
throw err
}
}
)
await p
expect(html).toBe('<!--teleport start--><!--teleport end-->')
expect(ctx.teleports!['#target']).toBe(`<div>content</div><!---->`)
})
})
2 changes: 2 additions & 0 deletions packages/server-renderer/src/renderToStream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
import { isString, isPromise } from '@vue/shared'
import { renderComponentVNode, SSRBuffer, SSRContext } from './render'
import { Readable, Writable } from 'stream'
import { resolveTeleports } from './renderToString'

const { isVNode } = ssrUtils

Expand Down Expand Up @@ -74,6 +75,7 @@ export function renderToSimpleStream<T extends SimpleReadable>(

Promise.resolve(renderComponentVNode(vnode))
.then(buffer => unrollBuffer(buffer, stream))
.then(() => resolveTeleports(context))
.then(() => stream.push(null))
.catch(error => {
stream.destroy(error)
Expand Down
2 changes: 1 addition & 1 deletion packages/server-renderer/src/renderToString.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export async function renderToString(
return result
}

async function resolveTeleports(context: SSRContext) {
export async function resolveTeleports(context: SSRContext) {
if (context.__teleportBuffers) {
context.teleports = context.teleports || {}
for (const key in context.__teleportBuffers) {
Expand Down

0 comments on commit 77fef97

Please sign in to comment.