diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts
index 7f716b5f4e8..3871167b3ee 100644
--- a/packages/runtime-core/src/index.ts
+++ b/packages/runtime-core/src/index.ts
@@ -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,
}
/**
diff --git a/packages/server-renderer/__tests__/render.spec.ts b/packages/server-renderer/__tests__/render.spec.ts
index 1b1d6256e8c..d0a5223b2ff 100644
--- a/packages/server-renderer/__tests__/render.spec.ts
+++ b/packages/server-renderer/__tests__/render.spec.ts
@@ -81,6 +81,18 @@ function testRender(type: string, render: typeof renderToString) {
expect(html).toBe(`
foo
`)
})
+ 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(
diff --git a/packages/server-renderer/src/render.ts b/packages/server-renderer/src/render.ts
index 97179526456..f04080b9c31 100644
--- a/packages/server-renderer/src/render.ts
+++ b/packages/server-renderer/src/render.ts
@@ -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 {
- 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 {
+ 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()
}