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: `
The visited URL is: {{ url }}
`
});
}
// Renderer test
const app = createApp({ url: 'http://localhost:8000/' });
const renderer = createRenderer({
template: readFileSync('./index.template.html', 'utf-8')
});
const context = {
title: 'Hello',
meta: `
`
};
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'
})
]
});