@modern-js/server 2.0.0-beta.0 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -0
- package/dist/js/modern/dev-tools/dev-middleware/dev-server-plugin.js +4 -9
- package/dist/js/modern/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +2 -5
- package/dist/js/modern/dev-tools/dev-middleware/hmr-client/index.js +43 -50
- package/dist/js/modern/dev-tools/dev-middleware/index.js +14 -32
- package/dist/js/modern/dev-tools/dev-middleware/socket-server.js +18 -43
- package/dist/js/modern/dev-tools/https/index.js +0 -2
- package/dist/js/modern/dev-tools/mock/getMockData.js +4 -23
- package/dist/js/modern/dev-tools/mock/index.js +0 -8
- package/dist/js/modern/dev-tools/register/index.js +2 -18
- package/dist/js/modern/dev-tools/watcher/dependency-tree.js +5 -15
- package/dist/js/modern/dev-tools/watcher/index.js +0 -18
- package/dist/js/modern/dev-tools/watcher/stats-cache.js +0 -16
- package/dist/js/modern/index.js +0 -1
- package/dist/js/modern/server/dev-server.js +36 -56
- package/dist/js/modern/server/index.js +0 -4
- package/dist/js/node/constants.js +0 -3
- package/dist/js/node/dev-tools/dev-middleware/dev-server-plugin.js +4 -11
- package/dist/js/node/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +2 -8
- package/dist/js/node/dev-tools/dev-middleware/hmr-client/index.js +41 -53
- package/dist/js/node/dev-tools/dev-middleware/index.js +14 -38
- package/dist/js/node/dev-tools/dev-middleware/socket-server.js +18 -48
- package/dist/js/node/dev-tools/https/index.js +0 -7
- package/dist/js/node/dev-tools/mock/getMockData.js +4 -29
- package/dist/js/node/dev-tools/mock/index.js +0 -17
- package/dist/js/node/dev-tools/register/index.js +2 -27
- package/dist/js/node/dev-tools/watcher/dependency-tree.js +5 -19
- package/dist/js/node/dev-tools/watcher/index.js +0 -32
- package/dist/js/node/dev-tools/watcher/stats-cache.js +0 -23
- package/dist/js/node/index.js +0 -4
- package/dist/js/node/server/dev-server.js +36 -75
- package/dist/js/node/server/index.js +0 -7
- package/dist/types/dev-tools/mock/getMockData.d.ts +0 -2
- package/dist/types/dev-tools/watcher/dependency-tree.d.ts +0 -2
- package/dist/types/index.d.ts +0 -2
- package/package.json +11 -11
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
-
|
|
3
2
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
4
|
-
|
|
5
3
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
|
-
|
|
7
4
|
import { createServer } from 'http';
|
|
8
5
|
import path from 'path';
|
|
9
6
|
import { createServer as createHttpsServer } from 'https';
|
|
@@ -17,20 +14,19 @@ import Watcher, { mergeWatchOptions } from "../dev-tools/watcher";
|
|
|
17
14
|
import DevMiddleware from "../dev-tools/dev-middleware";
|
|
18
15
|
export class ModernDevServer extends ModernServer {
|
|
19
16
|
constructor(options) {
|
|
20
|
-
super(options);
|
|
17
|
+
super(options);
|
|
21
18
|
|
|
19
|
+
// dev server should work in pwd
|
|
22
20
|
_defineProperty(this, "mockHandler", null);
|
|
23
|
-
|
|
24
21
|
_defineProperty(this, "dev", void 0);
|
|
25
|
-
|
|
26
22
|
_defineProperty(this, "devMiddleware", void 0);
|
|
27
|
-
|
|
28
23
|
_defineProperty(this, "watcher", void 0);
|
|
24
|
+
this.workDir = this.pwd;
|
|
29
25
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
this.dev = this.getDevOptions(options); // create dev middleware instance
|
|
26
|
+
// set dev server options, like webpack-dev-server
|
|
27
|
+
this.dev = this.getDevOptions(options);
|
|
33
28
|
|
|
29
|
+
// create dev middleware instance
|
|
34
30
|
this.devMiddleware = new DevMiddleware({
|
|
35
31
|
dev: this.dev,
|
|
36
32
|
compiler: options.compiler,
|
|
@@ -38,7 +34,6 @@ export class ModernDevServer extends ModernServer {
|
|
|
38
34
|
});
|
|
39
35
|
enableRegister(this.pwd, this.conf);
|
|
40
36
|
}
|
|
41
|
-
|
|
42
37
|
getDevOptions(options) {
|
|
43
38
|
const devOptions = typeof options.dev === 'boolean' ? {} : options.dev;
|
|
44
39
|
const defaultOptions = getDefaultDevOptions();
|
|
@@ -46,7 +41,6 @@ export class ModernDevServer extends ModernServer {
|
|
|
46
41
|
client: _objectSpread(_objectSpread({}, defaultOptions.client), devOptions === null || devOptions === void 0 ? void 0 : devOptions.client)
|
|
47
42
|
});
|
|
48
43
|
}
|
|
49
|
-
|
|
50
44
|
addMiddlewareHandler(handlers) {
|
|
51
45
|
handlers.forEach(handler => {
|
|
52
46
|
this.addHandler((ctx, next) => {
|
|
@@ -58,7 +52,6 @@ export class ModernDevServer extends ModernServer {
|
|
|
58
52
|
});
|
|
59
53
|
});
|
|
60
54
|
}
|
|
61
|
-
|
|
62
55
|
applySetupMiddlewares() {
|
|
63
56
|
const setupMiddlewares = this.dev.setupMiddlewares || [];
|
|
64
57
|
const serverOptions = {
|
|
@@ -76,38 +69,40 @@ export class ModernDevServer extends ModernServer {
|
|
|
76
69
|
befores,
|
|
77
70
|
afters
|
|
78
71
|
};
|
|
79
|
-
}
|
|
80
|
-
|
|
72
|
+
}
|
|
81
73
|
|
|
74
|
+
// Complete the preparation of services
|
|
82
75
|
async onInit(runner, app) {
|
|
83
76
|
this.runner = runner;
|
|
84
77
|
const {
|
|
85
78
|
dev
|
|
86
|
-
} = this;
|
|
79
|
+
} = this;
|
|
87
80
|
|
|
81
|
+
// Order: devServer.before => setupMiddlewares.unshift => internal middlewares => setupMiddlewares.push => devServer.after
|
|
88
82
|
const {
|
|
89
83
|
befores,
|
|
90
84
|
afters
|
|
91
|
-
} = this.applySetupMiddlewares();
|
|
85
|
+
} = this.applySetupMiddlewares();
|
|
92
86
|
|
|
87
|
+
// before dev handler
|
|
93
88
|
const beforeHandlers = await this.setupBeforeDevMiddleware();
|
|
94
89
|
this.addMiddlewareHandler([...beforeHandlers, ...befores]);
|
|
95
|
-
await this.applyDefaultMiddlewares(app);
|
|
90
|
+
await this.applyDefaultMiddlewares(app);
|
|
96
91
|
|
|
92
|
+
// after dev handler
|
|
97
93
|
const afterHandlers = await this.setupAfterDevMiddleware();
|
|
98
94
|
this.addMiddlewareHandler([...afters, ...afterHandlers]);
|
|
99
|
-
await super.onInit(runner, app);
|
|
95
|
+
await super.onInit(runner, app);
|
|
100
96
|
|
|
97
|
+
// watch mock/ server/ api/ dir file change
|
|
101
98
|
if (dev.watch) {
|
|
102
99
|
this.startWatcher();
|
|
103
100
|
app.on('close', async () => {
|
|
104
101
|
var _this$watcher;
|
|
105
|
-
|
|
106
102
|
await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
|
|
107
103
|
});
|
|
108
104
|
}
|
|
109
105
|
}
|
|
110
|
-
|
|
111
106
|
async applyDefaultMiddlewares(app) {
|
|
112
107
|
const {
|
|
113
108
|
pwd,
|
|
@@ -116,23 +111,22 @@ export class ModernDevServer extends ModernServer {
|
|
|
116
111
|
} = this;
|
|
117
112
|
this.addHandler((ctx, next) => {
|
|
118
113
|
// allow hmr request cross-domain, because the user may use global proxy
|
|
114
|
+
ctx.res.setHeader('Access-Control-Allow-Origin', '*');
|
|
119
115
|
if (ctx.path.includes('hot-update')) {
|
|
120
|
-
ctx.res.setHeader('Access-Control-Allow-Origin', '*');
|
|
121
116
|
ctx.res.setHeader('Access-Control-Allow-Credentials', 'false');
|
|
122
|
-
}
|
|
123
|
-
|
|
117
|
+
}
|
|
124
118
|
|
|
119
|
+
// 用户在 devServer 上配置的 headers 不会对 html 的请求生效,加入下面代码,使配置的 headers 对所有请求生效
|
|
125
120
|
const confHeaders = dev.headers;
|
|
126
|
-
|
|
127
121
|
if (confHeaders) {
|
|
128
122
|
for (const [key, value] of Object.entries(confHeaders)) {
|
|
129
123
|
ctx.res.setHeader(key, value);
|
|
130
124
|
}
|
|
131
125
|
}
|
|
132
|
-
|
|
133
126
|
next();
|
|
134
|
-
});
|
|
127
|
+
});
|
|
135
128
|
|
|
129
|
+
// mock handler
|
|
136
130
|
this.mockHandler = createMockHandler({
|
|
137
131
|
pwd
|
|
138
132
|
});
|
|
@@ -142,17 +136,17 @@ export class ModernDevServer extends ModernServer {
|
|
|
142
136
|
} else {
|
|
143
137
|
next();
|
|
144
138
|
}
|
|
145
|
-
});
|
|
139
|
+
});
|
|
146
140
|
|
|
141
|
+
// dev proxy handler, each proxy has own handler
|
|
147
142
|
const proxyHandlers = createProxyHandler(dev.proxy);
|
|
148
|
-
|
|
149
143
|
if (proxyHandlers) {
|
|
150
144
|
proxyHandlers.forEach(handler => {
|
|
151
145
|
this.addHandler(handler);
|
|
152
146
|
});
|
|
153
|
-
}
|
|
154
|
-
|
|
147
|
+
}
|
|
155
148
|
|
|
149
|
+
// do webpack build / plugin apply / socket server when pass compiler instance
|
|
156
150
|
devMiddleware.init(app);
|
|
157
151
|
devMiddleware.on('change', stats => {
|
|
158
152
|
// Reset only when client compile done
|
|
@@ -169,14 +163,12 @@ export class ModernDevServer extends ModernServer {
|
|
|
169
163
|
req,
|
|
170
164
|
res
|
|
171
165
|
} = ctx;
|
|
172
|
-
|
|
173
166
|
if (devMiddleware.middleware) {
|
|
174
167
|
devMiddleware.middleware(req, res, next);
|
|
175
168
|
} else {
|
|
176
169
|
next();
|
|
177
170
|
}
|
|
178
171
|
});
|
|
179
|
-
|
|
180
172
|
if (dev.historyApiFallback) {
|
|
181
173
|
const {
|
|
182
174
|
default: connectHistoryApiFallback
|
|
@@ -185,41 +177,37 @@ export class ModernDevServer extends ModernServer {
|
|
|
185
177
|
this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
|
|
186
178
|
}
|
|
187
179
|
}
|
|
188
|
-
|
|
189
180
|
onRepack(options = {}) {
|
|
190
181
|
// reset the routing management instance every times the service starts
|
|
191
182
|
if (Array.isArray(options.routes)) {
|
|
192
183
|
this.router.reset(this.filterRoutes(options.routes));
|
|
193
|
-
}
|
|
194
|
-
|
|
184
|
+
}
|
|
195
185
|
|
|
196
|
-
|
|
186
|
+
// clean ssr bundle cache
|
|
187
|
+
this.cleanSSRCache();
|
|
197
188
|
|
|
189
|
+
// reset static file
|
|
198
190
|
this.reader.updateFile();
|
|
199
191
|
super.onRepack(options);
|
|
200
192
|
}
|
|
201
|
-
|
|
202
193
|
async createHTTPServer(handler) {
|
|
203
194
|
const {
|
|
204
195
|
dev
|
|
205
196
|
} = this;
|
|
206
197
|
const devHttpsOption = typeof dev === 'object' && dev.https;
|
|
207
|
-
|
|
208
198
|
if (devHttpsOption) {
|
|
209
199
|
const {
|
|
210
200
|
genHttpsOptions
|
|
211
201
|
} = require("../dev-tools/https");
|
|
212
|
-
|
|
213
202
|
const httpsOptions = await genHttpsOptions(devHttpsOption);
|
|
214
203
|
return createHttpsServer(httpsOptions, handler);
|
|
215
204
|
} else {
|
|
216
205
|
return createServer(handler);
|
|
217
206
|
}
|
|
218
207
|
}
|
|
219
|
-
|
|
220
|
-
|
|
208
|
+
warmupSSRBundle() {
|
|
209
|
+
// not warmup ssr bundle on development
|
|
221
210
|
}
|
|
222
|
-
|
|
223
211
|
onServerChange({
|
|
224
212
|
filepath,
|
|
225
213
|
event
|
|
@@ -232,7 +220,6 @@ export class ModernDevServer extends ModernServer {
|
|
|
232
220
|
} = AGGRED_DIR;
|
|
233
221
|
const mockPath = path.normalize(path.join(pwd, mock));
|
|
234
222
|
this.runner.reset();
|
|
235
|
-
|
|
236
223
|
if (filepath.startsWith(mockPath)) {
|
|
237
224
|
this.mockHandler = createMockHandler({
|
|
238
225
|
pwd
|
|
@@ -242,11 +229,12 @@ export class ModernDevServer extends ModernServer {
|
|
|
242
229
|
const success = this.runner.onApiChange([{
|
|
243
230
|
filename: filepath,
|
|
244
231
|
event
|
|
245
|
-
}]);
|
|
232
|
+
}]);
|
|
233
|
+
|
|
234
|
+
// onApiChange 钩子被调用,且返回 true,则表示无需重新编译
|
|
246
235
|
// onApiChange 的类型是 WaterFall,WaterFall 钩子的返回值类型目前有问题
|
|
247
236
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
248
237
|
// @ts-expect-error
|
|
249
|
-
|
|
250
238
|
if (success !== true) {
|
|
251
239
|
super.onServerChange({
|
|
252
240
|
filepath
|
|
@@ -257,13 +245,11 @@ export class ModernDevServer extends ModernServer {
|
|
|
257
245
|
}
|
|
258
246
|
}
|
|
259
247
|
}
|
|
260
|
-
|
|
261
248
|
createContext(req, res) {
|
|
262
249
|
return super.createContext(req, res, {
|
|
263
250
|
etag: true
|
|
264
251
|
});
|
|
265
252
|
}
|
|
266
|
-
|
|
267
253
|
async setupBeforeDevMiddleware() {
|
|
268
254
|
const {
|
|
269
255
|
runner,
|
|
@@ -274,7 +260,6 @@ export class ModernDevServer extends ModernServer {
|
|
|
274
260
|
const pluginMids = await runner.beforeDevServer(conf);
|
|
275
261
|
return [...setupMids, ...pluginMids].flat();
|
|
276
262
|
}
|
|
277
|
-
|
|
278
263
|
async setupAfterDevMiddleware() {
|
|
279
264
|
const {
|
|
280
265
|
runner,
|
|
@@ -285,7 +270,6 @@ export class ModernDevServer extends ModernServer {
|
|
|
285
270
|
const pluginMids = await runner.afterDevServer(conf);
|
|
286
271
|
return [...pluginMids, ...setupMids].flat();
|
|
287
272
|
}
|
|
288
|
-
|
|
289
273
|
cleanSSRCache() {
|
|
290
274
|
const {
|
|
291
275
|
distDir
|
|
@@ -293,21 +277,17 @@ export class ModernDevServer extends ModernServer {
|
|
|
293
277
|
const bundles = this.router.getBundles();
|
|
294
278
|
bundles.forEach(bundle => {
|
|
295
279
|
const filepath = path.join(distDir, bundle);
|
|
296
|
-
|
|
297
280
|
if (require.cache[filepath]) {
|
|
298
281
|
delete require.cache[filepath];
|
|
299
282
|
}
|
|
300
283
|
});
|
|
301
284
|
const loadable = path.join(distDir, LOADABLE_STATS_FILE);
|
|
302
|
-
|
|
303
285
|
if (require.cache[loadable]) {
|
|
304
286
|
delete require.cache[loadable];
|
|
305
287
|
}
|
|
306
288
|
}
|
|
307
|
-
|
|
308
289
|
startWatcher() {
|
|
309
290
|
var _this$conf$server;
|
|
310
|
-
|
|
311
291
|
const {
|
|
312
292
|
pwd
|
|
313
293
|
} = this;
|
|
@@ -318,8 +298,9 @@ export class ModernDevServer extends ModernServer {
|
|
|
318
298
|
const watchOptions = mergeWatchOptions((_this$conf$server = this.conf.server) === null || _this$conf$server === void 0 ? void 0 : _this$conf$server.watchOptions);
|
|
319
299
|
const defaultWatchedPaths = defaultWatched.map(p => path.normalize(path.join(pwd, p)));
|
|
320
300
|
const watcher = new Watcher();
|
|
321
|
-
watcher.createDepTree();
|
|
301
|
+
watcher.createDepTree();
|
|
322
302
|
|
|
303
|
+
// 监听文件变动,如果有变动则给 client,也就是 start 启动的插件发消息
|
|
323
304
|
watcher.listen(defaultWatchedPaths, watchOptions, (filepath, event) => {
|
|
324
305
|
watcher.updateDepTree();
|
|
325
306
|
watcher.cleanDepCache(filepath);
|
|
@@ -330,5 +311,4 @@ export class ModernDevServer extends ModernServer {
|
|
|
330
311
|
});
|
|
331
312
|
this.watcher = watcher;
|
|
332
313
|
}
|
|
333
|
-
|
|
334
314
|
}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import { Server } from '@modern-js/prod-server';
|
|
2
2
|
import { ModernDevServer } from "./dev-server";
|
|
3
|
-
|
|
4
3
|
const createDevServer = options => {
|
|
5
4
|
return new ModernDevServer(options);
|
|
6
5
|
};
|
|
7
|
-
|
|
8
6
|
export class DevServer extends Server {
|
|
9
7
|
constructor(options) {
|
|
10
8
|
super(options);
|
|
11
|
-
|
|
12
9
|
if (options.dev) {
|
|
13
10
|
this.serverImpl = createDevServer;
|
|
14
11
|
}
|
|
15
12
|
}
|
|
16
|
-
|
|
17
13
|
}
|
|
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getDefaultDevOptions = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("@modern-js/utils");
|
|
9
|
-
|
|
10
8
|
const getDefaultDevOptions = () => {
|
|
11
9
|
const network = (0, _utils.getIpv4Interfaces)().find(item => !item.internal);
|
|
12
10
|
return {
|
|
@@ -24,5 +22,4 @@ const getDefaultDevOptions = () => {
|
|
|
24
22
|
liveReload: true
|
|
25
23
|
};
|
|
26
24
|
};
|
|
27
|
-
|
|
28
25
|
exports.getDefaultDevOptions = getDefaultDevOptions;
|
|
@@ -4,16 +4,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
9
|
-
|
|
10
8
|
class DevServerPlugin {
|
|
11
9
|
constructor(options) {
|
|
12
10
|
_defineProperty(this, "options", void 0);
|
|
13
|
-
|
|
14
11
|
this.options = options;
|
|
15
12
|
}
|
|
16
|
-
|
|
17
13
|
injectHMRClient(compiler) {
|
|
18
14
|
const {
|
|
19
15
|
client
|
|
@@ -21,32 +17,29 @@ class DevServerPlugin {
|
|
|
21
17
|
const host = client !== null && client !== void 0 && client.host ? `&host=${client.host}` : '';
|
|
22
18
|
const path = client !== null && client !== void 0 && client.path ? `&path=${client.path}` : '';
|
|
23
19
|
const port = client !== null && client !== void 0 && client.port ? `&port=${client.port}` : '';
|
|
24
|
-
const clientEntry = `${require.resolve("./hmr-client")}?${host}${path}${port}`;
|
|
20
|
+
const clientEntry = `${require.resolve("./hmr-client")}?${host}${path}${port}`;
|
|
25
21
|
|
|
22
|
+
// use a hook to add entries if available
|
|
26
23
|
new compiler.webpack.EntryPlugin(compiler.context, clientEntry, {
|
|
27
24
|
name: undefined
|
|
28
25
|
}).apply(compiler);
|
|
29
26
|
}
|
|
30
|
-
|
|
31
27
|
apply(compiler) {
|
|
32
28
|
if (this.options.hot || this.options.liveReload) {
|
|
33
29
|
this.injectHMRClient(compiler);
|
|
34
|
-
}
|
|
35
|
-
|
|
30
|
+
}
|
|
36
31
|
|
|
32
|
+
// Todo remove, client must inject.
|
|
37
33
|
const compilerOptions = compiler.options;
|
|
38
34
|
const {
|
|
39
35
|
HotModuleReplacementPlugin
|
|
40
36
|
} = compiler.webpack;
|
|
41
37
|
compilerOptions.plugins = compilerOptions.plugins || [];
|
|
42
|
-
|
|
43
38
|
if (!compilerOptions.plugins.find(p => p.constructor === HotModuleReplacementPlugin)) {
|
|
44
39
|
// apply the HMR plugin, if it didn't exist before.
|
|
45
40
|
const plugin = new HotModuleReplacementPlugin();
|
|
46
41
|
plugin.apply(compiler);
|
|
47
42
|
}
|
|
48
43
|
}
|
|
49
|
-
|
|
50
44
|
}
|
|
51
|
-
|
|
52
45
|
exports.default = DevServerPlugin;
|
|
@@ -5,23 +5,18 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.createSocketUrl = createSocketUrl;
|
|
7
7
|
exports.formatURL = formatURL;
|
|
8
|
-
|
|
9
8
|
var _constants = require("@modern-js/utils/constants");
|
|
10
|
-
|
|
11
9
|
function createSocketUrl(resourceQuery) {
|
|
12
10
|
// ?host=localhost&port=8080&path=modern_js_hmr_ws
|
|
13
11
|
const searchParams = resourceQuery.substr(1).split('&');
|
|
14
12
|
const options = {};
|
|
15
|
-
|
|
16
13
|
for (const pair of searchParams) {
|
|
17
14
|
const ary = pair.split('=');
|
|
18
15
|
options[ary[0]] = decodeURIComponent(ary[1]);
|
|
19
16
|
}
|
|
20
|
-
|
|
21
17
|
const currentLocation = self.location;
|
|
22
18
|
return getSocketUrl(options, currentLocation);
|
|
23
19
|
}
|
|
24
|
-
|
|
25
20
|
function formatURL({
|
|
26
21
|
port,
|
|
27
22
|
protocol,
|
|
@@ -36,13 +31,12 @@ function formatURL({
|
|
|
36
31
|
url.protocol = protocol;
|
|
37
32
|
url.pathname = pathname;
|
|
38
33
|
return url.toString();
|
|
39
|
-
}
|
|
40
|
-
|
|
34
|
+
}
|
|
41
35
|
|
|
36
|
+
// compatible with IE11
|
|
42
37
|
const colon = protocol.indexOf(':') === -1 ? ':' : '';
|
|
43
38
|
return `${protocol}${colon}//${hostname}:${port}${pathname}`;
|
|
44
39
|
}
|
|
45
|
-
|
|
46
40
|
function getSocketUrl(urlParts, location) {
|
|
47
41
|
const {
|
|
48
42
|
host,
|
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _stripAnsi = _interopRequireDefault(require("@modern-js/utils/strip-ansi"));
|
|
4
|
-
|
|
5
4
|
var _format = require("@modern-js/utils/format");
|
|
6
|
-
|
|
7
5
|
var _createSocketUrl = require("./createSocketUrl");
|
|
8
|
-
|
|
9
6
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
-
|
|
11
7
|
/**
|
|
12
8
|
* This has been adapted from `create-react-app`, authored by Facebook, Inc.
|
|
13
9
|
* see: https://github.com/facebookincubator/create-react-app/tree/master/packages/react-dev-utils
|
|
14
10
|
*
|
|
15
11
|
* Tips: this package will be bundled and running in the browser, do not import from the entry of @modern-js/utils.
|
|
16
12
|
*/
|
|
13
|
+
|
|
17
14
|
// TODO hadRuntimeError should be fixed.
|
|
18
15
|
// We need to keep track of if there has been a runtime error.
|
|
19
16
|
// Essentially, we cannot guarantee application state was not corrupted by the
|
|
@@ -21,24 +18,25 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
21
18
|
// application. This is handled below when we are notified of a compile (code
|
|
22
19
|
// change).
|
|
23
20
|
// See https://github.com/facebook/create-react-app/issues/3096
|
|
24
|
-
const hadRuntimeError = false;
|
|
21
|
+
const hadRuntimeError = false;
|
|
25
22
|
|
|
23
|
+
// Connect to Dev Server
|
|
26
24
|
const socketUrl = (0, _createSocketUrl.createSocketUrl)(__resourceQuery);
|
|
27
|
-
const connection = new WebSocket(socketUrl);
|
|
25
|
+
const connection = new WebSocket(socketUrl);
|
|
26
|
+
|
|
27
|
+
// Unlike WebpackDevServer client, we won't try to reconnect
|
|
28
28
|
// to avoid spamming the console. Disconnect usually happens
|
|
29
29
|
// when developer stops the server.
|
|
30
|
-
|
|
31
30
|
connection.onclose = function () {
|
|
32
31
|
if (typeof console !== 'undefined' && typeof console.info === 'function') {
|
|
33
32
|
console.info('The development server has disconnected.\nRefresh the page if necessary.');
|
|
34
33
|
}
|
|
35
|
-
};
|
|
36
|
-
|
|
34
|
+
};
|
|
37
35
|
|
|
36
|
+
// Remember some state related to hot module replacement.
|
|
38
37
|
let isFirstCompilation = true;
|
|
39
38
|
let mostRecentCompilationHash = null;
|
|
40
39
|
let hasCompileErrors = false;
|
|
41
|
-
|
|
42
40
|
function clearOutdatedErrors() {
|
|
43
41
|
// Clean up outdated compile errors, if any.
|
|
44
42
|
// eslint-disable-next-line node/no-unsupported-features/node-builtins, no-console
|
|
@@ -48,154 +46,144 @@ function clearOutdatedErrors() {
|
|
|
48
46
|
console.clear();
|
|
49
47
|
}
|
|
50
48
|
}
|
|
51
|
-
}
|
|
52
|
-
|
|
49
|
+
}
|
|
53
50
|
|
|
51
|
+
// Successful compilation.
|
|
54
52
|
function handleSuccess() {
|
|
55
53
|
clearOutdatedErrors();
|
|
56
54
|
const isHotUpdate = !isFirstCompilation;
|
|
57
55
|
isFirstCompilation = false;
|
|
58
|
-
hasCompileErrors = false;
|
|
56
|
+
hasCompileErrors = false;
|
|
59
57
|
|
|
58
|
+
// Attempt to apply hot updates or reload.
|
|
60
59
|
if (isHotUpdate) {
|
|
61
60
|
tryApplyUpdates();
|
|
62
61
|
}
|
|
63
|
-
}
|
|
64
|
-
|
|
62
|
+
}
|
|
65
63
|
|
|
64
|
+
// Compilation with warnings (e.g. ESLint).
|
|
66
65
|
function handleWarnings(warnings) {
|
|
67
66
|
clearOutdatedErrors();
|
|
68
67
|
const isHotUpdate = !isFirstCompilation;
|
|
69
68
|
isFirstCompilation = false;
|
|
70
69
|
hasCompileErrors = false;
|
|
71
|
-
|
|
72
70
|
function printWarnings() {
|
|
73
71
|
// Print warnings to the console.
|
|
74
72
|
const formatted = (0, _format.formatWebpackMessages)({
|
|
75
73
|
warnings,
|
|
76
74
|
errors: []
|
|
77
75
|
});
|
|
78
|
-
|
|
79
76
|
if (typeof console !== 'undefined' && typeof console.warn === 'function') {
|
|
80
77
|
for (let i = 0; i < formatted.warnings.length; i++) {
|
|
81
78
|
if (i === 5) {
|
|
82
79
|
console.warn('There were more warnings in other files.\n' + 'You can find a complete log in the terminal.');
|
|
83
80
|
break;
|
|
84
81
|
}
|
|
85
|
-
|
|
86
82
|
console.warn((0, _stripAnsi.default)(formatted.warnings[i]));
|
|
87
83
|
}
|
|
88
84
|
}
|
|
89
85
|
}
|
|
86
|
+
printWarnings();
|
|
90
87
|
|
|
91
|
-
|
|
92
|
-
|
|
88
|
+
// Attempt to apply hot updates or reload.
|
|
93
89
|
if (isHotUpdate) {
|
|
94
90
|
tryApplyUpdates();
|
|
95
91
|
}
|
|
96
|
-
}
|
|
97
|
-
|
|
92
|
+
}
|
|
98
93
|
|
|
94
|
+
// Compilation with errors (e.g. syntax error or missing modules).
|
|
99
95
|
function handleErrors(errors) {
|
|
100
96
|
clearOutdatedErrors();
|
|
101
97
|
isFirstCompilation = false;
|
|
102
|
-
hasCompileErrors = true;
|
|
98
|
+
hasCompileErrors = true;
|
|
103
99
|
|
|
100
|
+
// "Massage" webpack messages.
|
|
104
101
|
const formatted = (0, _format.formatWebpackMessages)({
|
|
105
102
|
errors,
|
|
106
103
|
warnings: []
|
|
107
|
-
});
|
|
104
|
+
});
|
|
108
105
|
|
|
106
|
+
// Also log them to the console.
|
|
109
107
|
if (typeof console !== 'undefined' && typeof console.error === 'function') {
|
|
110
108
|
for (const error of formatted.errors) {
|
|
111
109
|
console.error((0, _stripAnsi.default)(error));
|
|
112
110
|
}
|
|
113
|
-
}
|
|
114
|
-
// We will reload on next success instead.
|
|
115
|
-
|
|
116
|
-
} // There is a newer version of the code available.
|
|
111
|
+
}
|
|
117
112
|
|
|
113
|
+
// Do not attempt to reload now.
|
|
114
|
+
// We will reload on next success instead.
|
|
115
|
+
}
|
|
118
116
|
|
|
117
|
+
// There is a newer version of the code available.
|
|
119
118
|
function handleAvailableHash(hash) {
|
|
120
119
|
// Update last known compilation hash.
|
|
121
120
|
mostRecentCompilationHash = hash;
|
|
122
|
-
}
|
|
123
|
-
|
|
121
|
+
}
|
|
124
122
|
|
|
123
|
+
// Handle messages from the server.
|
|
125
124
|
connection.onmessage = function (e) {
|
|
126
125
|
const message = JSON.parse(e.data);
|
|
127
|
-
|
|
128
126
|
switch (message.type) {
|
|
129
127
|
case 'hash':
|
|
130
128
|
handleAvailableHash(message.data);
|
|
131
129
|
break;
|
|
132
|
-
|
|
133
130
|
case 'still-ok':
|
|
134
131
|
case 'ok':
|
|
135
132
|
handleSuccess();
|
|
136
133
|
break;
|
|
137
|
-
|
|
138
134
|
case 'content-changed':
|
|
139
135
|
// Triggered when a file from `contentBase` changed.
|
|
140
136
|
window.location.reload();
|
|
141
137
|
break;
|
|
142
|
-
|
|
143
138
|
case 'warnings':
|
|
144
139
|
handleWarnings(message.data);
|
|
145
140
|
break;
|
|
146
|
-
|
|
147
141
|
case 'errors':
|
|
148
142
|
handleErrors(message.data);
|
|
149
143
|
break;
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
144
|
+
default:
|
|
145
|
+
// Do nothing.
|
|
153
146
|
}
|
|
154
|
-
};
|
|
155
|
-
|
|
147
|
+
};
|
|
156
148
|
|
|
149
|
+
// Is there a newer version of this code available?
|
|
157
150
|
function isUpdateAvailable() {
|
|
158
151
|
// __webpack_hash__ is the hash of the current compilation.
|
|
159
152
|
// It's a global variable injected by webpack.
|
|
160
153
|
return mostRecentCompilationHash !== __webpack_hash__;
|
|
161
|
-
}
|
|
162
|
-
|
|
154
|
+
}
|
|
163
155
|
|
|
156
|
+
// webpack disallows updates in other states.
|
|
164
157
|
function canApplyUpdates() {
|
|
165
158
|
return module.hot.status() === 'idle';
|
|
166
|
-
}
|
|
167
|
-
|
|
159
|
+
}
|
|
168
160
|
|
|
161
|
+
// Attempt to update code on the fly, fall back to a hard reload.
|
|
169
162
|
function tryApplyUpdates() {
|
|
170
163
|
if (!module.hot) {
|
|
171
164
|
// HotModuleReplacementPlugin is not in webpack configuration.
|
|
172
165
|
window.location.reload();
|
|
173
166
|
return;
|
|
174
167
|
}
|
|
175
|
-
|
|
176
168
|
if (!isUpdateAvailable() || !canApplyUpdates()) {
|
|
177
169
|
return;
|
|
178
170
|
}
|
|
179
|
-
|
|
180
171
|
function handleApplyUpdates(err, updatedModules) {
|
|
181
172
|
const wantsForcedReload = err || !updatedModules || hadRuntimeError;
|
|
182
|
-
|
|
183
173
|
if (wantsForcedReload) {
|
|
184
174
|
window.location.reload();
|
|
185
175
|
return;
|
|
186
176
|
}
|
|
187
|
-
|
|
188
177
|
if (isUpdateAvailable()) {
|
|
189
178
|
// While we were updating, there was a new update! Do it again.
|
|
190
179
|
tryApplyUpdates();
|
|
191
180
|
}
|
|
192
|
-
}
|
|
193
|
-
|
|
181
|
+
}
|
|
194
182
|
|
|
195
|
-
|
|
196
|
-
/* autoApply */
|
|
197
|
-
true, handleApplyUpdates); // // webpack 2 returns a Promise instead of invoking a callback
|
|
183
|
+
// https://webpack.github.io/docs/hot-module-replacement.html#check
|
|
184
|
+
const result = module.hot.check( /* autoApply */true, handleApplyUpdates);
|
|
198
185
|
|
|
186
|
+
// // webpack 2 returns a Promise instead of invoking a callback
|
|
199
187
|
if (result !== null && result !== void 0 && result.then) {
|
|
200
188
|
result.then(updatedModules => {
|
|
201
189
|
handleApplyUpdates(null, updatedModules);
|