@@ -3,11 +3,11 @@ const isProd = process.env.NODE_ENV === 'production'
3
3
4
4
const fs = require ( 'fs' )
5
5
const path = require ( 'path' )
6
- const resolve = file => path . resolve ( __dirname , file )
7
6
const express = require ( 'express' )
8
7
const favicon = require ( 'serve-favicon' )
9
- const serialize = require ( 'serialize-javascript' )
10
8
const compression = require ( 'compression' )
9
+ const serialize = require ( 'serialize-javascript' )
10
+ const resolve = file => path . resolve ( __dirname , file )
11
11
12
12
// https://github.com/vuejs/vue/blob/next/packages/vue-server-renderer/README.md#why-use-bundlerenderer
13
13
const createBundleRenderer = require ( 'vue-server-renderer' ) . createBundleRenderer
@@ -16,13 +16,12 @@ const app = express()
16
16
17
17
// parse index.html template
18
18
const 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 )
23
22
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 )
26
25
}
27
26
} ) ( )
28
27
@@ -47,8 +46,8 @@ function createRenderer (bundle) {
47
46
} )
48
47
}
49
48
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 } ) )
52
51
app . use ( favicon ( resolve ( './src/assets/logo.png' ) ) )
53
52
54
53
app . get ( '*' , ( req , res ) => {
@@ -61,7 +60,9 @@ app.get('*', (req, res) => {
61
60
const context = { url : req . url }
62
61
const renderStream = renderer . renderToStream ( context )
63
62
64
- res . write ( html . head )
63
+ renderStream . once ( 'data' , ( ) => {
64
+ res . write ( html . head )
65
+ } )
65
66
66
67
renderStream . on ( 'data' , chunk => {
67
68
res . write ( chunk )
@@ -81,6 +82,10 @@ app.get('*', (req, res) => {
81
82
} )
82
83
83
84
renderStream . on ( 'error' , err => {
85
+ if ( err && err . code === '404' ) {
86
+ res . status ( 404 ) . end ( '404 | Page Not Found' )
87
+ return
88
+ }
84
89
// Render Error Page or Redirect
85
90
res . status ( 500 ) . end ( 'Internal Error 500' )
86
91
console . error ( `error during render : ${ req . url } ` )
0 commit comments