Skip to content

Commit 8a31a9a

Browse files
refactor: code
1 parent 2543cd7 commit 8a31a9a

File tree

9 files changed

+305
-77
lines changed

9 files changed

+305
-77
lines changed

examples/setup-middlewares/README.md

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,22 @@ module.exports = {
1313
throw new Error("webpack-dev-server is not defined");
1414
}
1515

16-
const sendResponses = () => {
17-
devServer.app.get("/setup-middleware/some/path", (_, response) => {
18-
response.send("setup-middlewares option GET");
19-
});
20-
};
21-
22-
middlewares.push(sendResponses());
16+
devServer.app.get("/setup-middleware/some/path", (_, response) => {
17+
response.send("setup-middlewares option GET");
18+
});
19+
20+
middlewares.push({
21+
name: "hello-world-test-one",
22+
// `path` is optional
23+
path: "/foo/bar",
24+
middleware: (req, res) => {
25+
res.send("Foo Bar!");
26+
},
27+
});
28+
29+
middlewares.push((req, res) => {
30+
res.send("Hello World!");
31+
});
2332

2433
return middlewares;
2534
},

examples/setup-middlewares/webpack.config.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,22 @@ module.exports = setup({
1313
throw new Error("webpack-dev-server is not defined");
1414
}
1515

16-
const sendResponses = () => {
17-
devServer.app.get("/setup-middleware/some/path", (_, response) => {
18-
response.send("setup-middlewares option GET");
19-
});
20-
};
16+
devServer.app.get("/setup-middleware/some/path", (_, response) => {
17+
response.send("setup-middlewares option GET");
18+
});
2119

22-
middlewares.push(sendResponses());
20+
middlewares.push({
21+
name: "hello-world-test-one",
22+
// `path` is optional
23+
path: "/foo/bar",
24+
middleware: (req, res) => {
25+
res.send("Foo Bar!");
26+
},
27+
});
28+
29+
middlewares.push((req, res) => {
30+
res.send("Hello World!");
31+
});
2332

2433
return middlewares;
2534
},

lib/Server.js

Lines changed: 95 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,7 @@ class Server {
13221322
this.setupDevMiddleware();
13231323
// Should be after `webpack-dev-middleware`, otherwise other middlewares might rewrite response
13241324
this.setupBuiltInRoutes();
1325+
this.setupWatchStaticFiles();
13251326
this.setupWatchFiles();
13261327
this.setupMiddlewares();
13271328
this.createServer();
@@ -1484,22 +1485,14 @@ class Server {
14841485
});
14851486
}
14861487

1487-
setupStaticFeature() {
1488-
const staticMiddlewares = [];
1489-
1490-
this.options.static.forEach((staticOption) => {
1491-
staticOption.publicPath.forEach((publicPath) => {
1492-
staticMiddlewares.push({
1493-
publicPath,
1494-
middleware: express.static(
1495-
staticOption.directory,
1496-
staticOption.staticOptions
1497-
),
1498-
});
1488+
setupWatchStaticFiles() {
1489+
if (this.options.static.length > 0) {
1490+
this.options.static.forEach((staticOption) => {
1491+
if (staticOption.watch) {
1492+
this.watchFiles(staticOption.directory, staticOption.watch);
1493+
}
14991494
});
1500-
});
1501-
1502-
return staticMiddlewares;
1495+
}
15031496
}
15041497

15051498
setupWatchFiles() {
@@ -1514,17 +1507,30 @@ class Server {
15141507

15151508
setupMiddlewares() {
15161509
let middlewares = [];
1510+
15171511
// compress is placed last and uses unshift so that it will be the first middleware used
15181512
if (this.options.compress) {
1519-
const compress = require("compression");
1520-
middlewares.push(compress());
1513+
const compression = require("compression");
1514+
1515+
middlewares.push({ name: "compression", middleware: compression() });
15211516
}
15221517

1523-
if (typeof this.options.onBeforeSetupMiddleware === "function") {
1524-
middlewares.push(this.options.onBeforeSetupMiddleware(this));
1518+
if (this.options.onBeforeSetupMiddleware) {
1519+
this.options.onBeforeSetupMiddleware(this);
15251520
}
15261521

1527-
middlewares.push(this.setHeaders.bind(this), this.middleware);
1522+
if (typeof this.options.headers !== "undefined") {
1523+
middlewares.push({
1524+
name: "set-headers",
1525+
path: "*",
1526+
middleware: this.setHeaders.bind(this),
1527+
});
1528+
}
1529+
1530+
middlewares.push({
1531+
name: "webpack-dev-middleware",
1532+
middleware: this.middleware,
1533+
});
15281534

15291535
if (this.options.proxy) {
15301536
const { createProxyMiddleware } = require("http-proxy-middleware");
@@ -1573,7 +1579,7 @@ class Server {
15731579
this.webSocketProxies.push(proxyMiddleware);
15741580
}
15751581

1576-
const handle = async (req, res, next) => {
1582+
const handler = async (req, res, next) => {
15771583
if (typeof proxyConfigOrCallback === "function") {
15781584
const newProxyConfig = proxyConfigOrCallback(req, res, next);
15791585

@@ -1607,17 +1613,40 @@ class Server {
16071613
}
16081614
};
16091615

1610-
middlewares.push(handle);
1616+
middlewares.push({
1617+
name: "http-proxy-middleware",
1618+
middleware: handler,
1619+
});
16111620
// Also forward error requests to the proxy so it can handle them.
1612-
middlewares.push((error, req, res, next) => handle(req, res, next));
1621+
middlewares.push({
1622+
name: "http-proxy-middleware-error-handler",
1623+
middleware: (error, req, res, next) => handler(req, res, next),
1624+
});
1625+
});
1626+
1627+
middlewares.push({
1628+
name: "webpack-dev-middleware",
1629+
middleware: this.middleware,
16131630
});
16141631
}
16151632

16161633
if (this.options.static) {
1617-
middlewares = [...middlewares, ...this.setupStaticFeature()];
1634+
this.options.static.forEach((staticOption) => {
1635+
staticOption.publicPath.forEach((publicPath) => {
1636+
middlewares.push({
1637+
name: "express-static",
1638+
path: publicPath,
1639+
middleware: express.static(
1640+
staticOption.directory,
1641+
staticOption.staticOptions
1642+
),
1643+
});
1644+
});
1645+
});
16181646
}
16191647

16201648
if (this.options.historyApiFallback) {
1649+
const connectHistoryApiFallback = require("connect-history-api-fallback");
16211650
const { historyApiFallback } = this.options;
16221651

16231652
if (
@@ -1631,13 +1660,31 @@ class Server {
16311660
}
16321661

16331662
// Fall back to /index.html if nothing else matches.
1634-
middlewares.push(
1635-
require("connect-history-api-fallback")(historyApiFallback),
1636-
this.middleware
1637-
);
1663+
middlewares.push({
1664+
name: "connect-history-api-fallback",
1665+
middleware: connectHistoryApiFallback(historyApiFallback),
1666+
});
1667+
1668+
// include our middleware to ensure
1669+
// it is able to handle '/index.html' request after redirect
1670+
middlewares.push({
1671+
name: "webpack-dev-middleware",
1672+
middleware: this.middleware,
1673+
});
16381674

16391675
if (this.options.static) {
1640-
middlewares = [...middlewares, ...this.setupStaticFeature()];
1676+
this.options.static.forEach((staticOption) => {
1677+
staticOption.publicPath.forEach((publicPath) => {
1678+
middlewares.push({
1679+
name: "express-static",
1680+
path: publicPath,
1681+
middleware: express.static(
1682+
staticOption.directory,
1683+
staticOption.staticOptions
1684+
),
1685+
});
1686+
});
1687+
});
16411688
}
16421689
}
16431690

@@ -1648,7 +1695,8 @@ class Server {
16481695
staticOption.publicPath.forEach((publicPath) => {
16491696
if (staticOption.serveIndex) {
16501697
middlewares.push({
1651-
publicPath,
1698+
name: "serve-index",
1699+
path: publicPath,
16521700
middleware: (req, res, next) => {
16531701
// serve-index doesn't fallthrough non-get/head request to next middleware
16541702
if (req.method !== "GET" && req.method !== "HEAD") {
@@ -1664,36 +1712,33 @@ class Server {
16641712
});
16651713
}
16661714
});
1667-
1668-
if (staticOption.watch) {
1669-
middlewares.push(
1670-
this.watchFiles(staticOption.directory, staticOption.watch)
1671-
);
1672-
}
16731715
});
16741716
}
16751717

16761718
if (this.options.magicHtml) {
1677-
middlewares.push(this.serveMagicHtml.bind(this));
1719+
middlewares.push({
1720+
name: "serve-magic-html",
1721+
middleware: this.serveMagicHtml.bind(this),
1722+
});
16781723
}
16791724

1680-
if (typeof this.options.onAfterSetupMiddleware === "function") {
1681-
middlewares.push(this.options.onAfterSetupMiddleware(this));
1725+
if (this.options.onAfterSetupMiddleware) {
1726+
this.options.onAfterSetupMiddleware(this);
16821727
}
16831728

16841729
if (typeof this.options.setupMiddlewares === "function") {
16851730
middlewares = this.options.setupMiddlewares(middlewares, this);
16861731
}
16871732

1688-
for (const middleware of middlewares) {
1689-
if (typeof middleware === "function") {
1733+
middlewares.forEach((middleware) => {
1734+
if (typeof middleware.path !== "undefined") {
1735+
this.app.use(middleware.path, middleware.middleware);
1736+
} else if (typeof middleware === "function") {
16901737
this.app.use(middleware);
1738+
} else {
1739+
this.app.use(middleware.middleware);
16911740
}
1692-
1693-
if (typeof middleware === "object") {
1694-
this.app.use(middleware.publicPath, middleware.middleware);
1695-
}
1696-
}
1741+
});
16971742
}
16981743

16991744
createServer() {
@@ -2124,6 +2169,10 @@ class Server {
21242169
}
21252170

21262171
serveMagicHtml(req, res, next) {
2172+
if (req.method !== "GET" && req.method !== "HEAD") {
2173+
return next();
2174+
}
2175+
21272176
this.middleware.waitUntilValid(() => {
21282177
const _path = req.path;
21292178

test/e2e/__snapshots__/headers.test.js.snap.webpack4

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ key2=value2"
2121

2222
exports[`headers option as a function should handle GET request with headers as a function: response status 1`] = `200`;
2323

24+
exports[`headers option as a string and support HEAD request should handle HEAD request with headers: console messages 1`] = `Array []`;
25+
26+
exports[`headers option as a string and support HEAD request should handle HEAD request with headers: page errors 1`] = `Array []`;
27+
28+
exports[`headers option as a string and support HEAD request should handle HEAD request with headers: response headers x-foo 1`] = `"dev-server headers"`;
29+
30+
exports[`headers option as a string and support HEAD request should handle HEAD request with headers: response status 1`] = `200`;
31+
2432
exports[`headers option as a string should handle GET request with headers: console messages 1`] = `Array []`;
2533

2634
exports[`headers option as a string should handle GET request with headers: page errors 1`] = `Array []`;

test/e2e/__snapshots__/headers.test.js.snap.webpack5

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ key2=value2"
2121

2222
exports[`headers option as a function should handle GET request with headers as a function: response status 1`] = `200`;
2323

24+
exports[`headers option as a string and support HEAD request should handle HEAD request with headers: console messages 1`] = `Array []`;
25+
26+
exports[`headers option as a string and support HEAD request should handle HEAD request with headers: page errors 1`] = `Array []`;
27+
28+
exports[`headers option as a string and support HEAD request should handle HEAD request with headers: response headers x-foo 1`] = `"dev-server headers"`;
29+
30+
exports[`headers option as a string and support HEAD request should handle HEAD request with headers: response status 1`] = `200`;
31+
2432
exports[`headers option as a string should handle GET request with headers: console messages 1`] = `Array []`;
2533

2634
exports[`headers option as a string should handle GET request with headers: page errors 1`] = `Array []`;

test/e2e/__snapshots__/setup-middlewares.test.js.snap.webpack4

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,28 @@ exports[`setupMiddlewares option should handle GET request to /setup-middleware/
66

77
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response headers content-type 1`] = `"text/html; charset=utf-8"`;
88

9+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response headers content-type 2`] = `"text/html; charset=utf-8"`;
10+
11+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response headers content-type 3`] = `"text/html; charset=utf-8"`;
12+
13+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response headers content-type 4`] = `"text/html; charset=utf-8"`;
14+
915
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response status 1`] = `200`;
1016

17+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response status 2`] = `200`;
18+
19+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response status 3`] = `200`;
20+
21+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response status 4`] = `200`;
22+
1123
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response text 1`] = `"setup-middlewares option GET"`;
1224

25+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response text 2`] = `"Hello World with path!"`;
26+
27+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response text 3`] = `"Hello World without path!"`;
28+
29+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response text 4`] = `"Hello World as function!"`;
30+
1331
exports[`setupMiddlewares option should handle POST request to /setup-middleware/some/path route: console messages 1`] = `Array []`;
1432

1533
exports[`setupMiddlewares option should handle POST request to /setup-middleware/some/path route: page errors 1`] = `Array []`;

test/e2e/__snapshots__/setup-middlewares.test.js.snap.webpack5

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,28 @@ exports[`setupMiddlewares option should handle GET request to /setup-middleware/
66

77
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response headers content-type 1`] = `"text/html; charset=utf-8"`;
88

9+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response headers content-type 2`] = `"text/html; charset=utf-8"`;
10+
11+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response headers content-type 3`] = `"text/html; charset=utf-8"`;
12+
13+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response headers content-type 4`] = `"text/html; charset=utf-8"`;
14+
915
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response status 1`] = `200`;
1016

17+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response status 2`] = `200`;
18+
19+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response status 3`] = `200`;
20+
21+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response status 4`] = `200`;
22+
1123
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response text 1`] = `"setup-middlewares option GET"`;
1224

25+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response text 2`] = `"Hello World with path!"`;
26+
27+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response text 3`] = `"Hello World without path!"`;
28+
29+
exports[`setupMiddlewares option should handle GET request to /setup-middleware/some/path route: response text 4`] = `"Hello World as function!"`;
30+
1331
exports[`setupMiddlewares option should handle POST request to /setup-middleware/some/path route: console messages 1`] = `Array []`;
1432

1533
exports[`setupMiddlewares option should handle POST request to /setup-middleware/some/path route: page errors 1`] = `Array []`;

0 commit comments

Comments
 (0)