From c02e7bc7d6ded4eb90485c860bdc3ea1438300e4 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 30 Jan 2020 12:20:23 -0500 Subject: [PATCH] wip(ssr): should apply app context when rendering app instance --- packages/runtime-core/src/apiCreateApp.ts | 2 ++ .../__tests__/renderToString.spec.ts | 23 ++++++++++++++++++- .../server-renderer/src/renderToString.ts | 15 ++++++++---- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index 234e4f7e..c810fcbc 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 1736d08f..3fc9822b 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 6efa6632..56b7dee9 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(