_component: Component
_props: Data | null
_container: HostElement | null
+ _context: AppContext
}
export interface AppConfig {
_component: rootComponent,
_props: rootProps,
_container: null,
+ _context: context,
get config() {
return context.config
-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(
}
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(