@modern-js/server 1.1.3 → 1.1.5-beta.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/CHANGELOG.md +19 -0
- package/dist/js/modern/dev-tools/babel/register.js +2 -2
- package/dist/js/modern/dev-tools/mock/getMockData.js +2 -2
- package/dist/js/modern/libs/context/context.js +15 -7
- package/dist/js/modern/libs/context/index.js +2 -2
- package/dist/js/modern/libs/{measure.js → metrics.js} +2 -2
- package/dist/js/modern/libs/proxy.js +2 -2
- package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +2 -2
- package/dist/js/modern/libs/render/cache/index.js +2 -2
- package/dist/js/modern/libs/render/index.js +6 -2
- package/dist/js/modern/libs/render/ssr.js +3 -2
- package/dist/js/modern/libs/route/route.js +1 -1
- package/dist/js/modern/server/dev-server/dev-server-split.js +2 -6
- package/dist/js/modern/server/dev-server/dev-server.js +11 -2
- package/dist/js/modern/server/dev-server/index.js +1 -1
- package/dist/js/modern/server/index.js +17 -15
- package/dist/js/modern/server/modern-server-split.js +55 -6
- package/dist/js/modern/server/modern-server.js +96 -56
- package/dist/js/modern/utils.js +9 -1
- package/dist/js/node/dev-tools/babel/register.js +2 -2
- package/dist/js/node/dev-tools/mock/getMockData.js +2 -2
- package/dist/js/node/libs/context/context.js +15 -7
- package/dist/js/node/libs/context/index.js +2 -2
- package/dist/js/node/libs/{measure.js → metrics.js} +3 -3
- package/dist/js/node/libs/proxy.js +2 -2
- package/dist/js/node/libs/render/cache/__tests__/cache.test.js +2 -2
- package/dist/js/node/libs/render/cache/index.js +2 -2
- package/dist/js/node/libs/render/index.js +6 -2
- package/dist/js/node/libs/render/ssr.js +3 -2
- package/dist/js/node/libs/route/route.js +1 -1
- package/dist/js/node/server/dev-server/dev-server-split.js +5 -9
- package/dist/js/node/server/dev-server/dev-server.js +11 -2
- package/dist/js/node/server/dev-server/index.js +4 -4
- package/dist/js/node/server/index.js +16 -14
- package/dist/js/node/server/modern-server-split.js +61 -9
- package/dist/js/node/server/modern-server.js +97 -57
- package/dist/js/node/utils.js +12 -2
- package/dist/types/libs/context/context.d.ts +5 -5
- package/dist/types/libs/context/index.d.ts +3 -3
- package/dist/types/libs/metrics.d.ts +3 -0
- package/dist/types/libs/render/index.d.ts +10 -1
- package/dist/types/libs/render/ssr.d.ts +2 -1
- package/dist/types/libs/render/type.d.ts +2 -21
- package/dist/types/libs/route/route.d.ts +2 -10
- package/dist/types/server/dev-server/dev-server-split.d.ts +3 -4
- package/dist/types/server/dev-server/index.d.ts +1 -1
- package/dist/types/server/modern-server-split.d.ts +15 -5
- package/dist/types/server/modern-server.d.ts +14 -7
- package/dist/types/type.d.ts +11 -5
- package/dist/types/utils.d.ts +2 -1
- package/package.json +5 -5
- package/src/libs/context/context.ts +12 -8
- package/src/libs/context/index.ts +3 -3
- package/src/libs/{measure.ts → metrics.ts} +3 -3
- package/src/libs/render/index.ts +21 -11
- package/src/libs/render/ssr.ts +5 -1
- package/src/libs/render/type.ts +3 -16
- package/src/libs/route/route.ts +4 -20
- package/src/server/dev-server/dev-server-split.ts +3 -7
- package/src/server/dev-server/dev-server.ts +14 -12
- package/src/server/dev-server/index.ts +1 -1
- package/src/server/index.ts +21 -14
- package/src/server/modern-server-split.ts +59 -7
- package/src/server/modern-server.ts +109 -64
- package/src/type.ts +12 -5
- package/src/utils.ts +14 -0
- package/dist/types/libs/measure.d.ts +0 -3
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
import { APIServerStartInput } from '@modern-js/server-plugin';
|
|
2
2
|
import { ModernServer } from './modern-server';
|
|
3
3
|
import { mergeExtension } from "../utils.d";
|
|
4
|
-
import { ModernRouteInterface } from "../libs/route";
|
|
4
|
+
import { ModernRoute, ModernRouteInterface, RouteMatcher } from "../libs/route";
|
|
5
5
|
import { ApiServerMode } from "../constants.d";
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
import { ModernServerContext } from "../libs/context";
|
|
7
|
+
export declare class ModernSSRServer extends ModernServer {
|
|
8
|
+
protected warmupSSRBundle(): Promise<void>;
|
|
9
|
+
protected verifyMatch(context: ModernServerContext, matched: RouteMatcher): void;
|
|
10
|
+
protected prepareAPIHandler(_m: ApiServerMode, _: APIServerStartInput['config']): any;
|
|
8
11
|
protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<import("@modern-js/server-plugin").Adapter>;
|
|
9
|
-
protected
|
|
12
|
+
protected preServerInit(): Promise<void>;
|
|
10
13
|
}
|
|
11
|
-
export declare class
|
|
14
|
+
export declare class ModernAPIServer extends ModernServer {
|
|
15
|
+
protected emitRouteHook(_: string, _input: any): Promise<void>;
|
|
16
|
+
protected warmupSSRBundle(): Promise<void>;
|
|
12
17
|
protected prepareWebHandler(_: ReturnType<typeof mergeExtension>): any;
|
|
13
18
|
protected prepareAPIHandler(mode: ApiServerMode, extension: APIServerStartInput['config']): Promise<import("@modern-js/server-plugin").Adapter>;
|
|
14
19
|
protected filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
|
|
15
20
|
protected preServerInit(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export declare class ModernWebServer extends ModernServer {
|
|
23
|
+
protected warmupSSRBundle(): Promise<void>;
|
|
24
|
+
protected handleAPI(context: ModernServerContext): Promise<void>;
|
|
25
|
+
protected handleWeb(context: ModernServerContext, route: ModernRoute): Promise<any>;
|
|
16
26
|
}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import { IncomingMessage, ServerResponse, Server } from 'http';
|
|
3
3
|
import { Adapter, APIServerStartInput } from '@modern-js/server-plugin';
|
|
4
4
|
import type { NormalizedConfig } from '@modern-js/core';
|
|
5
|
-
import { ModernServerOptions, NextFunction, ServerHookRunner,
|
|
6
|
-
import { RouteMatchManager, ModernRouteInterface } from
|
|
7
|
-
import { mergeExtension } from
|
|
5
|
+
import { ModernServerOptions, NextFunction, ServerHookRunner, Metrics, Logger, ReadyOptions } from "../type.d";
|
|
6
|
+
import { RouteMatchManager, ModernRouteInterface, ModernRoute, RouteMatcher } from "../libs/route";
|
|
7
|
+
import { mergeExtension } from "../utils.d";
|
|
8
8
|
import { ModernServerContext } from "../libs/context";
|
|
9
9
|
import { ApiServerMode } from "../constants.d";
|
|
10
10
|
declare type ModernServerHandler = (context: ModernServerContext, next: NextFunction) => Promise<void> | void;
|
|
@@ -19,7 +19,8 @@ export declare class ModernServer {
|
|
|
19
19
|
protected presetRoutes?: ModernRouteInterface[];
|
|
20
20
|
protected runner: ServerHookRunner;
|
|
21
21
|
protected readonly logger: Logger;
|
|
22
|
-
protected readonly
|
|
22
|
+
protected readonly metrics: Metrics;
|
|
23
|
+
protected readonly proxyTarget: ModernServerOptions['proxyTarget'];
|
|
23
24
|
private readonly isDev;
|
|
24
25
|
private staticFileHandler;
|
|
25
26
|
private routeRenderHandler;
|
|
@@ -35,7 +36,8 @@ export declare class ModernServer {
|
|
|
35
36
|
routes,
|
|
36
37
|
staticGenerate,
|
|
37
38
|
logger,
|
|
38
|
-
|
|
39
|
+
metrics,
|
|
40
|
+
proxyTarget
|
|
39
41
|
}: ModernServerOptions);
|
|
40
42
|
getRequestHandler(): (req: IncomingMessage, res: ServerResponse, next?: () => void) => void;
|
|
41
43
|
init(runner: ServerHookRunner): Promise<void>;
|
|
@@ -43,21 +45,26 @@ export declare class ModernServer {
|
|
|
43
45
|
onListening(_: Server): void;
|
|
44
46
|
close(): void;
|
|
45
47
|
createHTTPServer(handler: (req: IncomingMessage, res: ServerResponse, next?: () => void) => void): Promise<Server>;
|
|
46
|
-
protected warmupSSRBundle(): void;
|
|
47
48
|
protected readRouteSpec(): ModernRouteInterface[];
|
|
48
49
|
protected addHandler(handler: ModernServerHandler): void;
|
|
49
50
|
protected render404(context: ModernServerContext): void;
|
|
50
51
|
protected prepareFrameHandler(): Promise<void>;
|
|
52
|
+
protected proxy(): Promise<any>;
|
|
51
53
|
protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<Adapter>;
|
|
52
54
|
protected prepareAPIHandler(mode: ApiServerMode, extension: APIServerStartInput['config']): Promise<Adapter>;
|
|
53
55
|
protected filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
|
|
56
|
+
protected emitRouteHook(eventName: 'beforeMatch' | 'afterMatch' | 'beforeRender' | 'afterRender', input: any): Promise<any>;
|
|
57
|
+
protected warmupSSRBundle(): void;
|
|
54
58
|
protected preServerInit(): Promise<void>;
|
|
55
|
-
|
|
59
|
+
protected handleAPI(context: ModernServerContext): Promise<void>;
|
|
60
|
+
protected handleWeb(context: ModernServerContext, route: ModernRoute): Promise<import("@/type").RenderResult | null>;
|
|
61
|
+
protected verifyMatch(_c: ModernServerContext, _m: RouteMatcher): void;
|
|
56
62
|
private routeHandler;
|
|
57
63
|
private injectMicroFE;
|
|
58
64
|
private compose;
|
|
59
65
|
private requestHandler;
|
|
60
66
|
private onError;
|
|
61
67
|
private renderErrorPage;
|
|
68
|
+
private prepareFavicons;
|
|
62
69
|
}
|
|
63
70
|
export {};
|
package/dist/types/type.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type Webpack from 'webpack';
|
|
3
3
|
import { serverManager } from '@modern-js/server-plugin';
|
|
4
4
|
import type { NormalizedConfig } from '@modern-js/core';
|
|
5
|
-
import type {
|
|
5
|
+
import type { Metrics, Logger, NextFunction } from '@modern-js/types/server';
|
|
6
6
|
import { ModernRouteInterface } from './libs/route';
|
|
7
7
|
declare module '@modern-js/core' {
|
|
8
8
|
interface UserConfig {
|
|
@@ -23,6 +23,7 @@ export declare type DevServerOptions = {
|
|
|
23
23
|
dev: {
|
|
24
24
|
writeToDisk: boolean | ((filename: string) => boolean);
|
|
25
25
|
};
|
|
26
|
+
watch: boolean;
|
|
26
27
|
hot: boolean | string;
|
|
27
28
|
liveReload: boolean;
|
|
28
29
|
https?: boolean | {
|
|
@@ -35,17 +36,22 @@ export declare type ModernServerOptions = {
|
|
|
35
36
|
pwd: string;
|
|
36
37
|
config: NormalizedConfig;
|
|
37
38
|
plugins?: any[];
|
|
38
|
-
dev?: boolean | DevServerOptions
|
|
39
|
+
dev?: boolean | Partial<DevServerOptions>;
|
|
39
40
|
compiler?: Webpack.MultiCompiler | Webpack.Compiler;
|
|
40
41
|
routes?: ModernRouteInterface[];
|
|
41
42
|
staticGenerate?: boolean;
|
|
42
43
|
customServer?: boolean;
|
|
43
44
|
loggerOptions?: Record<string, string>;
|
|
44
|
-
|
|
45
|
+
metricsOptions?: Record<string, string>;
|
|
45
46
|
logger?: Logger;
|
|
46
|
-
|
|
47
|
+
metrics?: Metrics;
|
|
47
48
|
apiOnly?: boolean;
|
|
49
|
+
ssrOnly?: boolean;
|
|
48
50
|
webOnly?: boolean;
|
|
51
|
+
proxyTarget?: {
|
|
52
|
+
ssr?: string;
|
|
53
|
+
api?: string;
|
|
54
|
+
};
|
|
49
55
|
};
|
|
50
56
|
export declare type RenderResult = {
|
|
51
57
|
content: string | Buffer;
|
|
@@ -63,4 +69,4 @@ export declare type ServerHookRunner = Then<ReturnType<typeof serverManager.init
|
|
|
63
69
|
export declare type ReadyOptions = {
|
|
64
70
|
routes?: ModernRouteInterface[];
|
|
65
71
|
};
|
|
66
|
-
export type {
|
|
72
|
+
export type { Metrics, Logger, NextFunction };
|
package/dist/types/utils.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export declare const mergeExtension: (users: any[]) => {
|
|
|
3
3
|
};
|
|
4
4
|
export declare const toMessage: (dig: string, e: Error | string) => string;
|
|
5
5
|
export declare const noop: () => void;
|
|
6
|
-
export declare const createErrorDocument: (status: number, text: string) => string;
|
|
6
|
+
export declare const createErrorDocument: (status: number, text: string) => string;
|
|
7
|
+
export declare function applyMixins(derivedCtor: any, constructors: any[]): void;
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"modern",
|
|
12
12
|
"modern.js"
|
|
13
13
|
],
|
|
14
|
-
"version": "1.1.
|
|
14
|
+
"version": "1.1.5-beta.1",
|
|
15
15
|
"jsnext:source": "./src/index.ts",
|
|
16
16
|
"types": "./dist/types/index.d.ts",
|
|
17
17
|
"main": "./dist/js/node/index.js",
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
"@babel/preset-typescript": "^7.15.0",
|
|
34
34
|
"@babel/register": "^7.15.3",
|
|
35
35
|
"@babel/runtime": "^7",
|
|
36
|
-
"@modern-js/core": "^1.1.
|
|
36
|
+
"@modern-js/core": "^1.1.4",
|
|
37
37
|
"@modern-js/hmr-client": "^1.1.1",
|
|
38
38
|
"@modern-js/server-plugin": "^1.1.2",
|
|
39
39
|
"@modern-js/server-utils": "^1.1.2",
|
|
40
40
|
"@modern-js/bff-utils": "^1.1.1",
|
|
41
|
-
"@modern-js/utils": "^1.1.
|
|
41
|
+
"@modern-js/utils": "^1.1.4",
|
|
42
42
|
"axios": "^0.21.4",
|
|
43
43
|
"babel-plugin-module-resolver": "^4.1.0",
|
|
44
44
|
"chokidar": "^3.5.2",
|
|
@@ -61,9 +61,9 @@
|
|
|
61
61
|
"ws": "^8.2.0"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
|
-
"@modern-js/module-tools": "^1.1.
|
|
64
|
+
"@modern-js/module-tools": "^1.1.2",
|
|
65
65
|
"@modern-js/plugin-testing": "^1.1.1",
|
|
66
|
-
"@modern-js/types": "^1.1.
|
|
66
|
+
"@modern-js/types": "^1.1.3",
|
|
67
67
|
"@types/jest": "^26",
|
|
68
68
|
"@types/lru-cache": "^5.1.1",
|
|
69
69
|
"@types/mime-types": "^2.1.0",
|
|
@@ -3,7 +3,7 @@ import { URL } from 'url';
|
|
|
3
3
|
import qs from 'querystring';
|
|
4
4
|
import type {
|
|
5
5
|
ModernServerContext as ModernServerContextInterface,
|
|
6
|
-
|
|
6
|
+
Metrics,
|
|
7
7
|
Logger,
|
|
8
8
|
} from '@modern-js/types/server';
|
|
9
9
|
import { toMessage } from '../../utils';
|
|
@@ -26,17 +26,25 @@ export class ModernServerContext implements ModernServerContextInterface {
|
|
|
26
26
|
|
|
27
27
|
public logger: Logger;
|
|
28
28
|
|
|
29
|
-
public
|
|
29
|
+
public metrics?: Metrics;
|
|
30
30
|
|
|
31
31
|
constructor(
|
|
32
32
|
req: IncomingMessage,
|
|
33
33
|
res: ServerResponse,
|
|
34
|
-
{ logger,
|
|
34
|
+
{ logger, metrics }: { logger: Logger; metrics: Metrics },
|
|
35
35
|
) {
|
|
36
36
|
this.req = req;
|
|
37
37
|
this.res = res;
|
|
38
38
|
this.logger = logger;
|
|
39
|
-
this.
|
|
39
|
+
this.metrics = metrics;
|
|
40
|
+
|
|
41
|
+
this.bind();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private bind() {
|
|
45
|
+
const { req, res } = this as any;
|
|
46
|
+
req.get = (key: string) => this.getReqHeader(key);
|
|
47
|
+
res.set = (key: string, value: any) => this.res.setHeader(key, value);
|
|
40
48
|
}
|
|
41
49
|
|
|
42
50
|
public setParams(params: Record<string, string>) {
|
|
@@ -60,10 +68,6 @@ export class ModernServerContext implements ModernServerContextInterface {
|
|
|
60
68
|
return this.req.headers;
|
|
61
69
|
}
|
|
62
70
|
|
|
63
|
-
public set headers(val) {
|
|
64
|
-
this.req.headers = val;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
71
|
public get method(): string {
|
|
68
72
|
return this.req.method!;
|
|
69
73
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
2
|
-
import {
|
|
2
|
+
import { Metrics, Logger } from '../../type';
|
|
3
3
|
import { ModernServerContext } from './context';
|
|
4
4
|
|
|
5
5
|
export const createContext = (
|
|
6
6
|
req: IncomingMessage,
|
|
7
7
|
res: ServerResponse,
|
|
8
|
-
{ logger,
|
|
9
|
-
) => new ModernServerContext(req, res, { logger,
|
|
8
|
+
{ logger, metrics }: { logger: Logger; metrics: Metrics },
|
|
9
|
+
) => new ModernServerContext(req, res, { logger, metrics });
|
|
10
10
|
|
|
11
11
|
export { ModernServerContext };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Metrics } from '@/type';
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const metrics: Metrics = {
|
|
4
4
|
gauges() {
|
|
5
5
|
// no impl
|
|
6
6
|
},
|
|
@@ -12,4 +12,4 @@ const measure: Measure = {
|
|
|
12
12
|
},
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
-
export {
|
|
15
|
+
export { metrics };
|
package/src/libs/render/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { readFile } from './reader';
|
|
|
9
9
|
import * as ssr from './ssr';
|
|
10
10
|
import { supportModern, getModernEntry } from './modern';
|
|
11
11
|
import { ERROR_DIGEST } from '@/constants';
|
|
12
|
+
import { ServerHookRunner } from '@/type';
|
|
12
13
|
|
|
13
14
|
export const createRenderHandler = ({
|
|
14
15
|
distDir,
|
|
@@ -17,10 +18,15 @@ export const createRenderHandler = ({
|
|
|
17
18
|
distDir: string;
|
|
18
19
|
staticGenerate: boolean;
|
|
19
20
|
}) =>
|
|
20
|
-
async function render(
|
|
21
|
-
ctx
|
|
22
|
-
route
|
|
23
|
-
|
|
21
|
+
async function render({
|
|
22
|
+
ctx,
|
|
23
|
+
route,
|
|
24
|
+
runner,
|
|
25
|
+
}: {
|
|
26
|
+
ctx: ModernServerContext;
|
|
27
|
+
route: ModernRoute;
|
|
28
|
+
runner: ServerHookRunner;
|
|
29
|
+
}): Promise<RenderResult | null> {
|
|
24
30
|
if (ctx.resHasHandled()) {
|
|
25
31
|
return null;
|
|
26
32
|
}
|
|
@@ -43,13 +49,17 @@ export const createRenderHandler = ({
|
|
|
43
49
|
// handles ssr first
|
|
44
50
|
if (route.isSSR) {
|
|
45
51
|
try {
|
|
46
|
-
const result = await ssr.render(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
const result = await ssr.render(
|
|
53
|
+
ctx,
|
|
54
|
+
{
|
|
55
|
+
distDir,
|
|
56
|
+
entryName: route.entryName,
|
|
57
|
+
bundle: route.bundle,
|
|
58
|
+
template: templateHTML,
|
|
59
|
+
staticGenerate,
|
|
60
|
+
},
|
|
61
|
+
runner,
|
|
62
|
+
);
|
|
53
63
|
return result;
|
|
54
64
|
} catch (err) {
|
|
55
65
|
ctx.error(ERROR_DIGEST.ERENDER, (err as Error).stack);
|
package/src/libs/render/ssr.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { ModernServerContext } from '../context';
|
|
|
5
5
|
import { RenderResult } from '../../type';
|
|
6
6
|
import cache from './cache';
|
|
7
7
|
import { SSRServerContext } from './type';
|
|
8
|
+
import { ServerHookRunner } from '@/type';
|
|
8
9
|
|
|
9
10
|
export const render = async (
|
|
10
11
|
ctx: ModernServerContext,
|
|
@@ -15,6 +16,7 @@ export const render = async (
|
|
|
15
16
|
entryName: string;
|
|
16
17
|
staticGenerate: boolean;
|
|
17
18
|
},
|
|
19
|
+
runner: ServerHookRunner,
|
|
18
20
|
): Promise<RenderResult> => {
|
|
19
21
|
const { bundle, distDir, template, entryName, staticGenerate } =
|
|
20
22
|
renderOptions;
|
|
@@ -34,9 +36,11 @@ export const render = async (
|
|
|
34
36
|
distDir,
|
|
35
37
|
staticGenerate,
|
|
36
38
|
logger: ctx.logger,
|
|
37
|
-
|
|
39
|
+
metrics: ctx.metrics,
|
|
38
40
|
};
|
|
39
41
|
|
|
42
|
+
runner.extendSSRContext(context);
|
|
43
|
+
|
|
40
44
|
const serverRender = require(bundleJS)[SERVER_RENDER_FUNCTION_NAME];
|
|
41
45
|
|
|
42
46
|
const html = await cache(serverRender, ctx)(context);
|
package/src/libs/render/type.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { IncomingHttpHeaders } from 'http';
|
|
2
|
-
import {
|
|
2
|
+
import { BaseSSRServerContext } from '@modern-js/types/server';
|
|
3
|
+
import { Metrics, Logger } from '../../type';
|
|
3
4
|
|
|
4
5
|
type MetaKeyMap = {
|
|
5
6
|
header?: string[];
|
|
@@ -26,21 +27,7 @@ export enum RenderLevel {
|
|
|
26
27
|
SERVER_RENDER,
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
export type SSRServerContext = {
|
|
30
|
-
request: {
|
|
31
|
-
params: Record<string, string>;
|
|
32
|
-
pathname: string;
|
|
33
|
-
query: Record<string, string>;
|
|
34
|
-
headers: IncomingHttpHeaders;
|
|
35
|
-
cookie?: string;
|
|
36
|
-
};
|
|
37
|
-
redirection: { url?: string; status?: number };
|
|
38
|
-
distDir: string;
|
|
39
|
-
template: string;
|
|
40
|
-
entryName: string;
|
|
41
|
-
logger: Logger;
|
|
42
|
-
measure?: Measure;
|
|
43
|
-
loadableManifest?: string;
|
|
30
|
+
export type SSRServerContext = BaseSSRServerContext & {
|
|
44
31
|
cacheConfig?: CacheConfig;
|
|
45
32
|
staticGenerate?: boolean;
|
|
46
33
|
};
|
package/src/libs/route/route.ts
CHANGED
|
@@ -1,22 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// the url path for request match
|
|
5
|
-
urlPath: string;
|
|
6
|
-
// the default resource file to response to route
|
|
7
|
-
entryPath?: string;
|
|
8
|
-
// if route is spa page
|
|
9
|
-
isSPA?: boolean;
|
|
10
|
-
// if route is ssr page
|
|
11
|
-
isSSR?: boolean;
|
|
12
|
-
// if route is api service
|
|
13
|
-
isApi?: boolean;
|
|
14
|
-
// ssr js bundle for ssr page
|
|
15
|
-
bundle?: string;
|
|
16
|
-
// if route has modern product
|
|
17
|
-
enableModernMode?: boolean;
|
|
18
|
-
// specialHeader?: SpecialHeader[];
|
|
19
|
-
}
|
|
1
|
+
import { ServerRoute as ModernRouteInterface } from '@modern-js/types';
|
|
2
|
+
|
|
3
|
+
export type { ModernRouteInterface };
|
|
20
4
|
|
|
21
5
|
export class ModernRoute implements ModernRouteInterface {
|
|
22
6
|
public entryName: string;
|
|
@@ -36,7 +20,7 @@ export class ModernRoute implements ModernRouteInterface {
|
|
|
36
20
|
public enableModernMode?: boolean;
|
|
37
21
|
|
|
38
22
|
constructor(routeSpec: ModernRouteInterface) {
|
|
39
|
-
this.entryName = routeSpec.entryName;
|
|
23
|
+
this.entryName = routeSpec.entryName || '';
|
|
40
24
|
this.urlPath = routeSpec.urlPath;
|
|
41
25
|
this.entryPath = routeSpec.entryPath || '';
|
|
42
26
|
this.isSSR = routeSpec.isSSR || false;
|
|
@@ -4,7 +4,7 @@ import { mergeExtension } from '@/utils';
|
|
|
4
4
|
import { ModernRouteInterface } from '@/libs/route';
|
|
5
5
|
import { ApiServerMode } from '@/constants';
|
|
6
6
|
|
|
7
|
-
export class
|
|
7
|
+
export class ModernSSRDevServer extends ModernDevServer {
|
|
8
8
|
protected prepareAPIHandler(
|
|
9
9
|
_m: ApiServerMode,
|
|
10
10
|
_: APIServerStartInput['config'],
|
|
@@ -23,14 +23,10 @@ export class WebModernDevServer extends ModernDevServer {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
export class
|
|
27
|
-
protected prepareWebHandler(_: ReturnType<typeof mergeExtension>) {
|
|
28
|
-
return null as any;
|
|
29
|
-
}
|
|
30
|
-
|
|
26
|
+
export class ModernAPIDevServer extends ModernDevServer {
|
|
31
27
|
protected async prepareAPIHandler(
|
|
32
28
|
mode: ApiServerMode,
|
|
33
|
-
extension:
|
|
29
|
+
extension: APIServerStartInput['config'],
|
|
34
30
|
) {
|
|
35
31
|
return super.prepareAPIHandler(mode, extension);
|
|
36
32
|
}
|
|
@@ -13,9 +13,7 @@ import {
|
|
|
13
13
|
SHARED_DIR,
|
|
14
14
|
} from '@modern-js/utils';
|
|
15
15
|
import type { MultiCompiler, Compiler } from 'webpack';
|
|
16
|
-
import webpackDevMiddleware
|
|
17
|
-
WebpackDevMiddleware,
|
|
18
|
-
} from 'webpack-dev-middleware';
|
|
16
|
+
import webpackDevMiddleware from 'webpack-dev-middleware';
|
|
19
17
|
import { ModernServer } from '../modern-server';
|
|
20
18
|
import { createMockHandler } from '@/dev-tools/mock';
|
|
21
19
|
import { createProxyHandler, ProxyOptions } from '@/libs/proxy';
|
|
@@ -45,9 +43,11 @@ const DEFAULT_DEV_OPTIONS: DevServerOptions = {
|
|
|
45
43
|
},
|
|
46
44
|
https: false,
|
|
47
45
|
dev: { writeToDisk: true },
|
|
46
|
+
watch: true,
|
|
48
47
|
hot: true,
|
|
49
48
|
liveReload: true,
|
|
50
49
|
};
|
|
50
|
+
|
|
51
51
|
export class ModernDevServer extends ModernServer {
|
|
52
52
|
private devProxyHandler: ReturnType<typeof createProxyHandler> = null;
|
|
53
53
|
|
|
@@ -61,12 +61,10 @@ export class ModernDevServer extends ModernServer {
|
|
|
61
61
|
|
|
62
62
|
private watcher!: Watcher;
|
|
63
63
|
|
|
64
|
-
private devMiddleware!:
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
next: NextFunction,
|
|
69
|
-
) => void);
|
|
64
|
+
private devMiddleware!: webpackDevMiddleware.API<
|
|
65
|
+
http.IncomingMessage,
|
|
66
|
+
http.ServerResponse
|
|
67
|
+
>;
|
|
70
68
|
|
|
71
69
|
constructor(options: ModernServerOptions) {
|
|
72
70
|
super(options);
|
|
@@ -76,7 +74,9 @@ export class ModernDevServer extends ModernServer {
|
|
|
76
74
|
|
|
77
75
|
// set dev server options, like webpack-dev-server
|
|
78
76
|
this.dev =
|
|
79
|
-
typeof options.dev === 'boolean'
|
|
77
|
+
typeof options.dev === 'boolean'
|
|
78
|
+
? DEFAULT_DEV_OPTIONS
|
|
79
|
+
: { ...DEFAULT_DEV_OPTIONS, ...options.dev };
|
|
80
80
|
|
|
81
81
|
enableRegister(this.pwd, this.conf);
|
|
82
82
|
}
|
|
@@ -124,7 +124,9 @@ export class ModernDevServer extends ModernServer {
|
|
|
124
124
|
await super.init(runner);
|
|
125
125
|
|
|
126
126
|
// watch mock/ server/ api/ dir file change
|
|
127
|
-
this.
|
|
127
|
+
if (this.dev.watch) {
|
|
128
|
+
this.startWatcher();
|
|
129
|
+
}
|
|
128
130
|
}
|
|
129
131
|
|
|
130
132
|
public ready(options: ReadyOptions = {}) {
|
|
@@ -239,7 +241,7 @@ export class ModernDevServer extends ModernServer {
|
|
|
239
241
|
const bundles = this.router.getBundles();
|
|
240
242
|
|
|
241
243
|
bundles.forEach(bundle => {
|
|
242
|
-
const filepath = path.join(distDir, bundle
|
|
244
|
+
const filepath = path.join(distDir, bundle as string);
|
|
243
245
|
if (require.cache[filepath]) {
|
|
244
246
|
delete require.cache[filepath];
|
|
245
247
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { ModernAPIDevServer, ModernSSRDevServer } from './dev-server-split';
|
|
2
2
|
export { ModernDevServer } from './dev-server';
|
package/src/server/index.ts
CHANGED
|
@@ -12,9 +12,13 @@ import {
|
|
|
12
12
|
} from '@modern-js/core';
|
|
13
13
|
import { ModernServer } from './modern-server';
|
|
14
14
|
import type { ModernDevServer } from './dev-server';
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
ModernAPIServer,
|
|
17
|
+
ModernSSRServer,
|
|
18
|
+
ModernWebServer,
|
|
19
|
+
} from './modern-server-split';
|
|
16
20
|
import { ModernServerOptions, ServerHookRunner, ReadyOptions } from '@/type';
|
|
17
|
-
import {
|
|
21
|
+
import { metrics as defaultMetrics } from '@/libs/metrics';
|
|
18
22
|
|
|
19
23
|
export class Server {
|
|
20
24
|
public options: ModernServerOptions;
|
|
@@ -44,7 +48,7 @@ export class Server {
|
|
|
44
48
|
const { options } = this;
|
|
45
49
|
|
|
46
50
|
options.logger = options.logger || defaultLogger;
|
|
47
|
-
options.
|
|
51
|
+
options.metrics = options.metrics || defaultMetrics;
|
|
48
52
|
|
|
49
53
|
// initialize server
|
|
50
54
|
if (options.dev) {
|
|
@@ -90,9 +94,11 @@ export class Server {
|
|
|
90
94
|
const { options } = this;
|
|
91
95
|
|
|
92
96
|
if (options.apiOnly) {
|
|
93
|
-
return new
|
|
97
|
+
return new ModernAPIServer(options);
|
|
98
|
+
} else if (options.ssrOnly) {
|
|
99
|
+
return new ModernSSRServer(options);
|
|
94
100
|
} else if (options.webOnly) {
|
|
95
|
-
return new
|
|
101
|
+
return new ModernWebServer(options);
|
|
96
102
|
} else {
|
|
97
103
|
return new ModernServer(options);
|
|
98
104
|
}
|
|
@@ -101,15 +107,15 @@ export class Server {
|
|
|
101
107
|
private createDevServer() {
|
|
102
108
|
const { options } = this;
|
|
103
109
|
const {
|
|
104
|
-
|
|
105
|
-
|
|
110
|
+
ModernAPIDevServer,
|
|
111
|
+
ModernSSRDevServer,
|
|
106
112
|
ModernDevServer,
|
|
107
113
|
} = require('./dev-server');
|
|
108
114
|
|
|
109
115
|
if (options.apiOnly) {
|
|
110
|
-
return new
|
|
111
|
-
} else if (options.
|
|
112
|
-
return new
|
|
116
|
+
return new ModernAPIDevServer(options);
|
|
117
|
+
} else if (options.ssrOnly) {
|
|
118
|
+
return new ModernSSRDevServer(options);
|
|
113
119
|
} else {
|
|
114
120
|
return new ModernDevServer(options);
|
|
115
121
|
}
|
|
@@ -117,6 +123,11 @@ export class Server {
|
|
|
117
123
|
|
|
118
124
|
private async createHookRunner() {
|
|
119
125
|
const { options } = this;
|
|
126
|
+
|
|
127
|
+
options.plugins?.forEach(p => {
|
|
128
|
+
serverManager.usePlugin(p);
|
|
129
|
+
});
|
|
130
|
+
|
|
120
131
|
const appContext = await this.initAppContext();
|
|
121
132
|
serverManager.run(() => {
|
|
122
133
|
ConfigContext.set(this.options.config as UserConfig);
|
|
@@ -129,10 +140,6 @@ export class Server {
|
|
|
129
140
|
});
|
|
130
141
|
});
|
|
131
142
|
|
|
132
|
-
options.plugins?.forEach(p => {
|
|
133
|
-
serverManager.usePlugin(p);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
143
|
return serverManager.init({});
|
|
137
144
|
}
|
|
138
145
|
|