@@ -3,7 +3,7 @@ const path = require('path')
33const express = require ( 'express' )
44const favicon = require ( 'serve-favicon' )
55const compression = require ( 'compression' )
6- const serialize = require ( 'serialize-javascript ' )
6+ const HTMLStream = require ( 'vue-ssr-html-stream ' )
77const resolve = file => path . resolve ( __dirname , file )
88
99const isProd = process . env . NODE_ENV === 'production'
@@ -13,21 +13,21 @@ const serverInfo =
1313
1414const app = express ( )
1515
16- let indexHTML // generated by html-webpack-plugin
16+ let template // generated by html-webpack-plugin
1717let renderer // created from the webpack-generated server bundle
1818if ( isProd ) {
1919 // in production: create server renderer and index HTML from real fs
20- renderer = createRenderer ( fs . readFileSync ( resolve ( './dist/server- bundle.js ' ) , 'utf-8' ) )
21- indexHTML = parseIndex ( fs . readFileSync ( resolve ( './dist/index.html' ) , 'utf-8' ) )
20+ renderer = createRenderer ( require ( './dist/vue-ssr- bundle.json ' ) , 'utf-8' )
21+ template = fs . readFileSync ( resolve ( './dist/index.html' ) , 'utf-8' )
2222} else {
2323 // in development: setup the dev server with watch and hot-reload,
2424 // and update renderer / index HTML on file change.
2525 require ( './build/setup-dev-server' ) ( app , {
2626 bundleUpdated : bundle => {
2727 renderer = createRenderer ( bundle )
2828 } ,
29- indexUpdated : index => {
30- indexHTML = parseIndex ( index )
29+ templateUpdated : _template => {
30+ template = _template
3131 }
3232 } )
3333}
@@ -42,69 +42,46 @@ function createRenderer (bundle) {
4242 } )
4343}
4444
45- function parseIndex ( template ) {
46- const contentMarker = '<!-- APP -->'
47- const i = template . indexOf ( contentMarker )
48- return {
49- head : template . slice ( 0 , i ) ,
50- tail : template . slice ( i + contentMarker . length )
51- }
52- }
53-
5445const serve = ( path , cache ) => express . static ( resolve ( path ) , {
5546 maxAge : cache && isProd ? 60 * 60 * 24 * 30 : 0
5647} )
5748
5849app . use ( compression ( { threshold : 0 } ) )
5950app . use ( favicon ( './public/logo-48.png' ) )
60- app . use ( '/service-worker.js' , serve ( './dist/service-worker.js' ) )
61- app . use ( '/manifest.json' , serve ( './manifest.json' ) )
6251app . use ( '/dist' , serve ( './dist' ) )
6352app . use ( '/public' , serve ( './public' ) )
53+ app . use ( '/manifest.json' , serve ( './manifest.json' ) )
54+ app . use ( '/service-worker.js' , serve ( './dist/service-worker.js' ) )
6455
6556app . get ( '*' , ( req , res ) => {
6657 if ( ! renderer ) {
6758 return res . end ( 'waiting for compilation... refresh in a moment.' )
6859 }
6960
61+ const s = Date . now ( )
62+
7063 res . setHeader ( "Content-Type" , "text/html" )
7164 res . setHeader ( "Server" , serverInfo )
7265
73- var s = Date . now ( )
74- const context = { url : req . url }
75- const renderStream = renderer . renderToStream ( context )
76-
77- renderStream . once ( 'data' , ( ) => {
78- res . write ( indexHTML . head )
79- } )
80-
81- renderStream . on ( 'data' , chunk => {
82- res . write ( chunk )
83- } )
84-
85- renderStream . on ( 'end' , ( ) => {
86- // embed initial store state
87- if ( context . initialState ) {
88- res . write (
89- `<script>window.__INITIAL_STATE__=${
90- serialize ( context . initialState , { isJSON : true } )
91- } </script>`
92- )
93- }
94- res . end ( indexHTML . tail )
95- console . log ( `whole request: ${ Date . now ( ) - s } ms` )
96- } )
97-
98- renderStream . on ( 'error' , err => {
99- if ( err && err . code === '404' ) {
66+ const errorHandler = err => {
67+ if ( err && err . code === 404 ) {
10068 res . status ( 404 ) . end ( '404 | Page Not Found' )
101- return
69+ } else {
70+ // Render Error Page or Redirect
71+ res . status ( 500 ) . end ( 'Internal Error 500' )
72+ console . error ( `error during render : ${ req . url } ` )
73+ console . error ( err )
10274 }
103- // Render Error Page or Redirect
104- res . status ( 500 ) . end ( 'Internal Error 500' )
105- console . error ( `error during render : ${ req . url } ` )
106- console . error ( err )
107- } )
75+ }
76+
77+ const context = { url : req . url }
78+ const htmlStream = new HTMLStream ( { template, context } )
79+
80+ renderer . renderToStream ( context )
81+ . on ( 'error' , errorHandler )
82+ . pipe ( htmlStream )
83+ . on ( 'end' , ( ) => console . log ( `whole request: ${ Date . now ( ) - s } ms` ) )
84+ . pipe ( res )
10885} )
10986
11087const port = process . env . PORT || 8080
0 commit comments