forked from vuejs/vue
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathssr-test.ts
128 lines (109 loc) · 2.77 KB
/
ssr-test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import Vue, { VNode, VNodeDirective } from '../index';
import VueSSRClientPlugin = require('../../packages/vue-server-renderer/client-plugin');
import VueSSRServerPlugin = require('../../packages/vue-server-renderer/server-plugin');
import webpack = require('webpack');
import { readFileSync } from 'fs';
import { createRenderer, createBundleRenderer } from '../../packages/vue-server-renderer';
function createApp (context: any) {
return new Vue({
data: {
url: context.url
},
template: `<div>The visited URL is: {{ url }}</div>`
});
}
// Renderer test
const app = createApp({ url: 'http://localhost:8000/' });
const renderer = createRenderer({
template: readFileSync('./index.template.html', 'utf-8')
});
const context = {
title: 'Hello',
meta: `
<meta name="description" content="Vue.js SSR Example">
`
};
renderer.renderToString(app, (err, html) => {
if (err) throw err;
const res: string = html;
});
renderer.renderToString(app, context, (err, html) => {
if (err) throw err;
const res: string = html;
});
renderer.renderToString(app)
.then(html => {
const res: string = html;
})
.catch(err => {
throw err;
});
renderer.renderToString(app, context)
.then(html => {
const res: string = html;
})
.catch(err => {
throw err;
});
renderer.renderToStream(app, context).on('data', chunk => {
const html = chunk.toString();
});
// Bundle renderer test
declare const cacheClient: { [key: string]: string };
const bundleRenderer = createBundleRenderer('/path/to/vue-ssr-server-bundle.json', {
inject: false,
runInNewContext: 'once',
basedir: '/path/to/base',
shouldPreload: (file, type) => {
if (type === 'script' || type === 'style') {
return true;
}
if (type === 'font') {
return /\.woff2$/.test(file);
}
if (type === 'image') {
return file === 'hero.jpg';
}
return false;
},
cache: {
get: key => {
return cacheClient[key];
},
set: (key, val) => {
cacheClient[key] = val;
},
has: key => {
return !!cacheClient[key];
}
},
directives: {
example (vnode: VNode, directiveMeta: VNodeDirective) {
// transform vnode based on directive binding metadata
}
}
});
bundleRenderer.renderToString(context, (err, html) => {
if (err) throw err;
const res: string = html;
});
bundleRenderer.renderToString().then(html => {
const res: string = html;
});
bundleRenderer.renderToString(context).then(html => {
const res: string = html;
});
bundleRenderer.renderToStream(context).on('data', chunk => {
const html = chunk.toString();
});
// webpack plugins
webpack({
plugins: [
new VueSSRClientPlugin({
filename: 'client-manifest.json'
}),
new VueSSRServerPlugin({
filename: 'server-bundle.json'
})
]
});