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