@@ -8,28 +8,32 @@ const stripAnsi = require('strip-ansi');
8
8
const log = require ( 'loglevel' ) . getLogger ( 'webpack-dev-server' ) ;
9
9
const socket = require ( './socket' ) ;
10
10
const overlay = require ( './overlay' ) ;
11
-
12
- function getCurrentScriptSource ( ) {
13
- // `document.currentScript` is the most accurate way to find the current script,
14
- // but is not supported in all browsers.
15
- if ( document . currentScript ) {
16
- return document . currentScript . getAttribute ( 'src' ) ;
17
- }
18
- // Fall back to getting all scripts in the document.
19
- const scriptElements = document . scripts || [ ] ;
20
- const currentScript = scriptElements [ scriptElements . length - 1 ] ;
21
- if ( currentScript ) {
22
- return currentScript . getAttribute ( 'src' ) ;
23
- }
24
- // Fail as there was no script to use.
25
- throw new Error ( '[WDS] Failed to get current script source.' ) ;
26
- }
11
+ const sendMessage = require ( './utils/sendMessage' ) ;
12
+ const reloadApp = require ( './utils/reloadApp' ) ;
13
+ const getCurrentScriptSource = require ( './utils/getCurrentScriptSource' ) ;
27
14
28
15
let urlParts ;
29
- let hotReload = true ;
16
+ const status = {
17
+ isUnloading : false ,
18
+ currentHash : '' ,
19
+ } ;
20
+ const options = {
21
+ hot : false ,
22
+ hotReload : true ,
23
+ liveReload : false ,
24
+ initial : true ,
25
+ useWarningOverlay : false ,
26
+ useErrorOverlay : false ,
27
+ useProgress : false ,
28
+ } ;
29
+
30
+ self . addEventListener ( 'beforeunload' , ( ) => {
31
+ status . isUnloading = true ;
32
+ } ) ;
33
+
30
34
if ( typeof window !== 'undefined' ) {
31
35
const qs = window . location . search . toLowerCase ( ) ;
32
- hotReload = qs . indexOf ( 'hotreload=false' ) === - 1 ;
36
+ options . hotReload = qs . indexOf ( 'hotreload=false' ) === - 1 ;
33
37
}
34
38
if ( typeof __resourceQuery === 'string' && __resourceQuery ) {
35
39
// If this bundle is inlined, use the resource query to get the correct url.
@@ -46,21 +50,12 @@ if (!urlParts.port || urlParts.port === '0') {
46
50
urlParts . port = self . location . port ;
47
51
}
48
52
49
- let hot = false ;
50
- let liveReload = false ;
51
- let initial = true ;
52
- let currentHash = '' ;
53
- let useWarningOverlay = false ;
54
- let useErrorOverlay = false ;
55
- let useProgress = false ;
56
-
57
53
const INFO = 'info' ;
58
54
const WARN = 'warn' ;
59
55
const ERROR = 'error' ;
60
56
const DEBUG = 'debug' ;
61
57
const TRACE = 'trace' ;
62
58
const SILENT = 'silent' ;
63
-
64
59
// deprecated
65
60
// TODO: remove these at major released
66
61
// https://github.com/webpack/webpack-dev-server/pull/1825
@@ -70,49 +65,32 @@ const NONE = 'none';
70
65
// Set the default log level
71
66
log . setDefaultLevel ( INFO ) ;
72
67
73
- // Send messages to the outside, so plugins can consume it.
74
- function sendMsg ( type , data ) {
75
- if (
76
- typeof self !== 'undefined' &&
77
- ( typeof WorkerGlobalScope === 'undefined' ||
78
- ! ( self instanceof WorkerGlobalScope ) )
79
- ) {
80
- self . postMessage (
81
- {
82
- type : `webpack${ type } ` ,
83
- data,
84
- } ,
85
- '*'
86
- ) ;
87
- }
88
- }
89
-
90
68
const onSocketMsg = {
91
69
hot ( ) {
92
- hot = true ;
70
+ options . hot = true ;
93
71
log . info ( '[WDS] Hot Module Replacement enabled.' ) ;
94
72
} ,
95
73
liveReload ( ) {
96
- liveReload = true ;
74
+ options . liveReload = true ;
97
75
log . info ( '[WDS] Live Reloading enabled.' ) ;
98
76
} ,
99
77
invalid ( ) {
100
78
log . info ( '[WDS] App updated. Recompiling...' ) ;
101
79
// fixes #1042. overlay doesn't clear if errors are fixed but warnings remain.
102
- if ( useWarningOverlay || useErrorOverlay ) {
80
+ if ( options . useWarningOverlay || options . useErrorOverlay ) {
103
81
overlay . clear ( ) ;
104
82
}
105
- sendMsg ( 'Invalid' ) ;
83
+ sendMessage ( 'Invalid' ) ;
106
84
} ,
107
85
hash ( hash ) {
108
- currentHash = hash ;
86
+ status . currentHash = hash ;
109
87
} ,
110
88
'still-ok' : function stillOk ( ) {
111
89
log . info ( '[WDS] Nothing changed.' ) ;
112
- if ( useWarningOverlay || useErrorOverlay ) {
90
+ if ( options . useWarningOverlay || options . useErrorOverlay ) {
113
91
overlay . clear ( ) ;
114
92
}
115
- sendMsg ( 'StillOk' ) ;
93
+ sendMessage ( 'StillOk' ) ;
116
94
} ,
117
95
'log-level' : function logLevel ( level ) {
118
96
const hotCtx = require . context ( 'webpack/hot' , false , / ^ \. \/ l o g $ / ) ;
@@ -144,34 +122,34 @@ const onSocketMsg = {
144
122
overlay ( value ) {
145
123
if ( typeof document !== 'undefined' ) {
146
124
if ( typeof value === 'boolean' ) {
147
- useWarningOverlay = false ;
148
- useErrorOverlay = value ;
125
+ options . useWarningOverlay = false ;
126
+ options . useErrorOverlay = value ;
149
127
} else if ( value ) {
150
- useWarningOverlay = value . warnings ;
151
- useErrorOverlay = value . errors ;
128
+ options . useWarningOverlay = value . warnings ;
129
+ options . useErrorOverlay = value . errors ;
152
130
}
153
131
}
154
132
} ,
155
133
progress ( progress ) {
156
134
if ( typeof document !== 'undefined' ) {
157
- useProgress = progress ;
135
+ options . useProgress = progress ;
158
136
}
159
137
} ,
160
138
'progress-update' : function progressUpdate ( data ) {
161
- if ( useProgress ) {
139
+ if ( options . useProgress ) {
162
140
log . info ( `[WDS] ${ data . percent } % - ${ data . msg } .` ) ;
163
141
}
164
- sendMsg ( 'Progress' , data ) ;
142
+ sendMessage ( 'Progress' , data ) ;
165
143
} ,
166
144
ok ( ) {
167
- sendMsg ( 'Ok' ) ;
168
- if ( useWarningOverlay || useErrorOverlay ) {
145
+ sendMessage ( 'Ok' ) ;
146
+ if ( options . useWarningOverlay || options . useErrorOverlay ) {
169
147
overlay . clear ( ) ;
170
148
}
171
- if ( initial ) {
172
- return ( initial = false ) ;
149
+ if ( options . initial ) {
150
+ return ( options . initial = false ) ;
173
151
} // eslint-disable-line no-return-assign
174
- reloadApp ( ) ;
152
+ reloadApp ( options , status ) ;
175
153
} ,
176
154
'content-changed' : function contentChanged ( ) {
177
155
log . info ( '[WDS] Content base changed. Reloading...' ) ;
@@ -180,42 +158,41 @@ const onSocketMsg = {
180
158
warnings ( warnings ) {
181
159
log . warn ( '[WDS] Warnings while compiling.' ) ;
182
160
const strippedWarnings = warnings . map ( ( warning ) => stripAnsi ( warning ) ) ;
183
- sendMsg ( 'Warnings' , strippedWarnings ) ;
161
+ sendMessage ( 'Warnings' , strippedWarnings ) ;
184
162
for ( let i = 0 ; i < strippedWarnings . length ; i ++ ) {
185
163
log . warn ( strippedWarnings [ i ] ) ;
186
164
}
187
- if ( useWarningOverlay ) {
165
+ if ( options . useWarningOverlay ) {
188
166
overlay . showMessage ( warnings ) ;
189
167
}
190
168
191
- if ( initial ) {
192
- return ( initial = false ) ;
169
+ if ( options . initial ) {
170
+ return ( options . initial = false ) ;
193
171
} // eslint-disable-line no-return-assign
194
- reloadApp ( ) ;
172
+ reloadApp ( options , status ) ;
195
173
} ,
196
174
errors ( errors ) {
197
175
log . error ( '[WDS] Errors while compiling. Reload prevented.' ) ;
198
176
const strippedErrors = errors . map ( ( error ) => stripAnsi ( error ) ) ;
199
- sendMsg ( 'Errors' , strippedErrors ) ;
177
+ sendMessage ( 'Errors' , strippedErrors ) ;
200
178
for ( let i = 0 ; i < strippedErrors . length ; i ++ ) {
201
179
log . error ( strippedErrors [ i ] ) ;
202
180
}
203
- if ( useErrorOverlay ) {
181
+ if ( options . useErrorOverlay ) {
204
182
overlay . showMessage ( errors ) ;
205
183
}
206
- initial = false ;
184
+ options . initial = false ;
207
185
} ,
208
186
error ( error ) {
209
187
log . error ( error ) ;
210
188
} ,
211
189
close ( ) {
212
190
log . error ( '[WDS] Disconnected!' ) ;
213
- sendMsg ( 'Close' ) ;
191
+ sendMessage ( 'Close' ) ;
214
192
} ,
215
193
} ;
216
194
217
- let hostname = urlParts . hostname ;
218
- let protocol = urlParts . protocol ;
195
+ let { hostname, protocol } = urlParts ;
219
196
220
197
// check ipv4 and ipv6 `all hostname`
221
198
if ( hostname === '0.0.0.0' || hostname === '::' ) {
@@ -270,47 +247,3 @@ const socketUrl = url.format({
270
247
} ) ;
271
248
272
249
socket ( socketUrl , onSocketMsg ) ;
273
-
274
- let isUnloading = false ;
275
- self . addEventListener ( 'beforeunload' , ( ) => {
276
- isUnloading = true ;
277
- } ) ;
278
-
279
- function reloadApp ( ) {
280
- if ( isUnloading || ! hotReload ) {
281
- return ;
282
- }
283
- if ( hot ) {
284
- log . info ( '[WDS] App hot update...' ) ;
285
- // eslint-disable-next-line global-require
286
- const hotEmitter = require ( 'webpack/hot/emitter' ) ;
287
- hotEmitter . emit ( 'webpackHotUpdate' , currentHash ) ;
288
- if ( typeof self !== 'undefined' && self . window ) {
289
- // broadcast update to window
290
- self . postMessage ( `webpackHotUpdate${ currentHash } ` , '*' ) ;
291
- }
292
- }
293
- // allow refreshing the page only if liveReload isn't disabled
294
- else if ( liveReload ) {
295
- let rootWindow = self ;
296
- // use parent window for reload (in case we're in an iframe with no valid src)
297
- const intervalId = self . setInterval ( ( ) => {
298
- if ( rootWindow . location . protocol !== 'about:' ) {
299
- // reload immediately if protocol is valid
300
- applyReload ( rootWindow , intervalId ) ;
301
- } else {
302
- rootWindow = rootWindow . parent ;
303
- if ( rootWindow . parent === rootWindow ) {
304
- // if parent equals current window we've reached the root which would continue forever, so trigger a reload anyways
305
- applyReload ( rootWindow , intervalId ) ;
306
- }
307
- }
308
- } ) ;
309
- }
310
-
311
- function applyReload ( rootWindow , intervalId ) {
312
- clearInterval ( intervalId ) ;
313
- log . info ( '[WDS] App updated. Reloading...' ) ;
314
- rootWindow . location . reload ( ) ;
315
- }
316
- }
0 commit comments