@@ -3,11 +3,11 @@ const isProd = process.env.NODE_ENV === 'production'
33
44const fs = require ( 'fs' )
55const path = require ( 'path' )
6- const resolve = file => path . resolve ( __dirname , file )
76const express = require ( 'express' )
87const favicon = require ( 'serve-favicon' )
9- const serialize = require ( 'serialize-javascript' )
108const compression = require ( 'compression' )
9+ const serialize = require ( 'serialize-javascript' )
10+ const resolve = file => path . resolve ( __dirname , file )
1111
1212// https://github.com/vuejs/vue/blob/next/packages/vue-server-renderer/README.md#why-use-bundlerenderer
1313const createBundleRenderer = require ( 'vue-server-renderer' ) . createBundleRenderer
@@ -16,13 +16,12 @@ const app = express()
1616
1717// parse index.html template
1818const html = ( ( ) => {
19- const template = fs . readFileSync ( resolve ( './index.html' ) , 'utf-8' )
20- const i = template . indexOf ( '{{ APP }}' )
21- // styles are injected dynamically via vue-style-loader in development
22- const style = isProd ? '<link rel="stylesheet" href="/dist/styles.css">' : ''
19+ const contentMarker = '<!-- APP -->'
20+ const template = fs . readFileSync ( resolve ( './dist/index.html' ) , 'utf-8' )
21+ const i = template . indexOf ( contentMarker )
2322 return {
24- head : template . slice ( 0 , i ) . replace ( '{{ STYLE }}' , style ) ,
25- tail : template . slice ( i + '{{ APP }}' . length )
23+ head : template . slice ( 0 , i ) ,
24+ tail : template . slice ( i + contentMarker . length )
2625 }
2726} ) ( )
2827
@@ -47,8 +46,8 @@ function createRenderer (bundle) {
4746 } )
4847}
4948
50- app . use ( compression ( { threshold : 0 } ) )
51- app . use ( '/dist' , express . static ( resolve ( './dist' ) ) )
49+ app . use ( compression ( { threshold : 0 } ) )
50+ app . use ( '/dist' , express . static ( resolve ( './dist' ) , { maxAge : 60 * 60 * 24 * 30 } ) )
5251app . use ( favicon ( resolve ( './src/assets/logo.png' ) ) )
5352
5453app . get ( '*' , ( req , res ) => {
@@ -61,7 +60,9 @@ app.get('*', (req, res) => {
6160 const context = { url : req . url }
6261 const renderStream = renderer . renderToStream ( context )
6362
64- res . write ( html . head )
63+ renderStream . once ( 'data' , ( ) => {
64+ res . write ( html . head )
65+ } )
6566
6667 renderStream . on ( 'data' , chunk => {
6768 res . write ( chunk )
@@ -81,6 +82,10 @@ app.get('*', (req, res) => {
8182 } )
8283
8384 renderStream . on ( 'error' , err => {
85+ if ( err && err . code === '404' ) {
86+ res . status ( 404 ) . end ( '404 | Page Not Found' )
87+ return
88+ }
8489 // Render Error Page or Redirect
8590 res . status ( 500 ) . end ( 'Internal Error 500' )
8691 console . error ( `error during render : ${ req . url } ` )
0 commit comments