ssr-test.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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.renderToString(app, context)
  42. .then(html => {
  43. const res: string = html;
  44. })
  45. .catch(err => {
  46. throw err;
  47. });
  48. renderer.renderToStream(app, context).on('data', chunk => {
  49. const html = chunk.toString();
  50. });
  51. // Bundle renderer test
  52. declare const cacheClient: { [key: string]: string };
  53. const bundleRenderer = createBundleRenderer('/path/to/vue-ssr-server-bundle.json', {
  54. inject: false,
  55. runInNewContext: 'once',
  56. basedir: '/path/to/base',
  57. shouldPreload: (file, type) => {
  58. if (type === 'script' || type === 'style') {
  59. return true;
  60. }
  61. if (type === 'font') {
  62. return /\.woff2$/.test(file);
  63. }
  64. if (type === 'image') {
  65. return file === 'hero.jpg';
  66. }
  67. return false;
  68. },
  69. cache: {
  70. get: key => {
  71. return cacheClient[key];
  72. },
  73. set: (key, val) => {
  74. cacheClient[key] = val;
  75. },
  76. has: key => {
  77. return !!cacheClient[key];
  78. }
  79. },
  80. directives: {
  81. example (vnode: VNode, directiveMeta: VNodeDirective) {
  82. // transform vnode based on directive binding metadata
  83. }
  84. }
  85. });
  86. bundleRenderer.renderToString(context, (err, html) => {
  87. if (err) throw err;
  88. const res: string = html;
  89. });
  90. bundleRenderer.renderToString().then(html => {
  91. const res: string = html;
  92. });
  93. bundleRenderer.renderToString(context).then(html => {
  94. const res: string = html;
  95. });
  96. bundleRenderer.renderToStream(context).on('data', chunk => {
  97. const html = chunk.toString();
  98. });
  99. // webpack plugins
  100. webpack({
  101. plugins: [
  102. new VueSSRClientPlugin({
  103. filename: 'client-manifest.json'
  104. }),
  105. new VueSSRServerPlugin({
  106. filename: 'server-bundle.json'
  107. })
  108. ]
  109. });