@modern-js/server 1.1.3-beta.1 → 1.1.5-beta.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 (69) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/js/modern/dev-tools/babel/register.js +2 -2
  3. package/dist/js/modern/dev-tools/mock/getMockData.js +2 -2
  4. package/dist/js/modern/libs/context/context.js +15 -7
  5. package/dist/js/modern/libs/context/index.js +2 -2
  6. package/dist/js/modern/libs/{measure.js → metrics.js} +2 -2
  7. package/dist/js/modern/libs/proxy.js +2 -2
  8. package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +2 -2
  9. package/dist/js/modern/libs/render/cache/index.js +2 -2
  10. package/dist/js/modern/libs/render/cache/type.js +0 -1
  11. package/dist/js/modern/libs/render/index.js +6 -2
  12. package/dist/js/modern/libs/render/ssr.js +3 -2
  13. package/dist/js/modern/libs/route/route.js +1 -1
  14. package/dist/js/modern/server/dev-server/dev-server-split.js +2 -6
  15. package/dist/js/modern/server/dev-server/dev-server.js +12 -3
  16. package/dist/js/modern/server/dev-server/index.js +1 -1
  17. package/dist/js/modern/server/index.js +19 -16
  18. package/dist/js/modern/server/modern-server-split.js +55 -6
  19. package/dist/js/modern/server/modern-server.js +92 -58
  20. package/dist/js/modern/type.js +0 -1
  21. package/dist/js/modern/utils.js +9 -1
  22. package/dist/js/node/dev-tools/babel/register.js +2 -2
  23. package/dist/js/node/dev-tools/mock/getMockData.js +2 -2
  24. package/dist/js/node/libs/context/context.js +15 -7
  25. package/dist/js/node/libs/context/index.js +2 -2
  26. package/dist/js/node/libs/{measure.js → metrics.js} +3 -3
  27. package/dist/js/node/libs/proxy.js +2 -2
  28. package/dist/js/node/libs/render/cache/__tests__/cache.test.js +2 -2
  29. package/dist/js/node/libs/render/cache/index.js +2 -2
  30. package/dist/js/node/libs/render/index.js +6 -2
  31. package/dist/js/node/libs/render/ssr.js +3 -2
  32. package/dist/js/node/libs/route/route.js +1 -1
  33. package/dist/js/node/server/dev-server/dev-server-split.js +5 -9
  34. package/dist/js/node/server/dev-server/dev-server.js +12 -3
  35. package/dist/js/node/server/dev-server/index.js +4 -4
  36. package/dist/js/node/server/index.js +18 -14
  37. package/dist/js/node/server/modern-server-split.js +61 -9
  38. package/dist/js/node/server/modern-server.js +93 -59
  39. package/dist/js/node/utils.js +12 -2
  40. package/dist/types/libs/context/context.d.ts +5 -5
  41. package/dist/types/libs/context/index.d.ts +3 -3
  42. package/dist/types/libs/metrics.d.ts +3 -0
  43. package/dist/types/libs/render/index.d.ts +10 -1
  44. package/dist/types/libs/render/ssr.d.ts +2 -1
  45. package/dist/types/libs/render/type.d.ts +2 -21
  46. package/dist/types/libs/route/route.d.ts +2 -10
  47. package/dist/types/server/dev-server/dev-server-split.d.ts +3 -4
  48. package/dist/types/server/dev-server/index.d.ts +1 -1
  49. package/dist/types/server/modern-server-split.d.ts +15 -5
  50. package/dist/types/server/modern-server.d.ts +14 -7
  51. package/dist/types/type.d.ts +11 -5
  52. package/dist/types/utils.d.ts +2 -1
  53. package/package.json +7 -7
  54. package/src/libs/context/context.ts +12 -8
  55. package/src/libs/context/index.ts +3 -3
  56. package/src/libs/{measure.ts → metrics.ts} +3 -3
  57. package/src/libs/render/index.ts +21 -11
  58. package/src/libs/render/ssr.ts +5 -1
  59. package/src/libs/render/type.ts +3 -16
  60. package/src/libs/route/route.ts +4 -20
  61. package/src/server/dev-server/dev-server-split.ts +3 -7
  62. package/src/server/dev-server/dev-server.ts +15 -13
  63. package/src/server/dev-server/index.ts +1 -1
  64. package/src/server/index.ts +24 -14
  65. package/src/server/modern-server-split.ts +59 -7
  66. package/src/server/modern-server.ts +105 -67
  67. package/src/type.ts +12 -5
  68. package/src/utils.ts +14 -0
  69. 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
- export declare class WebModernServer extends ModernServer {
7
- protected prepareAPIHandler(_m: ApiServerMode, _: ReturnType<typeof mergeExtension>): any;
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 filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
12
+ protected preServerInit(): Promise<void>;
10
13
  }
11
- export declare class APIModernServer extends ModernServer {
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, Measure, Logger, ReadyOptions } from '../type';
6
- import { RouteMatchManager, ModernRouteInterface } from '../libs/route';
7
- import { mergeExtension } from '../utils';
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 measure: Measure;
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
- measure
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
- private prepareFavicons;
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 {};
@@ -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 { Measure, Logger, NextFunction } from '@modern-js/types/server';
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
- measureOptions?: Record<string, string>;
45
+ metricsOptions?: Record<string, string>;
45
46
  logger?: Logger;
46
- measure?: Measure;
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 { Measure, Logger, NextFunction };
72
+ export type { Metrics, Logger, NextFunction };
@@ -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.3-beta.1",
14
+ "version": "1.1.5-beta.0",
15
15
  "jsnext:source": "./src/index.ts",
16
16
  "types": "./dist/types/index.d.ts",
17
17
  "main": "./dist/js/node/index.js",
@@ -41,12 +41,12 @@
41
41
  "@babel/preset-typescript": "^7.15.0",
42
42
  "@babel/register": "^7.15.3",
43
43
  "@babel/runtime": "^7",
44
- "@modern-js/core": "workspace:^1.1.2",
44
+ "@modern-js/core": "workspace:^1.1.4",
45
45
  "@modern-js/hmr-client": "workspace:^1.1.1",
46
- "@modern-js/server-plugin": "workspace:^1.1.1",
47
- "@modern-js/server-utils": "workspace:^1.1.1",
46
+ "@modern-js/server-plugin": "workspace:^1.1.2",
47
+ "@modern-js/server-utils": "workspace:^1.1.2",
48
48
  "@modern-js/bff-utils": "workspace:^1.1.1",
49
- "@modern-js/utils": "workspace:^1.1.2",
49
+ "@modern-js/utils": "workspace:^1.1.4",
50
50
  "axios": "^0.21.4",
51
51
  "babel-plugin-module-resolver": "^4.1.0",
52
52
  "chokidar": "^3.5.2",
@@ -69,9 +69,9 @@
69
69
  "ws": "^8.2.0"
70
70
  },
71
71
  "devDependencies": {
72
- "@modern-js/module-tools": "^1.1.1",
72
+ "@modern-js/module-tools": "^1.1.2",
73
73
  "@modern-js/plugin-testing": "^1.1.1",
74
- "@modern-js/types": "workspace:^1.1.2",
74
+ "@modern-js/types": "workspace:^1.1.3",
75
75
  "@types/jest": "^26",
76
76
  "@types/lru-cache": "^5.1.1",
77
77
  "@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
- Measure,
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 measure?: Measure;
29
+ public metrics?: Metrics;
30
30
 
31
31
  constructor(
32
32
  req: IncomingMessage,
33
33
  res: ServerResponse,
34
- { logger, measure }: { logger: Logger; measure: Measure },
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.measure = measure;
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 { Measure, Logger } from '../../type';
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, measure }: { logger: Logger; measure: Measure },
9
- ) => new ModernServerContext(req, res, { logger, measure });
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 { Measure } from '@/type';
1
+ import { Metrics } from '@/type';
2
2
 
3
- const measure: Measure = {
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 { measure };
15
+ export { metrics };
@@ -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: ModernServerContext,
22
- route: ModernRoute,
23
- ): Promise<RenderResult | null> {
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(ctx, {
47
- distDir,
48
- entryName: route.entryName,
49
- bundle: route.bundle,
50
- template: templateHTML,
51
- staticGenerate,
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);
@@ -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
- measure: ctx.measure,
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);
@@ -1,5 +1,6 @@
1
1
  import { IncomingHttpHeaders } from 'http';
2
- import { Measure, Logger } from '../../type';
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
  };
@@ -1,22 +1,6 @@
1
- export interface ModernRouteInterface {
2
- // modern js web entry name
3
- entryName: string;
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 WebModernDevServer extends ModernDevServer {
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 APIModernDevServer extends ModernDevServer {
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: ReturnType<typeof mergeExtension>,
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!: WebpackDevMiddleware &
65
- ((
66
- req: http.IncomingMessage,
67
- res: http.ServerResponse,
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' ? DEFAULT_DEV_OPTIONS : options.dev!;
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.startWatcher();
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
  }
@@ -252,7 +254,7 @@ export class ModernDevServer extends ModernServer {
252
254
  const defaultWatched = [
253
255
  `${pwd}/${mock}/**/*`,
254
256
  `${pwd}/${SERVER_DIR}/**/*`,
255
- `${pwd}/${API_DIR}/**/*`,
257
+ `${pwd}/${API_DIR}/!(typings)/**`,
256
258
  `${pwd}/${SHARED_DIR}/**/*`,
257
259
  ];
258
260
 
@@ -1,2 +1,2 @@
1
- export { APIModernDevServer, WebModernDevServer } from './dev-server-split';
1
+ export { ModernAPIDevServer, ModernSSRDevServer } from './dev-server-split';
2
2
  export { ModernDevServer } from './dev-server';
@@ -7,12 +7,18 @@ import {
7
7
  initAppContext,
8
8
  initAppDir,
9
9
  loadUserConfig,
10
+ ConfigContext,
11
+ UserConfig,
10
12
  } from '@modern-js/core';
11
13
  import { ModernServer } from './modern-server';
12
14
  import type { ModernDevServer } from './dev-server';
13
- import { APIModernServer, WebModernServer } from './modern-server-split';
15
+ import {
16
+ ModernAPIServer,
17
+ ModernSSRServer,
18
+ ModernWebServer,
19
+ } from './modern-server-split';
14
20
  import { ModernServerOptions, ServerHookRunner, ReadyOptions } from '@/type';
15
- import { measure as defaultMeasure } from '@/libs/measure';
21
+ import { metrics as defaultMetrics } from '@/libs/metrics';
16
22
 
17
23
  export class Server {
18
24
  public options: ModernServerOptions;
@@ -42,7 +48,7 @@ export class Server {
42
48
  const { options } = this;
43
49
 
44
50
  options.logger = options.logger || defaultLogger;
45
- options.measure = options.measure || defaultMeasure;
51
+ options.metrics = options.metrics || defaultMetrics;
46
52
 
47
53
  // initialize server
48
54
  if (options.dev) {
@@ -88,9 +94,11 @@ export class Server {
88
94
  const { options } = this;
89
95
 
90
96
  if (options.apiOnly) {
91
- return new APIModernServer(options);
97
+ return new ModernAPIServer(options);
98
+ } else if (options.ssrOnly) {
99
+ return new ModernSSRServer(options);
92
100
  } else if (options.webOnly) {
93
- return new WebModernServer(options);
101
+ return new ModernWebServer(options);
94
102
  } else {
95
103
  return new ModernServer(options);
96
104
  }
@@ -99,15 +107,15 @@ export class Server {
99
107
  private createDevServer() {
100
108
  const { options } = this;
101
109
  const {
102
- APIModernDevServer,
103
- WebModernDevServer,
110
+ ModernAPIDevServer,
111
+ ModernSSRDevServer,
104
112
  ModernDevServer,
105
113
  } = require('./dev-server');
106
114
 
107
115
  if (options.apiOnly) {
108
- return new APIModernDevServer(options);
109
- } else if (options.webOnly) {
110
- return new WebModernDevServer(options);
116
+ return new ModernAPIDevServer(options);
117
+ } else if (options.ssrOnly) {
118
+ return new ModernSSRDevServer(options);
111
119
  } else {
112
120
  return new ModernDevServer(options);
113
121
  }
@@ -115,8 +123,14 @@ export class Server {
115
123
 
116
124
  private async createHookRunner() {
117
125
  const { options } = this;
126
+
127
+ options.plugins?.forEach(p => {
128
+ serverManager.usePlugin(p);
129
+ });
130
+
118
131
  const appContext = await this.initAppContext();
119
132
  serverManager.run(() => {
133
+ ConfigContext.set(this.options.config as UserConfig);
120
134
  AppContext.set({
121
135
  ...appContext,
122
136
  distDirectory: path.join(
@@ -126,10 +140,6 @@ export class Server {
126
140
  });
127
141
  });
128
142
 
129
- options.plugins?.forEach(p => {
130
- serverManager.usePlugin(p);
131
- });
132
-
133
143
  return serverManager.init({});
134
144
  }
135
145