Skip to content

Commit 2aea499

Browse files
feat: add renderToString function (#1971)
It is now possible to use `renderToString` to test the SSR rendering of a component. To do so, use `renderToString(MyComponent)`. `renderToString` returns a `Promise<string>` with the HTML rendered. ```ts it('returns correct html with pre-fetched data on server', async () => { const Component = defineComponent({ template: '<div>{{ text }}</div>', setup() { const text = ref<string | null>(null) onServerPrefetch(async () => { text.value = await fakeFetch('onServerPrefetch') }) return { text } } }) const contents = await renderToString(Component) expect(contents).toBe('<div>onServerPrefetch</div>') }) ``` Co-authored-by: Robert Soriano <[email protected]>
1 parent 5761413 commit 2aea499

File tree

11 files changed

+815
-370
lines changed

11 files changed

+815
-370
lines changed

docs/.vitepress/config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ export default defineConfig({
9393
{
9494
text: 'Stubs and Shallow Mount',
9595
link: '/guide/advanced/stubs-shallow-mount'
96-
}
96+
},
97+
{ text: 'Server-side rendering', link: '/guide/advanced/ssr' }
9798
]
9899
},
99100
{

docs/guide/advanced/ssr.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Testing Server-side Rendering
2+
3+
Vue Test Utils provides `renderToString` to test Vue applications that use server-side rendering (SSR).
4+
This guide will walk you through the process of testing a Vue application that uses SSR.
5+
6+
## `renderToString`
7+
8+
`renderToString` is a function that renders a Vue component to a string.
9+
It is an asynchronous function that returns a Promise,
10+
and accepts the same parameters as `mount` or `shallowMount`.
11+
12+
Let's consider a simple component that uses the `onServerPrefetch` hook:
13+
14+
```ts
15+
function fakeFetch(text: string) {
16+
return Promise.resolve(text)
17+
}
18+
19+
const Component = defineComponent({
20+
template: '<div>{{ text }}</div>',
21+
setup() {
22+
const text = ref<string | null>(null)
23+
24+
onServerPrefetch(async () => {
25+
text.value = await fakeFetch('onServerPrefetch')
26+
})
27+
28+
return { text }
29+
}
30+
})
31+
```
32+
33+
You can write a test for this component using `renderToString`:
34+
35+
```ts
36+
import { renderToString } from '@vue/test-utils'
37+
38+
it('renders the value returned by onServerPrefetch', async () => {
39+
const contents = await renderToString(Component)
40+
expect(contents).toBe('<div>onServerPrefetch</div>')
41+
})
42+
```

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"@vue/compat": "3.2.47",
4141
"@vue/compiler-dom": "3.2.47",
4242
"@vue/compiler-sfc": "3.2.47",
43+
"@vue/server-renderer": "3.2.47",
4344
"c8": "7.12.0",
4445
"eslint": "8.34.0",
4546
"eslint-config-prettier": "8.6.0",
@@ -65,10 +66,12 @@
6566
},
6667
"peerDependencies": {
6768
"@vue/compiler-dom": "^3.0.1",
69+
"@vue/server-renderer": "^3.0.1",
6870
"vue": "^3.0.1"
6971
},
7072
"optionalDependencies": {
71-
"@vue/compiler-dom": "^3.0.1"
73+
"@vue/compiler-dom": "^3.0.1",
74+
"@vue/server-renderer": "^3.0.1"
7275
},
7376
"author": {
7477
"name": "Lachlan Miller",

pnpm-lock.yaml

Lines changed: 2 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rollup.config.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ function createEntry(options) {
2525
'vue',
2626
isEsmBrowser
2727
? '@vue/compiler-dom/dist/compiler-dom.esm-browser'
28-
: '@vue/compiler-dom'
28+
: '@vue/compiler-dom',
29+
isEsmBrowser
30+
? '@vue/server-renderer/dist/compiler-dom.esm-browser'
31+
: '@vue/server-renderer'
2932
],
3033
plugins: [
3134
replace({
@@ -47,7 +50,8 @@ function createEntry(options) {
4750
format,
4851
globals: {
4952
vue: 'Vue',
50-
'@vue/compiler-dom': 'VueCompilerDOM'
53+
'@vue/compiler-dom': 'VueCompilerDOM',
54+
'@vue/server-renderer': 'VueServerRenderer'
5155
}
5256
}
5357
}

0 commit comments

Comments
 (0)