@modern-js/server 1.3.0 → 1.4.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.
Files changed (121) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/js/modern/dev-tools/babel/register.js +1 -0
  3. package/dist/js/modern/dev-tools/dev-server-plugin.js +1 -2
  4. package/dist/js/modern/dev-tools/mock/getMockData.js +24 -1
  5. package/dist/js/modern/dev-tools/mock/index.js +1 -26
  6. package/dist/js/modern/dev-tools/socket-server.js +4 -2
  7. package/dist/js/modern/dev-tools/watcher/index.js +6 -9
  8. package/dist/js/modern/dev-tools/watcher/stats-cache.js +32 -20
  9. package/dist/js/modern/libs/context/context.js +6 -0
  10. package/dist/js/modern/libs/hook-api/route.js +6 -4
  11. package/dist/js/modern/libs/render/index.js +1 -0
  12. package/dist/js/modern/libs/render/ssr.js +7 -2
  13. package/dist/js/modern/libs/route/index.js +0 -1
  14. package/dist/js/modern/libs/route/matcher.js +15 -3
  15. package/dist/js/modern/libs/route/route.js +1 -0
  16. package/dist/js/modern/server/dev-server/dev-server.js +18 -5
  17. package/dist/js/modern/server/index.js +5 -4
  18. package/dist/js/modern/server/modern-server-split.js +1 -1
  19. package/dist/js/modern/server/modern-server.js +9 -5
  20. package/dist/js/modern/utils.js +7 -0
  21. package/dist/js/node/dev-tools/babel/register.js +1 -0
  22. package/dist/js/node/dev-tools/dev-server-plugin.js +1 -2
  23. package/dist/js/node/dev-tools/mock/getMockData.js +29 -2
  24. package/dist/js/node/dev-tools/mock/index.js +5 -26
  25. package/dist/js/node/dev-tools/socket-server.js +4 -2
  26. package/dist/js/node/dev-tools/watcher/index.js +9 -7
  27. package/dist/js/node/dev-tools/watcher/stats-cache.js +33 -20
  28. package/dist/js/node/libs/context/context.js +6 -0
  29. package/dist/js/node/libs/hook-api/route.js +6 -4
  30. package/dist/js/node/libs/render/index.js +1 -0
  31. package/dist/js/node/libs/render/ssr.js +8 -2
  32. package/dist/js/node/libs/route/index.js +0 -1
  33. package/dist/js/node/libs/route/matcher.js +16 -3
  34. package/dist/js/node/libs/route/route.js +1 -0
  35. package/dist/js/node/server/dev-server/dev-server.js +20 -5
  36. package/dist/js/node/server/index.js +9 -6
  37. package/dist/js/node/server/modern-server-split.js +1 -1
  38. package/dist/js/node/server/modern-server.js +9 -5
  39. package/dist/js/node/utils.js +13 -2
  40. package/dist/types/dev-tools/mock/getMockData.d.ts +2 -1
  41. package/dist/types/dev-tools/socket-server.d.ts +1 -2
  42. package/dist/types/dev-tools/watcher/index.d.ts +3 -1
  43. package/dist/types/dev-tools/watcher/stats-cache.d.ts +3 -2
  44. package/dist/types/libs/context/context.d.ts +2 -0
  45. package/dist/types/libs/hook-api/route.d.ts +3 -2
  46. package/dist/types/libs/render/ssr.d.ts +1 -0
  47. package/dist/types/libs/route/matcher.d.ts +1 -1
  48. package/dist/types/libs/route/route.d.ts +1 -0
  49. package/dist/types/server/dev-server/dev-server-split.d.ts +3 -3
  50. package/dist/types/server/modern-server-split.d.ts +3 -3
  51. package/dist/types/server/modern-server.d.ts +1 -1
  52. package/dist/types/type.d.ts +6 -4
  53. package/dist/types/utils.d.ts +2 -1
  54. package/jest.config.js +1 -0
  55. package/package.json +12 -10
  56. package/tests/context.test.ts +12 -1
  57. package/tests/dev.test.ts +306 -7
  58. package/tests/fixtures/mock/exist/config/mock/index.ts +11 -0
  59. package/tests/fixtures/mock/zero/config/mock/index.ts +1 -0
  60. package/tests/fixtures/pure/tsconfig.json +0 -1
  61. package/tests/fixtures/route-spec/dynamic.json +13 -0
  62. package/tests/fixtures/ssr/bundle.js +5 -0
  63. package/tests/fixtures/watch/a.ts +3 -0
  64. package/tests/fixtures/watch/index.ts +5 -0
  65. package/tests/fixtures/watch/stats.txt +1 -0
  66. package/tests/hook.test.ts +1 -1
  67. package/tests/route.test.ts +26 -3
  68. package/tests/server.test.ts +19 -0
  69. package/tests/ssr.test.ts +34 -0
  70. package/tests/utils.test.ts +6 -0
  71. package/tests/watcher.test.ts +98 -0
  72. package/src/constants.ts +0 -26
  73. package/src/dev-tools/babel/register.ts +0 -37
  74. package/src/dev-tools/dev-server-plugin.ts +0 -48
  75. package/src/dev-tools/https/global.d.ts +0 -3
  76. package/src/dev-tools/https/index.ts +0 -12
  77. package/src/dev-tools/launch-editor/index.ts +0 -29
  78. package/src/dev-tools/mock/getMockData.ts +0 -109
  79. package/src/dev-tools/mock/index.ts +0 -63
  80. package/src/dev-tools/socket-server.ts +0 -192
  81. package/src/dev-tools/watcher/dependency-tree.ts +0 -94
  82. package/src/dev-tools/watcher/index.ts +0 -77
  83. package/src/dev-tools/watcher/stats-cache.ts +0 -53
  84. package/src/index.ts +0 -16
  85. package/src/libs/context/context.ts +0 -176
  86. package/src/libs/context/index.ts +0 -7
  87. package/src/libs/hook-api/route.ts +0 -38
  88. package/src/libs/hook-api/template.ts +0 -53
  89. package/src/libs/metrics.ts +0 -15
  90. package/src/libs/proxy.ts +0 -85
  91. package/src/libs/render/cache/__tests__/cache.fun.test.ts +0 -94
  92. package/src/libs/render/cache/__tests__/cache.test.ts +0 -240
  93. package/src/libs/render/cache/__tests__/cacheable.ts +0 -44
  94. package/src/libs/render/cache/__tests__/error-configuration.ts +0 -34
  95. package/src/libs/render/cache/__tests__/matched-cache.ts +0 -88
  96. package/src/libs/render/cache/index.ts +0 -75
  97. package/src/libs/render/cache/page-caches/index.ts +0 -11
  98. package/src/libs/render/cache/page-caches/lru.ts +0 -38
  99. package/src/libs/render/cache/spr.ts +0 -301
  100. package/src/libs/render/cache/type.ts +0 -59
  101. package/src/libs/render/cache/util.ts +0 -97
  102. package/src/libs/render/index.ts +0 -78
  103. package/src/libs/render/modern/browser-list.ts +0 -7
  104. package/src/libs/render/modern/index.ts +0 -41
  105. package/src/libs/render/modern/module.d.ts +0 -4
  106. package/src/libs/render/reader.ts +0 -119
  107. package/src/libs/render/ssr.ts +0 -62
  108. package/src/libs/render/static.ts +0 -52
  109. package/src/libs/render/type.ts +0 -38
  110. package/src/libs/route/index.ts +0 -77
  111. package/src/libs/route/matcher.ts +0 -93
  112. package/src/libs/route/route.ts +0 -32
  113. package/src/libs/serve-file.ts +0 -34
  114. package/src/server/dev-server/dev-server-split.ts +0 -41
  115. package/src/server/dev-server/dev-server.ts +0 -284
  116. package/src/server/dev-server/index.ts +0 -2
  117. package/src/server/index.ts +0 -163
  118. package/src/server/modern-server-split.ts +0 -97
  119. package/src/server/modern-server.ts +0 -636
  120. package/src/type.ts +0 -88
  121. package/src/utils.ts +0 -79
@@ -1,284 +0,0 @@
1
- import http, {
2
- Server,
3
- createServer,
4
- IncomingMessage,
5
- ServerResponse,
6
- } from 'http';
7
- import path from 'path';
8
- import { createServer as createHttpsServer } from 'https';
9
- import {
10
- API_DIR,
11
- HMR_SOCK_PATH,
12
- SERVER_DIR,
13
- SHARED_DIR,
14
- } from '@modern-js/utils';
15
- import type { MultiCompiler, Compiler } from 'webpack';
16
- import webpackDevMiddleware from 'webpack-dev-middleware';
17
- import { ModernServer } from '../modern-server';
18
- import { createMockHandler } from '../../dev-tools/mock';
19
- import { createProxyHandler, ProxyOptions } from '../../libs/proxy';
20
- import {
21
- DevServerOptions,
22
- ModernServerOptions,
23
- NextFunction,
24
- ServerHookRunner,
25
- ReadyOptions,
26
- } from '../../type';
27
- import SocketServer from '../../dev-tools/socket-server';
28
- import DevServerPlugin from '../../dev-tools/dev-server-plugin';
29
- import { ModernServerContext } from '../../libs/context';
30
- import { createLaunchEditorHandler } from '../../dev-tools/launch-editor';
31
- import { enableRegister } from '../../dev-tools/babel/register';
32
- import * as reader from '../../libs/render/reader';
33
- import Watcher from '../../dev-tools/watcher';
34
- import { AGGRED_DIR } from '../../constants';
35
-
36
- const DEFAULT_DEV_OPTIONS: DevServerOptions = {
37
- client: {
38
- port: '8080',
39
- overlay: false,
40
- logging: 'none',
41
- path: HMR_SOCK_PATH,
42
- host: 'localhost',
43
- },
44
- https: false,
45
- dev: { writeToDisk: true },
46
- watch: true,
47
- hot: true,
48
- liveReload: true,
49
- };
50
-
51
- export class ModernDevServer extends ModernServer {
52
- private devProxyHandler: ReturnType<typeof createProxyHandler> = null;
53
-
54
- private mockHandler: ReturnType<typeof createMockHandler> = null;
55
-
56
- private readonly dev: DevServerOptions;
57
-
58
- private readonly compiler?: MultiCompiler | Compiler;
59
-
60
- private socketServer!: SocketServer;
61
-
62
- private watcher!: Watcher;
63
-
64
- private devMiddleware!: webpackDevMiddleware.API<
65
- http.IncomingMessage,
66
- http.ServerResponse
67
- >;
68
-
69
- constructor(options: ModernServerOptions) {
70
- super(options);
71
-
72
- // set webpack compiler
73
- this.compiler = options.compiler!;
74
-
75
- // set dev server options, like webpack-dev-server
76
- this.dev =
77
- typeof options.dev === 'boolean'
78
- ? DEFAULT_DEV_OPTIONS
79
- : { ...DEFAULT_DEV_OPTIONS, ...options.dev };
80
-
81
- enableRegister(this.pwd, this.conf);
82
- }
83
-
84
- // Complete the preparation of services
85
- public async init(runner: ServerHookRunner) {
86
- const { conf, pwd, compiler } = this;
87
-
88
- // mock handler
89
- this.mockHandler = createMockHandler({ pwd });
90
- this.addHandler((ctx: ModernServerContext, next: NextFunction) => {
91
- ctx.res.setHeader('Access-Control-Allow-Origin', '*');
92
- ctx.res.setHeader('Access-Control-Allow-Credentials', 'false');
93
-
94
- if (this.mockHandler) {
95
- this.mockHandler(ctx, next);
96
- } else {
97
- next();
98
- }
99
- });
100
-
101
- // dev proxy handler, each proxy has own handler
102
- this.devProxyHandler = createProxyHandler(
103
- conf.tools?.devServer?.proxy as ProxyOptions,
104
- );
105
- if (this.devProxyHandler) {
106
- this.devProxyHandler.forEach(handler => {
107
- this.addHandler(handler);
108
- });
109
- }
110
-
111
- // do webpack build / plugin apply / socket server when pass compiler instance
112
- if (compiler) {
113
- // init socket server
114
- this.socketServer = new SocketServer(this.dev);
115
-
116
- // open file in edtor.
117
- this.addHandler(createLaunchEditorHandler());
118
-
119
- // setup compiler in server, also add dev-middleware to handler static file in memory
120
- const devMiddlewareHandler = this.setupCompiler(compiler);
121
- this.addHandler(devMiddlewareHandler);
122
- }
123
-
124
- await super.init(runner);
125
-
126
- // watch mock/ server/ api/ dir file change
127
- if (this.dev.watch) {
128
- this.startWatcher();
129
- }
130
- }
131
-
132
- public ready(options: ReadyOptions = {}) {
133
- // reset the routing management instance every times the service starts
134
- this.router.reset(
135
- this.filterRoutes(options.routes || this.presetRoutes || []),
136
- );
137
- this.cleanSSRCache();
138
-
139
- // reset static file
140
- reader.updateFile();
141
-
142
- this.runner.reset();
143
- }
144
-
145
- public onListening(app: Server) {
146
- this.socketServer?.prepare(app);
147
- }
148
-
149
- public async close() {
150
- super.close();
151
- await this.watcher.close();
152
- await new Promise<void>(resolve => {
153
- this.devMiddleware.close(() => {
154
- resolve();
155
- });
156
- });
157
- }
158
-
159
- public async createHTTPServer(
160
- handler: (
161
- req: IncomingMessage,
162
- res: ServerResponse,
163
- next?: () => void,
164
- ) => void,
165
- ) {
166
- const { dev } = this;
167
- const devHttpsOption = typeof dev === 'object' && dev.https;
168
- if (devHttpsOption) {
169
- const { genHttpsOptions } = require('../../dev-tools/https');
170
- const httpsOptions = await genHttpsOptions(devHttpsOption);
171
- return createHttpsServer(httpsOptions, handler);
172
- } else {
173
- return createServer(handler);
174
- }
175
- }
176
-
177
- // set up plugin to each compiler
178
- // register hooks for each compilation, update socket stats if recompiled
179
- // start dev middleware
180
- private setupCompiler(compiler: MultiCompiler | Compiler) {
181
- this.setupDevServerPlugin(compiler);
182
- this.setupHooks();
183
- return this.setupDevMiddleware(compiler);
184
- }
185
-
186
- private setupDevServerPlugin(compiler: MultiCompiler | Compiler) {
187
- const { dev: devConf } = this;
188
- if ((compiler as MultiCompiler).compilers) {
189
- (compiler as MultiCompiler).compilers.forEach(target => {
190
- if (target.name === 'client') {
191
- new DevServerPlugin(devConf).apply(target);
192
- }
193
- });
194
- } else {
195
- new DevServerPlugin(devConf).apply(compiler as Compiler);
196
- }
197
- }
198
-
199
- private setupHooks() {
200
- const invalidPlugin = () => {
201
- this.socketServer.sockWrite('invalid');
202
- };
203
-
204
- const addHooks = (compiler: Compiler) => {
205
- const { compile, invalid, done } = compiler.hooks;
206
-
207
- compile.tap('modern-dev-server', invalidPlugin);
208
- invalid.tap('modern-dev-server', invalidPlugin);
209
- done.tap('modern-dev-server', (stats: any) => {
210
- this.socketServer.updateStats(stats);
211
-
212
- // Reset only when client compile done
213
- if (stats.toJson({ all: false }).name === 'client') {
214
- this.ready({ routes: this.readRouteSpec() });
215
- }
216
- });
217
- };
218
-
219
- if ((this.compiler as MultiCompiler).compilers) {
220
- (this.compiler as MultiCompiler).compilers.forEach(addHooks);
221
- } else {
222
- addHooks(this.compiler as Compiler);
223
- }
224
- }
225
-
226
- private setupDevMiddleware(compiler: MultiCompiler | Compiler) {
227
- this.devMiddleware = webpackDevMiddleware(compiler, {
228
- publicPath: '/',
229
- writeToDisk: this.dev.dev.writeToDisk,
230
- stats: false,
231
- });
232
-
233
- return (ctx: ModernServerContext, next: NextFunction) => {
234
- const { req, res } = ctx;
235
- this.devMiddleware(req, res, next);
236
- };
237
- }
238
-
239
- private cleanSSRCache() {
240
- const { distDir } = this;
241
- const bundles = this.router.getBundles();
242
-
243
- bundles.forEach(bundle => {
244
- const filepath = path.join(distDir, bundle as string);
245
- if (require.cache[filepath]) {
246
- delete require.cache[filepath];
247
- }
248
- });
249
- }
250
-
251
- private startWatcher() {
252
- const { pwd } = this;
253
- const { mock } = AGGRED_DIR;
254
- const defaultWatched = [
255
- `${pwd}/${mock}/**/*`,
256
- `${pwd}/${SERVER_DIR}/**/*`,
257
- `${pwd}/${API_DIR}/!(typings)/**`,
258
- `${pwd}/${SHARED_DIR}/**/*`,
259
- ];
260
-
261
- const watcher = new Watcher();
262
- watcher.createDepTree();
263
-
264
- // 监听文件变动,如果有变动则给 client,也就是 start 启动的插件发消息
265
- watcher.listen(defaultWatched, (filepath: string) => {
266
- watcher.updateDepTree();
267
- watcher.cleanDepCache(filepath);
268
-
269
- this.runner.reset();
270
-
271
- if (filepath.startsWith(`${pwd}/${mock}`)) {
272
- this.mockHandler = createMockHandler({ pwd });
273
- } else {
274
- try {
275
- this.prepareFrameHandler();
276
- } catch (e) {
277
- this.logger.error(e as Error);
278
- }
279
- }
280
- });
281
-
282
- this.watcher = watcher;
283
- }
284
- }
@@ -1,2 +0,0 @@
1
- export { ModernAPIDevServer, ModernSSRDevServer } from './dev-server-split';
2
- export { ModernDevServer } from './dev-server';
@@ -1,163 +0,0 @@
1
- import { IncomingMessage, ServerResponse, Server as httpServer } from 'http';
2
- import path from 'path';
3
- import { serverManager } from '@modern-js/server-plugin';
4
- import { logger as defaultLogger } from '@modern-js/utils';
5
- import {
6
- AppContext,
7
- initAppContext,
8
- initAppDir,
9
- loadUserConfig,
10
- ConfigContext,
11
- UserConfig,
12
- } from '@modern-js/core';
13
- import { ModernServerOptions, ServerHookRunner, ReadyOptions } from '../type';
14
- import { metrics as defaultMetrics } from '../libs/metrics';
15
- import { ModernServer } from './modern-server';
16
- import type { ModernDevServer } from './dev-server';
17
- import {
18
- ModernAPIServer,
19
- ModernSSRServer,
20
- ModernWebServer,
21
- } from './modern-server-split';
22
-
23
- export class Server {
24
- public options: ModernServerOptions;
25
-
26
- private server!: ModernServer | ModernDevServer;
27
-
28
- private app!: httpServer;
29
-
30
- private runner!: ServerHookRunner;
31
-
32
- constructor(options: ModernServerOptions) {
33
- this.options = options;
34
- }
35
-
36
- public getRequestHandler() {
37
- return (req: IncomingMessage, res: ServerResponse, next?: () => void) => {
38
- const requestHandler = this.server.getRequestHandler();
39
- return requestHandler(req, res, next);
40
- };
41
- }
42
-
43
- public ready(readyOptions: ReadyOptions = {}) {
44
- this.server.ready(readyOptions);
45
- }
46
-
47
- public async init() {
48
- const { options } = this;
49
-
50
- options.logger = options.logger || defaultLogger;
51
- options.metrics = options.metrics || defaultMetrics;
52
-
53
- // initialize server
54
- if (options.dev) {
55
- this.server = this.createDevServer();
56
- } else {
57
- this.server = this.createProdServer();
58
- }
59
- // check if https is configured when start dev server
60
- this.app = await this.server.createHTTPServer(this.getRequestHandler());
61
-
62
- this.runner = await this.createHookRunner();
63
-
64
- // runner can only be used after server init
65
- await this.server.init(this.runner);
66
-
67
- return this;
68
- }
69
-
70
- public listen(port = 8080, listener: any) {
71
- this.app.listen(process.env.PORT || port, () => {
72
- if (listener) {
73
- listener();
74
- }
75
-
76
- this.listener(this.app);
77
- });
78
- }
79
-
80
- public listener(app: httpServer) {
81
- this.server.onListening(app);
82
- }
83
-
84
- public async close() {
85
- await this.server.close();
86
- await new Promise<void>(resolve =>
87
- this.app.close(() => {
88
- resolve();
89
- }),
90
- );
91
- }
92
-
93
- private createProdServer() {
94
- const { options } = this;
95
-
96
- if (options.apiOnly) {
97
- return new ModernAPIServer(options);
98
- } else if (options.ssrOnly) {
99
- return new ModernSSRServer(options);
100
- } else if (options.webOnly) {
101
- return new ModernWebServer(options);
102
- } else {
103
- return new ModernServer(options);
104
- }
105
- }
106
-
107
- private createDevServer() {
108
- const { options } = this;
109
- const {
110
- ModernAPIDevServer,
111
- ModernSSRDevServer,
112
- ModernDevServer,
113
- } = require('./dev-server');
114
-
115
- if (options.apiOnly) {
116
- return new ModernAPIDevServer(options);
117
- } else if (options.ssrOnly) {
118
- return new ModernSSRDevServer(options);
119
- } else {
120
- return new ModernDevServer(options);
121
- }
122
- }
123
-
124
- private async createHookRunner() {
125
- const { options } = this;
126
-
127
- options.plugins?.forEach(p => {
128
- serverManager.usePlugin(p);
129
- });
130
-
131
- const appContext = await this.initAppContext();
132
- serverManager.run(() => {
133
- ConfigContext.set(this.options.config as UserConfig);
134
- AppContext.set({
135
- ...appContext,
136
- distDirectory: path.join(
137
- options.pwd,
138
- options.config.output?.path || 'dist',
139
- ),
140
- });
141
- });
142
-
143
- return serverManager.init({});
144
- }
145
-
146
- private async initAppContext() {
147
- const appDirectory = await initAppDir();
148
-
149
- const loaded = await loadUserConfig(appDirectory);
150
-
151
- const plugins = this.options.plugins?.map(p => ({
152
- server: p,
153
- cli: undefined,
154
- }));
155
-
156
- const appContext = initAppContext(
157
- appDirectory,
158
- plugins || [],
159
- loaded.filePath,
160
- );
161
- return appContext;
162
- }
163
- }
@@ -1,97 +0,0 @@
1
- import { APIServerStartInput } from '@modern-js/server-plugin';
2
- import { mergeExtension } from '../utils';
3
- import { ModernRoute, ModernRouteInterface, RouteMatcher } from '../libs/route';
4
- import { ApiServerMode } from '../constants';
5
- import { ModernServerContext } from '../libs/context';
6
- import { ModernServer } from './modern-server';
7
-
8
- export class ModernSSRServer extends ModernServer {
9
- // Todo should not invoke any route hook in modernSSRServer
10
-
11
- protected async warmupSSRBundle() {
12
- // empty
13
- }
14
-
15
- protected verifyMatch(context: ModernServerContext, matched: RouteMatcher) {
16
- if (matched.generate().isApi) {
17
- this.render404(context);
18
- }
19
- }
20
-
21
- protected prepareAPIHandler(
22
- _m: ApiServerMode,
23
- _: APIServerStartInput['config'],
24
- ) {
25
- return null as any;
26
- }
27
-
28
- protected async prepareWebHandler(
29
- extension: ReturnType<typeof mergeExtension>,
30
- ) {
31
- return super.prepareWebHandler(extension);
32
- }
33
-
34
- // protected filterRoutes(routes: ModernRouteInterface[]) {
35
- // return routes.filter(route => route.entryName);
36
- // }
37
-
38
- protected async preServerInit() {
39
- // empty
40
- }
41
- }
42
-
43
- export class ModernAPIServer extends ModernServer {
44
- protected async emitRouteHook(_: string, _input: any) {
45
- // empty
46
- }
47
-
48
- protected async warmupSSRBundle() {
49
- // empty
50
- }
51
-
52
- protected prepareWebHandler(_: ReturnType<typeof mergeExtension>) {
53
- return null as any;
54
- }
55
-
56
- protected async prepareAPIHandler(
57
- mode: ApiServerMode,
58
- extension: APIServerStartInput['config'],
59
- ) {
60
- return super.prepareAPIHandler(mode, extension);
61
- }
62
-
63
- protected filterRoutes(routes: ModernRouteInterface[]) {
64
- return routes.filter(route => route.isApi);
65
- }
66
-
67
- protected async preServerInit() {
68
- // empty
69
- }
70
- }
71
-
72
- export class ModernWebServer extends ModernServer {
73
- protected async warmupSSRBundle() {
74
- // empty
75
- }
76
-
77
- protected async handleAPI(context: ModernServerContext) {
78
- const { proxyTarget } = this;
79
- if (!proxyTarget?.api) {
80
- this.proxy();
81
- } else {
82
- this.render404(context);
83
- }
84
- }
85
-
86
- protected async handleWeb(context: ModernServerContext, route: ModernRoute) {
87
- const { proxyTarget } = this;
88
-
89
- if (route.isSSR && proxyTarget?.ssr) {
90
- return this.proxy();
91
- } else {
92
- // if no proxyTarget but access web server, degradation to csr
93
- route.isSSR = false;
94
- return super.handleWeb(context, route);
95
- }
96
- }
97
- }