fix(ssr): respect app.config.warnHandler during ssr

close #11830
This commit is contained in:
Evan You 2024-09-06 11:19:42 +08:00
parent 8e6c337867
commit bf3d9a2af4
No known key found for this signature in database
GPG Key ID: 00E9AB7A6704CE0A
3 changed files with 28 additions and 1 deletions

View File

@ -400,6 +400,7 @@ import { renderComponentRoot } from './componentRenderUtils'
import { setCurrentRenderingInstance } from './componentRenderContext'
import { isVNode, normalizeVNode } from './vnode'
import { ensureValidVNode } from './helpers/renderSlot'
import { popWarningContext, pushWarningContext } from './warning'
const _ssrUtils: {
createComponentInstance: typeof createComponentInstance
@ -410,6 +411,8 @@ const _ssrUtils: {
normalizeVNode: typeof normalizeVNode
getComponentPublicInstance: typeof getComponentPublicInstance
ensureValidVNode: typeof ensureValidVNode
pushWarningContext: typeof pushWarningContext
popWarningContext: typeof popWarningContext
} = {
createComponentInstance,
setupComponent,
@ -419,6 +422,8 @@ const _ssrUtils: {
normalizeVNode,
getComponentPublicInstance,
ensureValidVNode,
pushWarningContext,
popWarningContext,
}
/**

View File

@ -81,6 +81,18 @@ function testRender(type: string, render: typeof renderToString) {
expect(html).toBe(`<div>foo</div>`)
})
test('warnings should be suppressed by app.config.warnHandler', async () => {
const app = createApp({
render() {
return h('div', this.foo)
},
})
app.config.warnHandler = vi.fn()
await render(app)
expect('not defined on instance').not.toHaveBeenWarned()
expect(app.config.warnHandler).toHaveBeenCalledTimes(1)
})
describe('components', () => {
test('vnode components', async () => {
expect(

View File

@ -35,6 +35,8 @@ const {
setupComponent,
renderComponentRoot,
normalizeVNode,
pushWarningContext,
popWarningContext,
} = ssrUtils
export type SSRBuffer = SSRBufferItem[] & { hasAsync?: boolean }
@ -91,8 +93,14 @@ export function renderComponentVNode(
parentComponent: ComponentInternalInstance | null = null,
slotScopeId?: string,
): SSRBuffer | Promise<SSRBuffer> {
const instance = createComponentInstance(vnode, parentComponent, null)
const instance = (vnode.component = createComponentInstance(
vnode,
parentComponent,
null,
))
if (__DEV__) pushWarningContext(vnode)
const res = setupComponent(instance, true /* isSSR */)
if (__DEV__) popWarningContext()
const hasAsyncSetup = isPromise(res)
let prefetches = instance.sp /* LifecycleHooks.SERVER_PREFETCH */
if (hasAsyncSetup || prefetches) {
@ -118,6 +126,7 @@ function renderComponentSubTree(
instance: ComponentInternalInstance,
slotScopeId?: string,
): SSRBuffer | Promise<SSRBuffer> {
if (__DEV__) pushWarningContext(instance.vnode)
const comp = instance.type as Component
const { getBuffer, push } = createBuffer()
if (isFunction(comp)) {
@ -207,6 +216,7 @@ function renderComponentSubTree(
push(`<!---->`)
}
}
if (__DEV__) popWarningContext()
return getBuffer()
}