Skip to content

Commit 04583d0

Browse files
refactor: lazy run dev middleware
1 parent fa56eb1 commit 04583d0

File tree

2 files changed

+52
-38
lines changed

2 files changed

+52
-38
lines changed

lib/Server.js

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,11 @@ const schema = require("./options.json");
201201
*/
202202

203203
/**
204-
* @typedef {{ name?: string, path?: string, middleware: MiddlewareHandler } | MiddlewareHandler } Middleware
204+
* @typedef {{ name?: string, path?: string, middleware: MiddlewareHandler }} MiddlewareObject
205+
*/
206+
207+
/**
208+
* @typedef {MiddlewareObject | MiddlewareHandler } Middleware
205209
*/
206210

207211
/** @typedef {import("net").Server | import("tls").Server} BasicServer */
@@ -1228,7 +1232,6 @@ class Server {
12281232
if (!certificateExists) {
12291233
this.logger.info("Generating SSL certificate...");
12301234

1231-
// @ts-ignore
12321235
const selfsigned = require("selfsigned");
12331236
const attributes = [{ name: "commonName", value: "localhost" }];
12341237
const pems = selfsigned.generate(attributes, {
@@ -1987,18 +1990,9 @@ class Server {
19871990
});
19881991
}
19891992

1990-
const webpackDevMiddleware = require("webpack-dev-middleware");
1991-
1992-
// middleware for serving webpack bundle
1993-
/** @type {import("webpack-dev-middleware").Middleware<Request, Response>}*/
1994-
const devMiddleware = webpackDevMiddleware(
1995-
this.compiler,
1996-
this.options.devMiddleware,
1997-
);
1998-
19991993
middlewares.push({
20001994
name: "webpack-dev-middleware",
2001-
middleware: devMiddleware,
1995+
middleware: /** @type {MiddlewareHandler} */ (this.middleware),
20021996
});
20031997

20041998
// Should be after `webpack-dev-middleware`, otherwise other middlewares might rewrite response
@@ -2024,9 +2018,7 @@ class Server {
20242018
);
20252019

20262020
// Express send Etag and other headers by default, so let's keep them for compatibility reasons
2027-
// @ts-ignore
20282021
if (typeof res.sendFile === "function") {
2029-
// @ts-ignore
20302022
res.sendFile(clientPath);
20312023
return;
20322024
}
@@ -2328,6 +2320,7 @@ class Server {
23282320
name: "http-proxy-middleware",
23292321
middleware: handler,
23302322
});
2323+
23312324
// Also forward error requests to the proxy so it can handle them.
23322325
middlewares.push({
23332326
name: "http-proxy-middleware-error-handler",
@@ -2345,7 +2338,7 @@ class Server {
23452338

23462339
middlewares.push({
23472340
name: "webpack-dev-middleware",
2348-
middleware: devMiddleware,
2341+
middleware: /** @type {MiddlewareHandler} */ (this.middleware),
23492342
});
23502343
}
23512344

@@ -2402,7 +2395,7 @@ class Server {
24022395
// it is able to handle '/index.html' request after redirect
24032396
middlewares.push({
24042397
name: "webpack-dev-middleware",
2405-
middleware: devMiddleware,
2398+
middleware: /** @type {MiddlewareHandler} */ (this.middleware),
24062399
});
24072400

24082401
if (staticOptions.length > 0) {
@@ -2479,16 +2472,31 @@ class Server {
24792472
middlewares = this.options.setupMiddlewares(middlewares, this);
24802473
}
24812474

2482-
const foundDevMiddleware = middlewares.find(
2483-
(item) => item.name === "webpack-dev-middleware",
2484-
);
2475+
// Lazy init webpack dev middleware
2476+
const lazyInitDevMiddleware = () => {
2477+
if (!this.middleware) {
2478+
const webpackDevMiddleware = require("webpack-dev-middleware");
2479+
2480+
// middleware for serving webpack bundle
2481+
/** @type {import("webpack-dev-middleware").API<Request, Response>} */
2482+
this.middleware = webpackDevMiddleware(
2483+
this.compiler,
2484+
this.options.devMiddleware,
2485+
);
2486+
}
2487+
2488+
return this.middleware;
2489+
};
2490+
2491+
for (const i of middlewares) {
2492+
if (i.name === "webpack-dev-middleware") {
2493+
const item = /** @type {MiddlewareObject} */ (i);
24852494

2486-
// TODO make it lazy
2487-
/** @type {import("webpack-dev-middleware").API<Request, Response> | undefined} */
2488-
this.middleware = foundDevMiddleware
2489-
? /** @type {any} */ (foundDevMiddleware).middleware
2490-
: // eslint-disable-next-line no-undefined
2491-
undefined;
2495+
if (typeof item.middleware === "undefined") {
2496+
item.middleware = lazyInitDevMiddleware();
2497+
}
2498+
}
2499+
}
24922500

24932501
for (const middleware of middlewares) {
24942502
if (typeof middleware === "function") {
@@ -2761,14 +2769,11 @@ class Server {
27612769
*/
27622770
this.bonjour = new Bonjour();
27632771
this.bonjour.publish({
2764-
// @ts-expect-error
27652772
name: `Webpack Dev Server ${os.hostname()}:${this.options.port}`,
2766-
// @ts-expect-error
27672773
port: /** @type {number} */ (this.options.port),
2768-
// @ts-expect-error
27692774
type,
27702775
subtypes: ["webpack"],
2771-
.../** @type {BonjourOptions} */ (this.options.bonjour),
2776+
.../** @type {Partial<BonjourOptions>} */ (this.options.bonjour),
27722777
});
27732778
}
27742779

types/lib/Server.d.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,9 +1278,18 @@ declare class Server<
12781278
* @returns {void}
12791279
*/
12801280
private setupMiddlewares;
1281-
/** @type {import("webpack-dev-middleware").API<Request, Response> | undefined} */
1281+
/** @type {import("webpack-dev-middleware").API<Request, Response>} */
12821282
middleware:
1283-
| import("webpack-dev-middleware").API<Request, Response>
1283+
| import("webpack-dev-middleware").API<
1284+
import("express").Request<
1285+
import("express-serve-static-core").ParamsDictionary,
1286+
any,
1287+
any,
1288+
qs.ParsedQs,
1289+
Record<string, any>
1290+
>,
1291+
import("express").Response<any, Record<string, any>>
1292+
>
12841293
| undefined;
12851294
/**
12861295
* @private
@@ -1453,6 +1462,7 @@ declare namespace Server {
14531462
ClientConfiguration,
14541463
Headers,
14551464
MiddlewareHandler,
1465+
MiddlewareObject,
14561466
Middleware,
14571467
BasicServer,
14581468
Configuration,
@@ -1681,13 +1691,12 @@ type MiddlewareHandler<
16811691
> = T extends ExpressApplication
16821692
? ExpressRequestHandler | ExpressErrorRequestHandler
16831693
: HandleFunction;
1684-
type Middleware =
1685-
| {
1686-
name?: string;
1687-
path?: string;
1688-
middleware: MiddlewareHandler;
1689-
}
1690-
| MiddlewareHandler;
1694+
type MiddlewareObject = {
1695+
name?: string;
1696+
path?: string;
1697+
middleware: MiddlewareHandler;
1698+
};
1699+
type Middleware = MiddlewareObject | MiddlewareHandler;
16911700
type BasicServer = import("net").Server | import("tls").Server;
16921701
type Configuration<
16931702
A extends BasicApplication = import("express").Application,

0 commit comments

Comments
 (0)