Skip to content

Commit e6de9a5

Browse files
ktsnyyx990803
authored andcommitted
Add types for vue-server-renderer (fix #5772) (#5775)
* add types for vue-server-renderer * add a new line to the end of files * make RenderCallback's err to be nullable * fix the server side directive types * make stricter the types of the server bundle and the client manifest
1 parent d333a49 commit e6de9a5

File tree

4 files changed

+150
-0
lines changed

4 files changed

+150
-0
lines changed

packages/vue-server-renderer/package.json

+9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"version": "2.3.3",
44
"description": "server renderer for Vue 2.0",
55
"main": "index.js",
6+
"types": "types/index.d.ts",
67
"repository": {
78
"type": "git",
89
"url": "git+https://github.com/vuejs/vue.git"
@@ -17,6 +18,9 @@
1718
"bugs": {
1819
"url": "https://github.com/vuejs/vue/issues"
1920
},
21+
"scripts": {
22+
"test:types": "tsc -p types"
23+
},
2024
"dependencies": {
2125
"chalk": "^1.1.3",
2226
"hash-sum": "^1.0.2",
@@ -27,5 +31,10 @@
2731
"source-map": "0.5.6",
2832
"serialize-javascript": "^1.3.0"
2933
},
34+
"devDependencies": {
35+
"@types/node": "^7.0.22",
36+
"typescript": "^2.3.3",
37+
"vue": "file:../.."
38+
},
3039
"homepage": "https://github.com/vuejs/vue/tree/dev/packages/vue-server-renderer#readme"
3140
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import Vue = require('vue');
2+
import { Readable } from 'stream';
3+
4+
export declare function createRenderer(options?: RendererOptions): Renderer;
5+
6+
export declare function createBundleRenderer(bundle: string | object, options?: BundleRendererOptions): BundleRenderer;
7+
8+
type RenderCallback = (err: Error | null, html: string) => void;
9+
10+
interface Renderer {
11+
renderToString(vm: Vue, callback: RenderCallback): void;
12+
renderToString(vm: Vue, context: object, callback: RenderCallback): void;
13+
14+
renderToStream(vm: Vue, context?: object): Readable;
15+
}
16+
17+
interface BundleRenderer {
18+
renderToString(callback: RenderCallback): void;
19+
renderToString(context: object, callback: RenderCallback): void;
20+
21+
renderToStream(context?: object): Readable;
22+
}
23+
24+
interface RendererOptions {
25+
template?: string;
26+
inject?: boolean;
27+
shouldPreload?: (file: string, type: string) => boolean;
28+
cache?: RenderCache;
29+
directives?: {
30+
[key: string]: (vnode: Vue.VNode, dir: Vue.VNodeDirective) => void
31+
};
32+
}
33+
34+
interface BundleRendererOptions extends RendererOptions {
35+
clientManifest?: object;
36+
runInNewContext?: boolean | 'once';
37+
basedir?: string;
38+
}
39+
40+
interface RenderCache {
41+
get: (key: string, cb?: (res: string) => void) => string | void;
42+
set: (key: string, val: string) => void;
43+
has?: (key: string, cb?: (hit: boolean) => void) => boolean | void;
44+
}
+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import Vue = require('vue');
2+
import { readFileSync } from 'fs';
3+
import { createRenderer, createBundleRenderer } from '../';
4+
5+
function createApp (context: any) {
6+
return new Vue({
7+
data: {
8+
url: context.url
9+
},
10+
template: `<div>The visited URL is: {{ url }}</div>`
11+
});
12+
}
13+
14+
// Renderer test
15+
const app = createApp({ url: 'http://localhost:8000/' });
16+
17+
const renderer = createRenderer({
18+
template: readFileSync('./index.template.html', 'utf-8')
19+
});
20+
21+
const context = {
22+
title: 'Hello',
23+
meta: `
24+
<meta name="description" content="Vue.js SSR Example">
25+
`
26+
};
27+
28+
renderer.renderToString(app, context, (err, html) => {
29+
if (err) throw err;
30+
const res: string = html;
31+
});
32+
33+
renderer.renderToStream(app, context).on('data', chunk => {
34+
const html = chunk.toString();
35+
});
36+
37+
// Bundle renderer test
38+
declare const cacheClient: { [key: string]: string };
39+
40+
const bundleRenderer = createBundleRenderer('/path/to/vue-ssr-server-bundle.json', {
41+
inject: false,
42+
runInNewContext: 'once',
43+
basedir: '/path/to/base',
44+
45+
shouldPreload: (file, type) => {
46+
if (type === 'script' || type === 'style') {
47+
return true;
48+
}
49+
if (type === 'font') {
50+
return /\.woff2$/.test(file);
51+
}
52+
if (type === 'image') {
53+
return file === 'hero.jpg';
54+
}
55+
return false;
56+
},
57+
58+
cache: {
59+
get: key => {
60+
return cacheClient[key];
61+
},
62+
set: (key, val) => {
63+
cacheClient[key] = val;
64+
},
65+
has: key => {
66+
return !!cacheClient[key];
67+
}
68+
},
69+
70+
directives: {
71+
example (vnode: Vue.VNode, directiveMeta: Vue.VNodeDirective) {
72+
// transform vnode based on directive binding metadata
73+
}
74+
}
75+
});
76+
77+
bundleRenderer.renderToString(context, (err, html) => {
78+
if (err) throw err;
79+
const res: string = html;
80+
});
81+
82+
bundleRenderer.renderToStream(context).on('data', chunk => {
83+
const html = chunk.toString();
84+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"compilerOptions": {
3+
"target": "es5",
4+
"module": "commonjs",
5+
"moduleResolution": "node",
6+
"strict": true,
7+
"noEmit": true
8+
},
9+
"compileOnSave": false,
10+
"include": [
11+
"**/*.ts"
12+
]
13+
}

0 commit comments

Comments
 (0)