From: Evan You Date: Thu, 30 Jan 2020 17:20:23 +0000 (-0500) Subject: wip(ssr): should apply app context when rendering app instance X-Git-Tag: v3.0.0-alpha.5~149 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c02e7bc7d6ded4eb90485c860bdc3ea1438300e4;p=thirdparty%2Fvuejs%2Fcore.git wip(ssr): should apply app context when rendering app instance --- diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index 234e4f7e84..c810fcbc1c 100644 --- a/packages/runtime-core/src/apiCreateApp.ts +++ b/packages/runtime-core/src/apiCreateApp.ts @@ -24,6 +24,7 @@ export interface App { _component: Component _props: Data | null _container: HostElement | null + _context: AppContext } export interface AppConfig { @@ -103,6 +104,7 @@ export function createAppAPI( _component: rootComponent, _props: rootProps, _container: null, + _context: context, get config() { return context.config diff --git a/packages/server-renderer/__tests__/renderToString.spec.ts b/packages/server-renderer/__tests__/renderToString.spec.ts index 1736d08f76..3fc9822b4e 100644 --- a/packages/server-renderer/__tests__/renderToString.spec.ts +++ b/packages/server-renderer/__tests__/renderToString.spec.ts @@ -1,7 +1,28 @@ -import { createApp, h, createCommentVNode, withScopeId } from 'vue' +import { + createApp, + h, + createCommentVNode, + withScopeId, + resolveComponent, + ComponentOptions +} from 'vue' import { renderToString, renderComponent, renderSlot, escapeHtml } from '../src' describe('ssr: renderToString', () => { + test('should apply app context', async () => { + const app = createApp({ + render() { + const Foo = resolveComponent('foo') as ComponentOptions + return h(Foo) + } + }) + app.component('foo', { + render: () => h('div', 'foo') + }) + const html = await renderToString(app) + expect(html).toBe(`
foo
`) + }) + describe('components', () => { test('vnode components', async () => { expect( diff --git a/packages/server-renderer/src/renderToString.ts b/packages/server-renderer/src/renderToString.ts index 6efa66324a..56b7dee982 100644 --- a/packages/server-renderer/src/renderToString.ts +++ b/packages/server-renderer/src/renderToString.ts @@ -83,10 +83,17 @@ function unrollBuffer(buffer: ResolvedSSRBuffer): string { } export async function renderToString(input: App | VNode): Promise { - const resolvedBuffer = await (isVNode(input) - ? renderComponent({ render: () => input }) - : renderComponent(input._component, input._props)) - return unrollBuffer(resolvedBuffer) + let buffer: ResolvedSSRBuffer + if (isVNode(input)) { + // raw vnode, wrap with component + buffer = await renderComponent({ render: () => input }) + } else { + // rendering an app + const vnode = createVNode(input._component, input._props) + vnode.appContext = input._context + buffer = await renderComponentVNode(vnode) + } + return unrollBuffer(buffer) } export function renderComponent(