@modern-js/server 2.42.2 → 2.44.0
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/dist/cjs/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +1 -1
- package/dist/cjs/dev-tools/dev-middleware/index.js +2 -3
- package/dist/cjs/dev-tools/dev-middleware/socketServer.js +2 -3
- package/dist/cjs/dev-tools/watcher/index.js +2 -3
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/server/devServer.js +96 -144
- package/dist/cjs/server/devServerOld.js +352 -0
- package/dist/cjs/server/index.js +14 -3
- package/dist/cjs/server/workerSSRRender.js +1 -1
- package/dist/esm/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +1 -1
- package/dist/esm/dev-tools/dev-middleware/index.js +1 -2
- package/dist/esm/dev-tools/dev-middleware/socketServer.js +1 -2
- package/dist/esm/dev-tools/watcher/index.js +1 -2
- package/dist/esm/index.js +2 -1
- package/dist/esm/server/devServer.js +195 -268
- package/dist/esm/server/devServerOld.js +579 -0
- package/dist/esm/server/index.js +21 -2
- package/dist/esm/server/workerSSRRender.js +1 -1
- package/dist/esm-node/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +1 -1
- package/dist/esm-node/dev-tools/dev-middleware/index.js +2 -3
- package/dist/esm-node/dev-tools/dev-middleware/socketServer.js +2 -3
- package/dist/esm-node/dev-tools/watcher/index.js +2 -3
- package/dist/esm-node/index.js +2 -1
- package/dist/esm-node/server/devServer.js +97 -145
- package/dist/esm-node/server/devServerOld.js +318 -0
- package/dist/esm-node/server/index.js +12 -2
- package/dist/esm-node/server/workerSSRRender.js +1 -1
- package/dist/types/dev-tools/dev-middleware/index.d.ts +2 -0
- package/dist/types/dev-tools/dev-middleware/socketServer.d.ts +2 -0
- package/dist/types/dev-tools/https/index.d.ts +1 -0
- package/dist/types/dev-tools/mock/getMockData.d.ts +2 -0
- package/dist/types/index.d.ts +4 -4
- package/dist/types/server/devServer.d.ts +10 -8
- package/dist/types/server/devServerOld.d.ts +37 -0
- package/dist/types/server/index.d.ts +4 -1
- package/dist/types/server/workerSSRRender.d.ts +2 -1
- package/dist/types/types.d.ts +10 -0
- package/package.json +12 -10
package/dist/esm-node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DevServer as Server } from "./server";
|
|
1
|
+
import { DevServer as Server, DevServerForRsbuild as ServerForRsbuild } from "./server";
|
|
2
2
|
var src_default = (options) => {
|
|
3
3
|
if (options == null) {
|
|
4
4
|
throw new Error("can not start server without options");
|
|
@@ -8,5 +8,6 @@ var src_default = (options) => {
|
|
|
8
8
|
};
|
|
9
9
|
export {
|
|
10
10
|
Server,
|
|
11
|
+
ServerForRsbuild,
|
|
11
12
|
src_default as default
|
|
12
13
|
};
|
|
@@ -3,17 +3,42 @@ import { createServer } from "http";
|
|
|
3
3
|
import path from "path";
|
|
4
4
|
import { createServer as createHttpsServer } from "https";
|
|
5
5
|
import { API_DIR, SERVER_BUNDLE_DIRECTORY, SERVER_DIR, SHARED_DIR, LOADABLE_STATS_FILE } from "@modern-js/utils";
|
|
6
|
-
import {
|
|
6
|
+
import { ModernServer, AGGRED_DIR, createRenderHandler } from "@modern-js/prod-server";
|
|
7
7
|
import { merge as deepMerge } from "@modern-js/utils/lodash";
|
|
8
|
+
import { fileReader } from "@modern-js/runtime-utils/fileReader";
|
|
8
9
|
import { getDefaultDevOptions } from "../constants";
|
|
9
10
|
import { createMockHandler } from "../dev-tools/mock";
|
|
10
11
|
import { enableRegister } from "../dev-tools/register";
|
|
11
12
|
import Watcher, { mergeWatchOptions } from "../dev-tools/watcher";
|
|
12
|
-
import DevMiddleware from "../dev-tools/dev-middleware";
|
|
13
13
|
import { workerSSRRender } from "./workerSSRRender";
|
|
14
|
+
const transformToRsbuildServerOptions = (dev) => {
|
|
15
|
+
var _dev_devMiddleware, _dev_before, _dev_after;
|
|
16
|
+
const rsbuildOptions = {
|
|
17
|
+
hmr: Boolean(dev.hot),
|
|
18
|
+
client: dev.client,
|
|
19
|
+
writeToDisk: (_dev_devMiddleware = dev.devMiddleware) === null || _dev_devMiddleware === void 0 ? void 0 : _dev_devMiddleware.writeToDisk,
|
|
20
|
+
compress: dev.compress,
|
|
21
|
+
headers: dev.headers,
|
|
22
|
+
historyApiFallback: dev.historyApiFallback,
|
|
23
|
+
proxy: dev.proxy,
|
|
24
|
+
publicDir: false
|
|
25
|
+
};
|
|
26
|
+
if (((_dev_before = dev.before) === null || _dev_before === void 0 ? void 0 : _dev_before.length) || ((_dev_after = dev.after) === null || _dev_after === void 0 ? void 0 : _dev_after.length)) {
|
|
27
|
+
rsbuildOptions.setupMiddlewares = [
|
|
28
|
+
...dev.setupMiddlewares || [],
|
|
29
|
+
(middlewares) => {
|
|
30
|
+
middlewares.unshift(...dev.before || []);
|
|
31
|
+
middlewares.push(...dev.after || []);
|
|
32
|
+
}
|
|
33
|
+
];
|
|
34
|
+
} else if (dev.setupMiddlewares) {
|
|
35
|
+
rsbuildOptions.setupMiddlewares = dev.setupMiddlewares;
|
|
36
|
+
}
|
|
37
|
+
return rsbuildOptions;
|
|
38
|
+
};
|
|
14
39
|
class ModernDevServer extends ModernServer {
|
|
15
40
|
getDevOptions(options) {
|
|
16
|
-
const devOptions =
|
|
41
|
+
const devOptions = options.dev;
|
|
17
42
|
const defaultOptions = getDefaultDevOptions();
|
|
18
43
|
return deepMerge(defaultOptions, devOptions);
|
|
19
44
|
}
|
|
@@ -25,40 +50,39 @@ class ModernDevServer extends ModernServer {
|
|
|
25
50
|
});
|
|
26
51
|
});
|
|
27
52
|
}
|
|
28
|
-
applySetupMiddlewares() {
|
|
29
|
-
const setupMiddlewares = this.dev.setupMiddlewares || [];
|
|
30
|
-
const serverOptions = {
|
|
31
|
-
sockWrite: (type, data) => this.devMiddleware.sockWrite(type, data)
|
|
32
|
-
};
|
|
33
|
-
const befores = [];
|
|
34
|
-
const afters = [];
|
|
35
|
-
setupMiddlewares.forEach((handler) => {
|
|
36
|
-
handler({
|
|
37
|
-
unshift: (...handlers) => befores.unshift(...handlers),
|
|
38
|
-
push: (...handlers) => afters.push(...handlers)
|
|
39
|
-
}, serverOptions);
|
|
40
|
-
});
|
|
41
|
-
return {
|
|
42
|
-
befores,
|
|
43
|
-
afters
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
53
|
// Complete the preparation of services
|
|
47
54
|
async onInit(runner, app) {
|
|
48
55
|
this.runner = runner;
|
|
49
|
-
const { dev } = this;
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
const { dev, conf } = this;
|
|
57
|
+
const isUseStreamingSSR = (routes) => routes === null || routes === void 0 ? void 0 : routes.some((r) => r.isStream === true);
|
|
58
|
+
const isUseSSRPreload = () => {
|
|
59
|
+
const { server: { ssr, ssrByEntries } } = conf;
|
|
60
|
+
const checkUsePreload = (ssr2) => typeof ssr2 === "object" && Boolean(ssr2.preload);
|
|
61
|
+
return checkUsePreload(ssr) || Object.values(ssrByEntries || {}).some((ssr2) => checkUsePreload(ssr2));
|
|
62
|
+
};
|
|
63
|
+
const { middlewares: rsbuildMiddlewares, close, onUpgrade } = (
|
|
64
|
+
// https://github.com/web-infra-dev/rsbuild/blob/32fbb85e22158d5c4655505ce75e3452ce22dbb1/packages/shared/src/types/server.ts#L112
|
|
65
|
+
await this.getMiddlewares({
|
|
66
|
+
...transformToRsbuildServerOptions(this.dev),
|
|
67
|
+
compress: !isUseStreamingSSR(this.getRoutes()) && !isUseSSRPreload() && dev.compress,
|
|
68
|
+
htmlFallback: false,
|
|
69
|
+
publicDir: false
|
|
70
|
+
})
|
|
71
|
+
);
|
|
72
|
+
app.on("upgrade", onUpgrade);
|
|
73
|
+
this.rsbuild.onDevCompileDone(({ stats }) => {
|
|
74
|
+
if (stats.toJson({
|
|
75
|
+
all: false
|
|
76
|
+
}).name !== "server") {
|
|
77
|
+
this.onRepack({
|
|
78
|
+
routes: this.getRoutes()
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
await this.applyDefaultMiddlewares();
|
|
83
|
+
this.addMiddlewareHandler(rsbuildMiddlewares);
|
|
84
|
+
this.closeCb.push(close);
|
|
85
|
+
this.initFileReader();
|
|
62
86
|
await super.onInit(runner, app);
|
|
63
87
|
if (dev.watch) {
|
|
64
88
|
this.startWatcher();
|
|
@@ -68,6 +92,36 @@ class ModernDevServer extends ModernServer {
|
|
|
68
92
|
});
|
|
69
93
|
}
|
|
70
94
|
}
|
|
95
|
+
initFileReader() {
|
|
96
|
+
var _this_dev_devMiddleware, _this_dev;
|
|
97
|
+
let isInit = false;
|
|
98
|
+
if (((_this_dev = this.dev) === null || _this_dev === void 0 ? void 0 : (_this_dev_devMiddleware = _this_dev.devMiddleware) === null || _this_dev_devMiddleware === void 0 ? void 0 : _this_dev_devMiddleware.writeToDisk) === false) {
|
|
99
|
+
this.addHandler((ctx, next) => {
|
|
100
|
+
var _ctx_res_locals;
|
|
101
|
+
if (isInit) {
|
|
102
|
+
return next();
|
|
103
|
+
}
|
|
104
|
+
isInit = true;
|
|
105
|
+
if (!((_ctx_res_locals = ctx.res.locals) === null || _ctx_res_locals === void 0 ? void 0 : _ctx_res_locals.webpack)) {
|
|
106
|
+
fileReader.reset();
|
|
107
|
+
return next();
|
|
108
|
+
}
|
|
109
|
+
const { devMiddleware: webpackDevMid } = ctx.res.locals.webpack;
|
|
110
|
+
const { outputFileSystem } = webpackDevMid;
|
|
111
|
+
if (outputFileSystem) {
|
|
112
|
+
fileReader.reset(outputFileSystem);
|
|
113
|
+
} else {
|
|
114
|
+
fileReader.reset();
|
|
115
|
+
}
|
|
116
|
+
return next();
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async close() {
|
|
121
|
+
for (const cb of this.closeCb) {
|
|
122
|
+
await cb();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
71
125
|
// override the ModernServer renderHandler logic
|
|
72
126
|
getRenderHandler() {
|
|
73
127
|
if (this.useWorkerSSR) {
|
|
@@ -87,36 +141,8 @@ class ModernDevServer extends ModernServer {
|
|
|
87
141
|
}
|
|
88
142
|
return super.getRenderHandler();
|
|
89
143
|
}
|
|
90
|
-
async applyDefaultMiddlewares(
|
|
91
|
-
const { pwd
|
|
92
|
-
const isUseStreamingSSR = (routes) => routes === null || routes === void 0 ? void 0 : routes.some((r) => r.isStream === true);
|
|
93
|
-
const isUseSSRPreload = () => {
|
|
94
|
-
const { server: { ssr, ssrByEntries } } = conf;
|
|
95
|
-
const checkUsePreload = (ssr2) => typeof ssr2 === "object" && Boolean(ssr2.preload);
|
|
96
|
-
return checkUsePreload(ssr) || Object.values(ssrByEntries || {}).some((ssr2) => checkUsePreload(ssr2));
|
|
97
|
-
};
|
|
98
|
-
if (!isUseStreamingSSR(this.getRoutes()) && !isUseSSRPreload() && dev.compress) {
|
|
99
|
-
const { default: compression } = await import("http-compression");
|
|
100
|
-
this.addHandler((ctx, next) => {
|
|
101
|
-
compression({
|
|
102
|
-
gzip: true,
|
|
103
|
-
brotli: false
|
|
104
|
-
})(ctx.req, ctx.res, next);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
this.addHandler((ctx, next) => {
|
|
108
|
-
ctx.res.setHeader("Access-Control-Allow-Origin", "*");
|
|
109
|
-
if (ctx.path.includes("hot-update")) {
|
|
110
|
-
ctx.res.setHeader("Access-Control-Allow-Credentials", "false");
|
|
111
|
-
}
|
|
112
|
-
const confHeaders = dev.headers;
|
|
113
|
-
if (confHeaders) {
|
|
114
|
-
for (const [key, value] of Object.entries(confHeaders)) {
|
|
115
|
-
ctx.res.setHeader(key, value);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
next();
|
|
119
|
-
});
|
|
144
|
+
async applyDefaultMiddlewares() {
|
|
145
|
+
const { pwd } = this;
|
|
120
146
|
this.mockHandler = createMockHandler({
|
|
121
147
|
pwd
|
|
122
148
|
});
|
|
@@ -127,43 +153,13 @@ class ModernDevServer extends ModernServer {
|
|
|
127
153
|
next();
|
|
128
154
|
}
|
|
129
155
|
});
|
|
130
|
-
if (dev.proxy) {
|
|
131
|
-
const { handlers, handleUpgrade } = createProxyHandler(dev.proxy);
|
|
132
|
-
app && handleUpgrade(app);
|
|
133
|
-
handlers.forEach((handler) => {
|
|
134
|
-
this.addHandler(handler);
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
devMiddleware.init(app);
|
|
138
|
-
devMiddleware.on("change", (stats) => {
|
|
139
|
-
if (stats.toJson({
|
|
140
|
-
all: false
|
|
141
|
-
}).name !== "server") {
|
|
142
|
-
this.onRepack({
|
|
143
|
-
routes: this.getRoutes()
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
this.addHandler((ctx, next) => {
|
|
148
|
-
const { req, res } = ctx;
|
|
149
|
-
if (devMiddleware.middleware) {
|
|
150
|
-
devMiddleware.middleware(req, res, next);
|
|
151
|
-
} else {
|
|
152
|
-
next();
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
if (dev.historyApiFallback) {
|
|
156
|
-
const { default: connectHistoryApiFallback } = await import("connect-history-api-fallback");
|
|
157
|
-
const historyApiFallbackMiddleware = connectHistoryApiFallback(typeof dev.historyApiFallback === "boolean" ? {} : dev.historyApiFallback);
|
|
158
|
-
this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
|
|
159
|
-
}
|
|
160
156
|
}
|
|
161
157
|
onRepack(options = {}) {
|
|
162
158
|
if (Array.isArray(options.routes)) {
|
|
163
159
|
this.router.reset(this.filterRoutes(options.routes));
|
|
164
160
|
}
|
|
165
161
|
this.cleanSSRCache();
|
|
166
|
-
|
|
162
|
+
fileReader.reset();
|
|
167
163
|
this.runner.repack();
|
|
168
164
|
super.onRepack(options);
|
|
169
165
|
}
|
|
@@ -180,32 +176,6 @@ class ModernDevServer extends ModernServer {
|
|
|
180
176
|
}
|
|
181
177
|
warmupSSRBundle() {
|
|
182
178
|
}
|
|
183
|
-
initReader() {
|
|
184
|
-
var _this_dev_devMiddleware, _this_dev;
|
|
185
|
-
let isInit = false;
|
|
186
|
-
if (this.devMiddleware && ((_this_dev = this.dev) === null || _this_dev === void 0 ? void 0 : (_this_dev_devMiddleware = _this_dev.devMiddleware) === null || _this_dev_devMiddleware === void 0 ? void 0 : _this_dev_devMiddleware.writeToDisk) === false) {
|
|
187
|
-
this.addHandler((ctx, next) => {
|
|
188
|
-
if (isInit) {
|
|
189
|
-
return next();
|
|
190
|
-
}
|
|
191
|
-
isInit = true;
|
|
192
|
-
if (!ctx.res.locals.webpack) {
|
|
193
|
-
this.reader.init();
|
|
194
|
-
return next();
|
|
195
|
-
}
|
|
196
|
-
const { devMiddleware: webpackDevMid } = ctx.res.locals.webpack;
|
|
197
|
-
const { outputFileSystem } = webpackDevMid;
|
|
198
|
-
if (outputFileSystem) {
|
|
199
|
-
this.reader.init(outputFileSystem);
|
|
200
|
-
} else {
|
|
201
|
-
this.reader.init();
|
|
202
|
-
}
|
|
203
|
-
return next();
|
|
204
|
-
});
|
|
205
|
-
} else {
|
|
206
|
-
super.initReader();
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
179
|
async onServerChange({ filepath, event }) {
|
|
210
180
|
const { pwd } = this;
|
|
211
181
|
const { mock } = AGGRED_DIR;
|
|
@@ -240,28 +210,10 @@ class ModernDevServer extends ModernServer {
|
|
|
240
210
|
});
|
|
241
211
|
}
|
|
242
212
|
setupStaticMiddleware(_) {
|
|
243
|
-
return async (
|
|
213
|
+
return async (_context, next) => {
|
|
244
214
|
return next();
|
|
245
215
|
};
|
|
246
216
|
}
|
|
247
|
-
async setupBeforeDevMiddleware() {
|
|
248
|
-
const { runner, conf, dev } = this;
|
|
249
|
-
const setupMids = dev.before || [];
|
|
250
|
-
const pluginMids = await runner.beforeDevServer(conf);
|
|
251
|
-
return [
|
|
252
|
-
...setupMids,
|
|
253
|
-
...pluginMids
|
|
254
|
-
].flat();
|
|
255
|
-
}
|
|
256
|
-
async setupAfterDevMiddleware() {
|
|
257
|
-
const { runner, conf, dev } = this;
|
|
258
|
-
const setupMids = dev.after || [];
|
|
259
|
-
const pluginMids = await runner.afterDevServer(conf);
|
|
260
|
-
return [
|
|
261
|
-
...pluginMids,
|
|
262
|
-
...setupMids
|
|
263
|
-
].flat();
|
|
264
|
-
}
|
|
265
217
|
cleanSSRCache() {
|
|
266
218
|
const { distDir } = this;
|
|
267
219
|
const bundles = this.router.getBundles();
|
|
@@ -317,16 +269,16 @@ class ModernDevServer extends ModernServer {
|
|
|
317
269
|
_define_property(this, "dev", void 0);
|
|
318
270
|
_define_property(this, "useWorkerSSR", void 0);
|
|
319
271
|
_define_property(this, "appContext", void 0);
|
|
320
|
-
_define_property(this, "
|
|
272
|
+
_define_property(this, "getMiddlewares", void 0);
|
|
273
|
+
_define_property(this, "rsbuild", void 0);
|
|
321
274
|
_define_property(this, "watcher", void 0);
|
|
275
|
+
_define_property(this, "closeCb", []);
|
|
322
276
|
this.appContext = options.appContext;
|
|
323
277
|
this.workDir = this.pwd;
|
|
324
278
|
this.useWorkerSSR = Boolean(options.useWorkerSSR);
|
|
325
279
|
this.dev = this.getDevOptions(options);
|
|
326
|
-
this.
|
|
327
|
-
|
|
328
|
-
devMiddleware: options.devMiddleware
|
|
329
|
-
});
|
|
280
|
+
this.getMiddlewares = options.getMiddlewares;
|
|
281
|
+
this.rsbuild = options.rsbuild;
|
|
330
282
|
enableRegister(this.pwd, this.conf);
|
|
331
283
|
}
|
|
332
284
|
}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
|
+
import { createServer } from "http";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { createServer as createHttpsServer } from "https";
|
|
5
|
+
import { API_DIR, SERVER_BUNDLE_DIRECTORY, SERVER_DIR, SHARED_DIR, LOADABLE_STATS_FILE } from "@modern-js/utils";
|
|
6
|
+
import { createProxyHandler, ModernServer, AGGRED_DIR, createRenderHandler } from "@modern-js/prod-server";
|
|
7
|
+
import { merge as deepMerge } from "@modern-js/utils/lodash";
|
|
8
|
+
import { fileReader } from "@modern-js/runtime-utils/fileReader";
|
|
9
|
+
import { getDefaultDevOptions } from "../constants";
|
|
10
|
+
import { createMockHandler } from "../dev-tools/mock";
|
|
11
|
+
import { enableRegister } from "../dev-tools/register";
|
|
12
|
+
import Watcher, { mergeWatchOptions } from "../dev-tools/watcher";
|
|
13
|
+
import DevMiddleware from "../dev-tools/dev-middleware";
|
|
14
|
+
import { workerSSRRender } from "./workerSSRRender";
|
|
15
|
+
class ModernDevServer extends ModernServer {
|
|
16
|
+
getDevOptions(options) {
|
|
17
|
+
const devOptions = typeof options.dev === "boolean" ? {} : options.dev;
|
|
18
|
+
const defaultOptions = getDefaultDevOptions();
|
|
19
|
+
return deepMerge(defaultOptions, devOptions);
|
|
20
|
+
}
|
|
21
|
+
addMiddlewareHandler(handlers) {
|
|
22
|
+
handlers.forEach((handler) => {
|
|
23
|
+
this.addHandler((ctx, next) => {
|
|
24
|
+
const { req, res } = ctx;
|
|
25
|
+
return handler(req, res, next);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
applySetupMiddlewares() {
|
|
30
|
+
const setupMiddlewares = this.dev.setupMiddlewares || [];
|
|
31
|
+
const serverOptions = {
|
|
32
|
+
sockWrite: (type, data) => this.devMiddleware.sockWrite(type, data)
|
|
33
|
+
};
|
|
34
|
+
const befores = [];
|
|
35
|
+
const afters = [];
|
|
36
|
+
setupMiddlewares.forEach((handler) => {
|
|
37
|
+
handler({
|
|
38
|
+
unshift: (...handlers) => befores.unshift(...handlers),
|
|
39
|
+
push: (...handlers) => afters.push(...handlers)
|
|
40
|
+
}, serverOptions);
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
befores,
|
|
44
|
+
afters
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Complete the preparation of services
|
|
48
|
+
async onInit(runner, app) {
|
|
49
|
+
this.runner = runner;
|
|
50
|
+
const { dev } = this;
|
|
51
|
+
const { befores, afters } = this.applySetupMiddlewares();
|
|
52
|
+
const beforeHandlers = this.dev.before || [];
|
|
53
|
+
this.addMiddlewareHandler([
|
|
54
|
+
...beforeHandlers,
|
|
55
|
+
...befores
|
|
56
|
+
]);
|
|
57
|
+
await this.applyDefaultMiddlewares(app);
|
|
58
|
+
const afterHandlers = this.dev.after || [];
|
|
59
|
+
this.addMiddlewareHandler([
|
|
60
|
+
...afters,
|
|
61
|
+
...afterHandlers
|
|
62
|
+
]);
|
|
63
|
+
this.initFileReader();
|
|
64
|
+
await super.onInit(runner, app);
|
|
65
|
+
if (dev.watch) {
|
|
66
|
+
this.startWatcher();
|
|
67
|
+
app.on("close", async () => {
|
|
68
|
+
var _this_watcher;
|
|
69
|
+
await ((_this_watcher = this.watcher) === null || _this_watcher === void 0 ? void 0 : _this_watcher.close());
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// override the ModernServer renderHandler logic
|
|
74
|
+
getRenderHandler() {
|
|
75
|
+
if (this.useWorkerSSR) {
|
|
76
|
+
var _this_conf_server, _conf_security;
|
|
77
|
+
const { distDir, staticGenerate, conf, metaName } = this;
|
|
78
|
+
const ssrConfig = (_this_conf_server = this.conf.server) === null || _this_conf_server === void 0 ? void 0 : _this_conf_server.ssr;
|
|
79
|
+
const forceCSR = typeof ssrConfig === "object" ? ssrConfig.forceCSR : false;
|
|
80
|
+
return createRenderHandler({
|
|
81
|
+
ssrRender: workerSSRRender,
|
|
82
|
+
distDir,
|
|
83
|
+
staticGenerate,
|
|
84
|
+
conf,
|
|
85
|
+
forceCSR,
|
|
86
|
+
nonce: (_conf_security = conf.security) === null || _conf_security === void 0 ? void 0 : _conf_security.nonce,
|
|
87
|
+
metaName
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return super.getRenderHandler();
|
|
91
|
+
}
|
|
92
|
+
initFileReader() {
|
|
93
|
+
var _this_dev_devMiddleware, _this_dev;
|
|
94
|
+
let isInit = false;
|
|
95
|
+
if (((_this_dev = this.dev) === null || _this_dev === void 0 ? void 0 : (_this_dev_devMiddleware = _this_dev.devMiddleware) === null || _this_dev_devMiddleware === void 0 ? void 0 : _this_dev_devMiddleware.writeToDisk) === false) {
|
|
96
|
+
this.addHandler((ctx, next) => {
|
|
97
|
+
var _ctx_res_locals;
|
|
98
|
+
if (isInit) {
|
|
99
|
+
return next();
|
|
100
|
+
}
|
|
101
|
+
isInit = true;
|
|
102
|
+
if (!((_ctx_res_locals = ctx.res.locals) === null || _ctx_res_locals === void 0 ? void 0 : _ctx_res_locals.webpack)) {
|
|
103
|
+
fileReader.reset();
|
|
104
|
+
return next();
|
|
105
|
+
}
|
|
106
|
+
const { devMiddleware: webpackDevMid } = ctx.res.locals.webpack;
|
|
107
|
+
const { outputFileSystem } = webpackDevMid;
|
|
108
|
+
if (outputFileSystem) {
|
|
109
|
+
fileReader.reset(outputFileSystem);
|
|
110
|
+
} else {
|
|
111
|
+
fileReader.reset();
|
|
112
|
+
}
|
|
113
|
+
return next();
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async applyDefaultMiddlewares(app) {
|
|
118
|
+
const { pwd, dev, devMiddleware, conf } = this;
|
|
119
|
+
const isUseStreamingSSR = (routes) => routes === null || routes === void 0 ? void 0 : routes.some((r) => r.isStream === true);
|
|
120
|
+
const isUseSSRPreload = () => {
|
|
121
|
+
const { server: { ssr, ssrByEntries } } = conf;
|
|
122
|
+
const checkUsePreload = (ssr2) => typeof ssr2 === "object" && Boolean(ssr2.preload);
|
|
123
|
+
return checkUsePreload(ssr) || Object.values(ssrByEntries || {}).some((ssr2) => checkUsePreload(ssr2));
|
|
124
|
+
};
|
|
125
|
+
if (!isUseStreamingSSR(this.getRoutes()) && !isUseSSRPreload() && dev.compress) {
|
|
126
|
+
const { default: compression } = await import("http-compression");
|
|
127
|
+
this.addHandler((ctx, next) => {
|
|
128
|
+
compression({
|
|
129
|
+
gzip: true,
|
|
130
|
+
brotli: false
|
|
131
|
+
})(ctx.req, ctx.res, next);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
this.addHandler((ctx, next) => {
|
|
135
|
+
ctx.res.setHeader("Access-Control-Allow-Origin", "*");
|
|
136
|
+
if (ctx.path.includes("hot-update")) {
|
|
137
|
+
ctx.res.setHeader("Access-Control-Allow-Credentials", "false");
|
|
138
|
+
}
|
|
139
|
+
const confHeaders = dev.headers;
|
|
140
|
+
if (confHeaders) {
|
|
141
|
+
for (const [key, value] of Object.entries(confHeaders)) {
|
|
142
|
+
ctx.res.setHeader(key, value);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
next();
|
|
146
|
+
});
|
|
147
|
+
this.mockHandler = createMockHandler({
|
|
148
|
+
pwd
|
|
149
|
+
});
|
|
150
|
+
this.addHandler((ctx, next) => {
|
|
151
|
+
if (this.mockHandler) {
|
|
152
|
+
this.mockHandler(ctx, next);
|
|
153
|
+
} else {
|
|
154
|
+
next();
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
if (dev.proxy) {
|
|
158
|
+
const { handlers, handleUpgrade } = createProxyHandler(dev.proxy);
|
|
159
|
+
app && handleUpgrade(app);
|
|
160
|
+
handlers.forEach((handler) => {
|
|
161
|
+
this.addHandler(handler);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
devMiddleware.init(app);
|
|
165
|
+
devMiddleware.on("change", (stats) => {
|
|
166
|
+
if (stats.toJson({
|
|
167
|
+
all: false
|
|
168
|
+
}).name !== "server") {
|
|
169
|
+
this.onRepack({
|
|
170
|
+
routes: this.getRoutes()
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
this.addHandler((ctx, next) => {
|
|
175
|
+
const { req, res } = ctx;
|
|
176
|
+
if (devMiddleware.middleware) {
|
|
177
|
+
devMiddleware.middleware(req, res, next);
|
|
178
|
+
} else {
|
|
179
|
+
next();
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
if (dev.historyApiFallback) {
|
|
183
|
+
const { default: connectHistoryApiFallback } = await import("connect-history-api-fallback");
|
|
184
|
+
const historyApiFallbackMiddleware = connectHistoryApiFallback(typeof dev.historyApiFallback === "boolean" ? {} : dev.historyApiFallback);
|
|
185
|
+
this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
onRepack(options = {}) {
|
|
189
|
+
if (Array.isArray(options.routes)) {
|
|
190
|
+
this.router.reset(this.filterRoutes(options.routes));
|
|
191
|
+
}
|
|
192
|
+
this.cleanSSRCache();
|
|
193
|
+
fileReader.reset();
|
|
194
|
+
this.runner.repack();
|
|
195
|
+
super.onRepack(options);
|
|
196
|
+
}
|
|
197
|
+
async createHTTPServer(handler) {
|
|
198
|
+
const { dev } = this;
|
|
199
|
+
const devHttpsOption = typeof dev === "object" && dev.https;
|
|
200
|
+
if (devHttpsOption) {
|
|
201
|
+
const { genHttpsOptions } = require("../dev-tools/https");
|
|
202
|
+
const httpsOptions = await genHttpsOptions(devHttpsOption, this.pwd);
|
|
203
|
+
return createHttpsServer(httpsOptions, handler);
|
|
204
|
+
} else {
|
|
205
|
+
return createServer(handler);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
warmupSSRBundle() {
|
|
209
|
+
}
|
|
210
|
+
async onServerChange({ filepath, event }) {
|
|
211
|
+
const { pwd } = this;
|
|
212
|
+
const { mock } = AGGRED_DIR;
|
|
213
|
+
const mockPath = path.normalize(path.join(pwd, mock));
|
|
214
|
+
this.runner.reset();
|
|
215
|
+
if (filepath.startsWith(mockPath)) {
|
|
216
|
+
this.mockHandler = createMockHandler({
|
|
217
|
+
pwd
|
|
218
|
+
});
|
|
219
|
+
} else {
|
|
220
|
+
try {
|
|
221
|
+
const success = this.runner.onApiChange([
|
|
222
|
+
{
|
|
223
|
+
filename: filepath,
|
|
224
|
+
event
|
|
225
|
+
}
|
|
226
|
+
]);
|
|
227
|
+
if (success !== true) {
|
|
228
|
+
await super.onServerChange({
|
|
229
|
+
filepath
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
} catch (e) {
|
|
233
|
+
this.logger.error(e);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
createContext(req, res) {
|
|
238
|
+
return super.createContext(req, res, {
|
|
239
|
+
etag: true,
|
|
240
|
+
metaName: this.metaName
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
setupStaticMiddleware(_) {
|
|
244
|
+
return async (context, next) => {
|
|
245
|
+
return next();
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
cleanSSRCache() {
|
|
249
|
+
const { distDir } = this;
|
|
250
|
+
const bundles = this.router.getBundles();
|
|
251
|
+
bundles.forEach((bundle) => {
|
|
252
|
+
const filepath = path.join(distDir, bundle);
|
|
253
|
+
if (require.cache[filepath]) {
|
|
254
|
+
delete require.cache[filepath];
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
const loadable = path.join(distDir, LOADABLE_STATS_FILE);
|
|
258
|
+
if (require.cache[loadable]) {
|
|
259
|
+
delete require.cache[loadable];
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
startWatcher() {
|
|
263
|
+
var _this_conf_server;
|
|
264
|
+
const { pwd, distDir, appContext } = this;
|
|
265
|
+
const { mock } = AGGRED_DIR;
|
|
266
|
+
const apiDir = (appContext === null || appContext === void 0 ? void 0 : appContext.apiDirectory) || API_DIR;
|
|
267
|
+
const sharedDir = (appContext === null || appContext === void 0 ? void 0 : appContext.sharedDirectory) || SHARED_DIR;
|
|
268
|
+
const defaultWatched = [
|
|
269
|
+
`${mock}/**/*`,
|
|
270
|
+
`${SERVER_DIR}/**/*`,
|
|
271
|
+
`${apiDir}/**`,
|
|
272
|
+
`${sharedDir}/**/*`,
|
|
273
|
+
`${distDir}/${SERVER_BUNDLE_DIRECTORY}/*-server-loaders.js`
|
|
274
|
+
];
|
|
275
|
+
const watchOptions = mergeWatchOptions((_this_conf_server = this.conf.server) === null || _this_conf_server === void 0 ? void 0 : _this_conf_server.watchOptions);
|
|
276
|
+
const defaultWatchedPaths = defaultWatched.map((p) => {
|
|
277
|
+
const finalPath = path.isAbsolute(p) ? p : path.join(pwd, p);
|
|
278
|
+
return path.normalize(finalPath);
|
|
279
|
+
});
|
|
280
|
+
const watcher = new Watcher();
|
|
281
|
+
watcher.createDepTree();
|
|
282
|
+
watcher.listen(defaultWatchedPaths, watchOptions, (filepath, event) => {
|
|
283
|
+
if (filepath.includes("-server-loaders.js")) {
|
|
284
|
+
delete require.cache[filepath];
|
|
285
|
+
return;
|
|
286
|
+
} else {
|
|
287
|
+
watcher.updateDepTree();
|
|
288
|
+
watcher.cleanDepCache(filepath);
|
|
289
|
+
}
|
|
290
|
+
this.onServerChange({
|
|
291
|
+
filepath,
|
|
292
|
+
event
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
this.watcher = watcher;
|
|
296
|
+
}
|
|
297
|
+
constructor(options) {
|
|
298
|
+
super(options);
|
|
299
|
+
_define_property(this, "mockHandler", null);
|
|
300
|
+
_define_property(this, "dev", void 0);
|
|
301
|
+
_define_property(this, "useWorkerSSR", void 0);
|
|
302
|
+
_define_property(this, "appContext", void 0);
|
|
303
|
+
_define_property(this, "devMiddleware", void 0);
|
|
304
|
+
_define_property(this, "watcher", void 0);
|
|
305
|
+
this.appContext = options.appContext;
|
|
306
|
+
this.workDir = this.pwd;
|
|
307
|
+
this.useWorkerSSR = Boolean(options.useWorkerSSR);
|
|
308
|
+
this.dev = this.getDevOptions(options);
|
|
309
|
+
this.devMiddleware = new DevMiddleware({
|
|
310
|
+
dev: this.dev,
|
|
311
|
+
devMiddleware: options.devMiddleware
|
|
312
|
+
});
|
|
313
|
+
enableRegister(this.pwd, this.conf);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
export {
|
|
317
|
+
ModernDevServer
|
|
318
|
+
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Server } from "@modern-js/prod-server";
|
|
2
|
-
import { ModernDevServer } from "./
|
|
2
|
+
import { ModernDevServer } from "./devServerOld";
|
|
3
|
+
import { ModernDevServer as ModernDevServerForRsbuild } from "./devServer";
|
|
3
4
|
const createDevServer = (options) => {
|
|
4
5
|
return new ModernDevServer(options);
|
|
5
6
|
};
|
|
@@ -11,6 +12,15 @@ class DevServer extends Server {
|
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
14
|
}
|
|
15
|
+
class DevServerForRsbuild extends Server {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
super(options);
|
|
18
|
+
if (options.dev) {
|
|
19
|
+
this.serverImpl = (options2) => new ModernDevServerForRsbuild(options2);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
14
23
|
export {
|
|
15
|
-
DevServer
|
|
24
|
+
DevServer,
|
|
25
|
+
DevServerForRsbuild
|
|
16
26
|
};
|
|
@@ -3,7 +3,7 @@ import { mime } from "@modern-js/utils";
|
|
|
3
3
|
const PORT = 9230;
|
|
4
4
|
async function workerSSRRender(ctx, renderOptions, _runner) {
|
|
5
5
|
const { headers, params } = ctx;
|
|
6
|
-
const { urlPath } = renderOptions;
|
|
6
|
+
const { urlPath } = renderOptions.route;
|
|
7
7
|
const url = `http://0.0.0.0:${PORT}/${urlPath}`;
|
|
8
8
|
const resposne = await axios.get(url, {
|
|
9
9
|
timeout: 5e3,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node/http" />
|
|
4
|
+
/// <reference types="@modern-js/prod-server/src/type" />
|
|
3
5
|
import { Server } from 'http';
|
|
4
6
|
import { EventEmitter } from 'events';
|
|
5
7
|
import { DevServerOptions, DevMiddlewareAPI, DevMiddleware as CustomDevMiddleware } from '../../types';
|