ssr-test.ts 2.5 KB

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