fix(ssr): properly update currentRenderingInstance state during ssr
fix #2863
This commit is contained in:
@@ -11,7 +11,9 @@ import {
|
||||
withCtx,
|
||||
KeepAlive,
|
||||
Transition,
|
||||
watchEffect
|
||||
watchEffect,
|
||||
createVNode,
|
||||
resolveDynamicComponent
|
||||
} from 'vue'
|
||||
import { escapeHtml } from '@vue/shared'
|
||||
import { renderToString } from '../src/renderToString'
|
||||
@@ -19,6 +21,7 @@ import { renderToStream as _renderToStream } from '../src/renderToStream'
|
||||
import { ssrRenderSlot, SSRSlot } from '../src/helpers/ssrRenderSlot'
|
||||
import { ssrRenderComponent } from '../src/helpers/ssrRenderComponent'
|
||||
import { Readable } from 'stream'
|
||||
import { ssrRenderVNode } from '../src'
|
||||
|
||||
const promisifyStream = (stream: Readable) => {
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
@@ -824,5 +827,34 @@ function testRender(type: string, render: typeof renderToString) {
|
||||
})
|
||||
expect(await render(app)).toBe('<!---->')
|
||||
})
|
||||
|
||||
// #2863
|
||||
test('assets should be resolved correctly', async () => {
|
||||
expect(
|
||||
await render(
|
||||
createApp({
|
||||
components: {
|
||||
A: {
|
||||
ssrRender(_ctx, _push) {
|
||||
_push(`<div>A</div>`)
|
||||
}
|
||||
},
|
||||
B: {
|
||||
render: () => h('div', 'B')
|
||||
}
|
||||
},
|
||||
ssrRender(_ctx, _push, _parent) {
|
||||
const A: any = resolveComponent('A')
|
||||
_push(ssrRenderComponent(A, null, null, _parent))
|
||||
ssrRenderVNode(
|
||||
_push,
|
||||
createVNode(resolveDynamicComponent('B'), null, null),
|
||||
_parent
|
||||
)
|
||||
}
|
||||
})
|
||||
)
|
||||
).toBe(`<div>A</div><div>B</div>`)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@ function renderComponentSubTree(
|
||||
}
|
||||
|
||||
// set current rendering instance for asset resolution
|
||||
setCurrentRenderingInstance(instance)
|
||||
const prev = setCurrentRenderingInstance(instance)
|
||||
ssrRender(
|
||||
instance.proxy,
|
||||
push,
|
||||
@@ -151,7 +151,7 @@ function renderComponentSubTree(
|
||||
instance.data,
|
||||
instance.ctx
|
||||
)
|
||||
setCurrentRenderingInstance(null)
|
||||
setCurrentRenderingInstance(prev)
|
||||
} else if (instance.render && instance.render !== NOOP) {
|
||||
renderVNode(
|
||||
push,
|
||||
|
||||
Reference in New Issue
Block a user