]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip(ssr): should apply app context when rendering app instance
authorEvan You <yyx990803@gmail.com>
Thu, 30 Jan 2020 17:20:23 +0000 (12:20 -0500)
committerEvan You <yyx990803@gmail.com>
Thu, 30 Jan 2020 17:20:23 +0000 (12:20 -0500)
packages/runtime-core/src/apiCreateApp.ts
packages/server-renderer/__tests__/renderToString.spec.ts
packages/server-renderer/src/renderToString.ts

index 234e4f7e84c63d28ac62069a4b88eb448a815047..c810fcbc1cc651abd25a099142598c5fb3bce652 100644 (file)
@@ -24,6 +24,7 @@ export interface App<HostElement = any> {
   _component: Component
   _props: Data | null
   _container: HostElement | null
+  _context: AppContext
 }
 
 export interface AppConfig {
@@ -103,6 +104,7 @@ export function createAppAPI<HostNode, HostElement>(
       _component: rootComponent,
       _props: rootProps,
       _container: null,
+      _context: context,
 
       get config() {
         return context.config
index 1736d08f7669b32f1663827e6759e3020f261356..3fc9822b4ebf6c5f4df570da40cd993922471eb9 100644 (file)
@@ -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(`<div>foo</div>`)
+  })
+
   describe('components', () => {
     test('vnode components', async () => {
       expect(
index 6efa66324a0b19be1374da2dee02a5fc16b4a6f2..56b7dee982c2d526dd2b90a0d37d4838f2aa9be4 100644 (file)
@@ -83,10 +83,17 @@ function unrollBuffer(buffer: ResolvedSSRBuffer): string {
 }
 
 export async function renderToString(input: App | VNode): Promise<string> {
-  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(