@@ -19,45 +19,53 @@ module.exports = function(proxy, allowedHost) {
19
19
throw new Error ( "Webpack compiler with name 'ssr' not found." ) ;
20
20
}
21
21
22
- // stores current request handler, changes after every compilation
23
- let ssrHandler ;
22
+ // stores current request handler, changes after every compilation, initially handles pending handler change
23
+ let ssrHandler = ( request , response , next ) => {
24
+ installHandler = handler => {
25
+ installHandler = handler => ssrHandler = handler ;
26
+ ssrHandler = handler ;
27
+ ssrHandler ( request , response , next ) ;
28
+ } ;
29
+ } ;
30
+ let installHandler = handler => ssrHandler = handler ;
24
31
25
32
// fetch ssr handler after every compilation
26
- multiCompiler . hooks . done . tap ( 'webpackDevServer.ssr' , ( ) => {
33
+ multiCompiler . hooks . done . tap ( 'webpackDevServer.ssr' , multiCompilerStats => {
27
34
// make errors inside hook visible
28
35
try {
29
- // fetch ssr entry point file name
30
- const filename = path . resolve ( paths . appBuild , ".." , "dist" , "ssr.js" ) ;
31
- // read code from in memory fs
32
- const code = compiler . outputFileSystem . readFileSync ( filename ) . toString ( ) ;
33
- // compile code to node module
34
- const exports = requireFromString ( code , filename ) ;
35
-
36
- if ( exports . devServerHandler ) {
37
- // install dev server handler
38
- ssrHandler = exports . devServerHandler ( compiler ) ;
39
- } else if ( exports . default ) {
40
- // install production handler
41
- ssrHandler = exports . default ;
42
- } else {
43
- // no handler found
44
- throw new Error ( "SSR entry point does not export a handler." ) ;
36
+ const compilerStats = multiCompilerStats . stats . filter ( stats => stats . compilation . name === 'ssr' ) [ 0 ] ;
37
+
38
+ if ( compilerStats . compilation . errors . length === 0 ) {
39
+ // fetch ssr entry point file name
40
+ const filename = path . resolve ( paths . appBuild , ".." , "dist" , "ssr.js" ) ;
41
+ // read code from in memory fs
42
+ const code = compiler . outputFileSystem . readFileSync ( filename ) . toString ( ) ;
43
+ // compile code to node module
44
+ const exports = requireFromString ( code , filename ) ;
45
+
46
+ if ( exports . devServerHandler ) {
47
+ // install dev server handler
48
+ installHandler ( exports . devServerHandler ( compiler ) ) ;
49
+ } else if ( exports . default ) {
50
+ // install production handler
51
+ installHandler ( exports . default ) ;
52
+ } else {
53
+ // no handler found
54
+ throw new Error ( "SSR entry point does not export a handler." ) ;
55
+ }
45
56
}
46
57
} catch ( error ) {
47
58
console . error ( error ) ;
59
+ // install error handler
60
+ installHandler ( ( request , response , next ) => {
61
+ // response.send("ERROR HANDLER: " + error.toString());
62
+ next ( error ) ;
63
+ } ) ;
48
64
}
49
65
} ) ;
50
66
51
67
// install request handler in webpack dev server
52
- app . use ( ( request , response , next ) => {
53
- // forward to handler if it exists
54
- if ( ssrHandler ) {
55
- ssrHandler ( request , response , next ) ;
56
- } else {
57
- // skip to dev middleware
58
- next ( ) ;
59
- }
60
- } ) ;
68
+ app . use ( ( request , response , next ) => ssrHandler ( request , response , next ) ) ;
61
69
}
62
70
} ;
63
71
} ;
0 commit comments