From: Evan You Date: Fri, 6 Sep 2024 03:19:42 +0000 (+0800) Subject: fix(ssr): respect app.config.warnHandler during ssr X-Git-Tag: v3.5.3~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf3d9a2af41659a743706306fc798b3d215df5af;p=thirdparty%2Fvuejs%2Fcore.git fix(ssr): respect app.config.warnHandler during ssr close #11830 --- diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index 7f716b5f4e..3871167b3e 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 1b1d6256e8..d0a5223b2f 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 9717952645..f04080b9c3 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() }