@umijs/server 4.2.15 → 4.3.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/ssr.d.ts CHANGED
@@ -1,5 +1,7 @@
1
+ /// <reference lib="webworker" />
2
+ import type { RequestHandler } from '@umijs/bundler-utils/compiled/express';
1
3
  import React from 'react';
2
- import type { UmiRequest } from './types';
4
+ import type { IhtmlPageOpts, UmiRequest } from './types';
3
5
  interface RouteLoaders {
4
6
  [key: string]: () => Promise<any>;
5
7
  }
@@ -12,22 +14,35 @@ interface CreateRequestServerlessOptions {
12
14
  }
13
15
  interface CreateRequestHandlerOptions extends CreateRequestServerlessOptions {
14
16
  routesWithServerLoader: RouteLoaders;
15
- PluginManager: any;
17
+ pluginManager: any;
16
18
  manifest: ((sourceDir?: string) => {
17
19
  assets: Record<string, string>;
18
20
  }) | {
19
21
  assets: Record<string, string>;
20
22
  };
21
- getPlugins: () => any;
22
- getValidKeys: () => any;
23
23
  getRoutes: (PluginManager: any) => any;
24
24
  getClientRootComponent: (PluginManager: any) => any;
25
25
  createHistory: (opts: any) => any;
26
26
  helmetContext?: any;
27
+ reactVersion: string;
27
28
  ServerInsertedHTMLContext: React.Context<ServerInsertedHTMLHook | null>;
29
+ htmlPageOpts: IhtmlPageOpts;
30
+ __INTERNAL_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
31
+ pureApp: boolean;
32
+ pureHtml: boolean;
33
+ };
34
+ mountElementId: string;
28
35
  }
29
36
  export declare function createMarkupGenerator(opts: CreateRequestHandlerOptions): (url: string) => Promise<unknown>;
30
- export default function createRequestHandler(opts: CreateRequestHandlerOptions): (req: any, res: any, next: any) => Promise<any>;
37
+ declare type IExpressRequestHandlerArgs = Parameters<RequestHandler>;
38
+ declare type IWorkerRequestHandlerArgs = [
39
+ ev: FetchEvent,
40
+ opts?: {
41
+ modifyResponse?: (res: Response) => Promise<Response> | Response;
42
+ }
43
+ ];
44
+ export default function createRequestHandler(opts: CreateRequestHandlerOptions): (...args: IExpressRequestHandlerArgs | IWorkerRequestHandlerArgs) => Promise<void>;
31
45
  export declare function createUmiHandler(opts: CreateRequestHandlerOptions): (req: UmiRequest, params?: CreateRequestHandlerOptions) => Promise<NodeJS.ReadableStream>;
32
46
  export declare function createUmiServerLoader(opts: CreateRequestHandlerOptions): (req: UmiRequest) => Promise<any>;
47
+ export declare function createAppRootElement(opts: CreateRequestHandlerOptions): (...args: IExpressRequestHandlerArgs | IWorkerRequestHandlerArgs) => Promise<() => React.ReactElement<any, string | React.JSXElementConstructor<any>> | undefined>;
33
48
  export {};
package/dist/ssr.js CHANGED
@@ -29,17 +29,28 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
29
29
  // src/ssr.ts
30
30
  var ssr_exports = {};
31
31
  __export(ssr_exports, {
32
+ createAppRootElement: () => createAppRootElement,
32
33
  createMarkupGenerator: () => createMarkupGenerator,
33
34
  createUmiHandler: () => createUmiHandler,
34
35
  createUmiServerLoader: () => createUmiServerLoader,
35
36
  default: () => createRequestHandler
36
37
  });
37
38
  module.exports = __toCommonJS(ssr_exports);
39
+ var import_semver = __toESM(require("@umijs/utils/compiled/semver"));
38
40
  var import_react = __toESM(require("react"));
39
41
  var ReactDomServer = __toESM(require("react-dom/server"));
40
42
  var import_react_router_dom = require("react-router-dom");
41
43
  var import_stream = require("stream");
42
- var createJSXProvider = (Provider, serverInsertedHTMLCallbacks) => {
44
+ var MetaLoaderResultKeys = /* @__PURE__ */ ((MetaLoaderResultKeys2) => {
45
+ MetaLoaderResultKeys2["Title"] = "title";
46
+ MetaLoaderResultKeys2["Description"] = "description";
47
+ MetaLoaderResultKeys2["Keywords"] = "keywords";
48
+ MetaLoaderResultKeys2["Lang"] = "lang";
49
+ MetaLoaderResultKeys2["Metas"] = "metas";
50
+ return MetaLoaderResultKeys2;
51
+ })(MetaLoaderResultKeys || {});
52
+ var createJSXProvider = (Provider) => {
53
+ const serverInsertedHTMLCallbacks = /* @__PURE__ */ new Set();
43
54
  const JSXProvider = (props) => {
44
55
  const addInsertedHtml = import_react.default.useCallback(
45
56
  (handler) => {
@@ -52,26 +63,20 @@ var createJSXProvider = (Provider, serverInsertedHTMLCallbacks) => {
52
63
  value: addInsertedHtml
53
64
  });
54
65
  };
55
- return JSXProvider;
66
+ return [JSXProvider, serverInsertedHTMLCallbacks];
56
67
  };
57
68
  function createJSXGenerator(opts) {
58
69
  return async (url, serverLoaderArgs) => {
59
70
  const {
60
71
  routesWithServerLoader,
61
- PluginManager,
62
- getPlugins,
63
- getValidKeys,
72
+ pluginManager,
64
73
  getRoutes,
65
74
  createHistory,
66
75
  sourceDir
67
76
  } = opts;
68
77
  createHistory({ type: "memory", initialEntries: [url], initialIndex: 1 });
69
- const pluginManager = PluginManager.create({
70
- plugins: getPlugins(),
71
- validKeys: getValidKeys()
72
- });
73
78
  const { routes, routeComponents } = await getRoutes(pluginManager);
74
- await pluginManager.applyPlugins({
79
+ pluginManager.applyPlugins({
75
80
  key: "patchRoutes",
76
81
  type: "event",
77
82
  args: {
@@ -84,7 +89,6 @@ function createJSXGenerator(opts) {
84
89
  return;
85
90
  }
86
91
  const loaderData = {};
87
- const metadata = {};
88
92
  await Promise.all(
89
93
  matches.filter((id) => routes[id].hasServerLoader).map(
90
94
  (id) => new Promise(async (resolve) => {
@@ -94,15 +98,19 @@ function createJSXGenerator(opts) {
94
98
  serverLoaderArgs
95
99
  });
96
100
  if (routes[id].hasMetadataLoader) {
97
- Object.assign(
98
- metadata,
99
- await executeMetadataLoader({
100
- routesWithServerLoader,
101
- routeKey: id,
102
- serverLoaderArgs,
103
- serverLoaderData: loaderData[id]
104
- })
105
- );
101
+ const metadataLoaderData = await executeMetadataLoader({
102
+ routesWithServerLoader,
103
+ routeKey: id,
104
+ serverLoaderArgs,
105
+ serverLoaderData: loaderData[id]
106
+ });
107
+ metadataLoaderData && Object.entries(metadataLoaderData).forEach(([k, v]) => {
108
+ if (Array.isArray(v)) {
109
+ opts.htmlPageOpts[k] = (opts.htmlPageOpts[k] || []).concat(v);
110
+ } else {
111
+ opts.htmlPageOpts[k] = v;
112
+ }
113
+ });
106
114
  }
107
115
  resolve();
108
116
  })
@@ -116,7 +124,9 @@ function createJSXGenerator(opts) {
116
124
  location: url,
117
125
  manifest,
118
126
  loaderData,
119
- metadata
127
+ htmlPageOpts: opts.htmlPageOpts,
128
+ __INTERNAL_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: opts.__INTERNAL_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
129
+ mountElementId: opts.mountElementId
120
130
  };
121
131
  const element = await opts.getClientRootComponent(
122
132
  context
@@ -127,13 +137,19 @@ function createJSXGenerator(opts) {
127
137
  };
128
138
  };
129
139
  }
130
- var getGenerateStaticHTML = (serverInsertedHTMLCallbacks) => {
140
+ var SERVER_INSERTED_HTML = "umi-server-inserted-html";
141
+ var getGenerateStaticHTML = (serverInsertedHTMLCallbacks, opts) => {
142
+ const children = import_react.default.createElement(import_react.default.Fragment, {
143
+ children: Array.from(serverInsertedHTMLCallbacks || []).map(
144
+ (callback) => callback()
145
+ )
146
+ });
131
147
  return ReactDomServer.renderToString(
132
- import_react.default.createElement(import_react.default.Fragment, {
133
- children: Array.from(serverInsertedHTMLCallbacks || []).map(
134
- (callback) => callback()
135
- )
136
- })
148
+ (opts == null ? void 0 : opts.wrapper) ? import_react.default.createElement(
149
+ "div",
150
+ { id: SERVER_INSERTED_HTML, hidden: true },
151
+ children
152
+ ) : children
137
153
  ) || "";
138
154
  };
139
155
  function createMarkupGenerator(opts) {
@@ -142,10 +158,8 @@ function createMarkupGenerator(opts) {
142
158
  const jsx = await jsxGeneratorDeferrer(url);
143
159
  if (jsx) {
144
160
  return new Promise(async (resolve, reject) => {
145
- const serverInsertedHTMLCallbacks = /* @__PURE__ */ new Set();
146
- const JSXProvider = createJSXProvider(
147
- opts.ServerInsertedHTMLContext.Provider,
148
- serverInsertedHTMLCallbacks
161
+ const [JSXProvider, serverInsertedHTMLCallbacks] = createJSXProvider(
162
+ opts.ServerInsertedHTMLContext.Provider
149
163
  );
150
164
  let chunks = [];
151
165
  const writable = new import_stream.Writable();
@@ -155,7 +169,10 @@ function createMarkupGenerator(opts) {
155
169
  };
156
170
  writable.on("finish", async () => {
157
171
  let html = Buffer.concat(chunks).toString("utf8");
158
- html += await getGenerateStaticHTML(serverInsertedHTMLCallbacks);
172
+ const serverHTML = getGenerateStaticHTML(serverInsertedHTMLCallbacks);
173
+ if (serverHTML) {
174
+ html = html.replace(/<\/head>/, `${serverHTML}</head>`);
175
+ }
159
176
  if (opts.helmetContext) {
160
177
  html = html.replace(
161
178
  /(<\/head>)/,
@@ -177,6 +194,7 @@ function createMarkupGenerator(opts) {
177
194
  onShellReady() {
178
195
  stream.pipe(writable);
179
196
  },
197
+ bootstrapScripts: [jsx.manifest.assets["umi.js"] || "/umi.js"],
180
198
  onError: reject
181
199
  }
182
200
  );
@@ -185,50 +203,211 @@ function createMarkupGenerator(opts) {
185
203
  return "";
186
204
  };
187
205
  }
206
+ var normalizeRequest = (...args) => {
207
+ var _a, _b;
208
+ let request;
209
+ let serverLoaderRequest;
210
+ let serverLoaderArgs;
211
+ if (process.env.SSR_BUILD_TARGET === "worker") {
212
+ const [ev] = args;
213
+ const { pathname, searchParams } = new URL(ev.request.url);
214
+ request = {
215
+ url: ev.request.url,
216
+ pathname,
217
+ headers: ev.request.headers,
218
+ query: {
219
+ route: searchParams.get("route"),
220
+ url: searchParams.get("url")
221
+ }
222
+ };
223
+ } else {
224
+ const [req] = args;
225
+ request = {
226
+ url: `${req.protocol}://${req.get("host")}${req.originalUrl}`,
227
+ pathname: req.url,
228
+ headers: req.headers,
229
+ query: {
230
+ route: (_a = req.query.route) == null ? void 0 : _a.toString(),
231
+ url: (_b = req.query.url) == null ? void 0 : _b.toString()
232
+ }
233
+ };
234
+ }
235
+ if (request.pathname.startsWith("/__serverLoader") && request.query.route && request.query.url) {
236
+ serverLoaderRequest = new Request(request.query.url, {
237
+ headers: request.headers
238
+ });
239
+ serverLoaderArgs = {
240
+ request: serverLoaderRequest
241
+ };
242
+ }
243
+ return {
244
+ request,
245
+ serverLoaderArgs
246
+ };
247
+ };
188
248
  function createRequestHandler(opts) {
189
249
  const jsxGeneratorDeferrer = createJSXGenerator(opts);
190
- return async function(req, res, next) {
191
- if (req.url.startsWith("/__serverLoader") && req.query.route) {
192
- const serverLoaderRequest = new Request(req.query.url, {
193
- headers: req.headers
194
- });
250
+ const normalizeHandlerArgs = (...args) => {
251
+ let ret;
252
+ const { request } = normalizeRequest(...args);
253
+ const replaceServerHTMLScript = `<script>!function(){var e=document.getElementById("${SERVER_INSERTED_HTML}");e&&(Array.from(e.children).forEach(e=>{document.head.appendChild(e)}),e.remove())}();</script>`;
254
+ if (process.env.SSR_BUILD_TARGET === "worker") {
255
+ const [ev, workerOpts] = args;
256
+ let asyncRespondWith;
257
+ ev.respondWith(new Promise((r) => asyncRespondWith = r));
258
+ ret = {
259
+ req: request,
260
+ async sendServerLoader(data) {
261
+ let res = new Response(JSON.stringify(data), {
262
+ headers: {
263
+ "content-type": "application/json; charset=utf-8"
264
+ },
265
+ status: 200
266
+ });
267
+ if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
268
+ res = await workerOpts.modifyResponse(res);
269
+ }
270
+ asyncRespondWith(res);
271
+ },
272
+ async sendPage(jsx) {
273
+ const [JSXProvider, serverInsertedHTMLCallbacks] = createJSXProvider(
274
+ opts.ServerInsertedHTMLContext.Provider
275
+ );
276
+ const stream = await ReactDomServer.renderToReadableStream(
277
+ import_react.default.createElement(JSXProvider, void 0, jsx.element),
278
+ {
279
+ // why not bootstrap umi.js
280
+ // ER will auto inject
281
+ // bootstrapScripts: [jsx.manifest.assets['umi.js'] || '/umi.js'],
282
+ onError(x) {
283
+ console.error(x);
284
+ }
285
+ }
286
+ );
287
+ const transformStream = new TransformStream({
288
+ flush(controller) {
289
+ if (serverInsertedHTMLCallbacks.size) {
290
+ const serverHTML = getGenerateStaticHTML(
291
+ serverInsertedHTMLCallbacks,
292
+ { wrapper: true }
293
+ );
294
+ controller.enqueue(serverHTML);
295
+ controller.enqueue(replaceServerHTMLScript);
296
+ }
297
+ }
298
+ });
299
+ let res = new Response(stream.pipeThrough(transformStream), {
300
+ headers: {
301
+ "content-type": "text/html; charset=utf-8"
302
+ },
303
+ status: 200
304
+ });
305
+ if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
306
+ res = await workerOpts.modifyResponse(res);
307
+ }
308
+ asyncRespondWith(res);
309
+ },
310
+ otherwise() {
311
+ throw new Error("no page resource");
312
+ }
313
+ };
314
+ } else {
315
+ const [_, res, next] = args;
316
+ ret = {
317
+ req: request,
318
+ sendServerLoader(data) {
319
+ res.status(200).json(data);
320
+ },
321
+ async sendPage(jsx) {
322
+ const [JSXProvider, serverInsertedHTMLCallbacks] = createJSXProvider(
323
+ opts.ServerInsertedHTMLContext.Provider
324
+ );
325
+ const writable = new import_stream.Writable();
326
+ res.type("html");
327
+ writable._write = (chunk, _encoding, cb) => {
328
+ res.write(chunk);
329
+ cb();
330
+ };
331
+ writable.on("finish", async () => {
332
+ if (serverInsertedHTMLCallbacks.size) {
333
+ res.write(
334
+ getGenerateStaticHTML(serverInsertedHTMLCallbacks, {
335
+ wrapper: true
336
+ })
337
+ );
338
+ res.write(replaceServerHTMLScript);
339
+ }
340
+ res.end();
341
+ });
342
+ const canUseCrossOriginInBootstrap = import_semver.default.gte(
343
+ opts.reactVersion,
344
+ "19.0.0-rc"
345
+ );
346
+ const umiPath = jsx.manifest.assets["umi.js"] || "/umi.js";
347
+ const stream = ReactDomServer.renderToPipeableStream(
348
+ import_react.default.createElement(JSXProvider, void 0, jsx.element),
349
+ {
350
+ // @ts-ignore
351
+ bootstrapScripts: canUseCrossOriginInBootstrap ? [
352
+ {
353
+ src: umiPath,
354
+ crossOrigin: "anonymous"
355
+ }
356
+ ] : [umiPath],
357
+ onShellReady() {
358
+ stream.pipe(writable);
359
+ },
360
+ onError(x) {
361
+ console.error(x);
362
+ }
363
+ }
364
+ );
365
+ },
366
+ otherwise: next
367
+ };
368
+ }
369
+ return ret;
370
+ };
371
+ return async function unifiedRequestHandler(...args) {
372
+ const { req, sendServerLoader, sendPage, otherwise } = normalizeHandlerArgs(
373
+ ...args
374
+ );
375
+ if (req.pathname.startsWith("/__serverLoader") && req.query.route && req.query.url) {
376
+ const { serverLoaderArgs } = normalizeRequest(...args);
195
377
  const data = await executeLoader({
196
378
  routeKey: req.query.route,
197
379
  routesWithServerLoader: opts.routesWithServerLoader,
198
- serverLoaderArgs: { request: serverLoaderRequest }
380
+ serverLoaderArgs
199
381
  });
200
- res.status(200).json(data);
201
- return;
202
- }
203
- const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
204
- const request = new Request(fullUrl, {
205
- headers: req.headers
206
- });
207
- const jsx = await jsxGeneratorDeferrer(req.url, { request });
208
- if (!jsx)
209
- return next();
210
- const writable = new import_stream.Writable();
211
- writable._write = (chunk, _encoding, next2) => {
212
- res.write(chunk);
213
- next2();
214
- };
215
- writable.on("finish", async () => {
216
- res.write(await getGenerateStaticHTML());
217
- res.end();
218
- });
219
- const stream = await ReactDomServer.renderToPipeableStream(jsx.element, {
220
- bootstrapScripts: [jsx.manifest.assets["umi.js"] || "/umi.js"],
221
- onShellReady() {
222
- stream.pipe(writable);
223
- },
224
- onError(x) {
225
- console.error(x);
382
+ await sendServerLoader(data);
383
+ } else {
384
+ const render = opts.pluginManager.applyPlugins({
385
+ key: "render",
386
+ type: "compose",
387
+ initialValue: () => jsxGeneratorDeferrer(req.pathname, {
388
+ request: new Request(req.url, {
389
+ headers: req.headers
390
+ })
391
+ })
392
+ });
393
+ const jsx = await render();
394
+ if (jsx) {
395
+ await sendPage(jsx);
396
+ } else {
397
+ await otherwise();
226
398
  }
227
- });
399
+ }
228
400
  };
229
401
  }
230
402
  function createUmiHandler(opts) {
403
+ let isWarned = false;
231
404
  return async function(req, params) {
405
+ if (!isWarned) {
406
+ console.warn(
407
+ "[umi] `renderRoot` is deprecated, please use `requestHandler` instead"
408
+ );
409
+ isWarned = true;
410
+ }
232
411
  const jsxGeneratorDeferrer = createJSXGenerator({
233
412
  ...opts,
234
413
  ...params
@@ -247,7 +426,14 @@ function createUmiHandler(opts) {
247
426
  };
248
427
  }
249
428
  function createUmiServerLoader(opts) {
429
+ let isWarned = false;
250
430
  return async function(req) {
431
+ if (!isWarned) {
432
+ console.warn(
433
+ "[umi] `serverLoader` is deprecated, please use `requestHandler` instead"
434
+ );
435
+ isWarned = true;
436
+ }
251
437
  const query = Object.fromEntries(new URL(req.url).searchParams);
252
438
  const serverLoaderRequest = new Request(query.url, {
253
439
  headers: req.headers
@@ -259,6 +445,14 @@ function createUmiServerLoader(opts) {
259
445
  });
260
446
  };
261
447
  }
448
+ function createAppRootElement(opts) {
449
+ return async (...args) => {
450
+ const jsxGeneratorDeferrer = createJSXGenerator(opts);
451
+ const { request, serverLoaderArgs } = normalizeRequest(...args);
452
+ const jsx = await jsxGeneratorDeferrer(request.pathname, serverLoaderArgs);
453
+ return () => jsx == null ? void 0 : jsx.element;
454
+ };
455
+ }
262
456
  function matchRoutesForSSR(reqUrl, routesById) {
263
457
  var _a;
264
458
  return ((_a = (0, import_react_router_dom.matchRoutes)(createClientRoutes({ routesById }), reqUrl)) == null ? void 0 : _a.map(
@@ -296,23 +490,24 @@ async function executeLoader(params) {
296
490
  return mod.serverLoader(serverLoaderArgs);
297
491
  }
298
492
  async function executeMetadataLoader(params) {
299
- const {
300
- routesWithServerLoader,
301
- routeKey,
302
- serverLoaderArgs,
303
- serverLoaderData
304
- } = params;
493
+ const { routesWithServerLoader, routeKey, serverLoaderData } = params;
305
494
  const mod = await routesWithServerLoader[routeKey]();
306
495
  if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
307
496
  return;
308
497
  }
309
- return mod.metadataLoader(
310
- serverLoaderData,
311
- serverLoaderArgs
498
+ const loaderDatas = mod.metadataLoader(
499
+ serverLoaderData
312
500
  );
501
+ const result = {};
502
+ Object.values(MetaLoaderResultKeys).forEach((key) => {
503
+ if (loaderDatas == null ? void 0 : loaderDatas[key])
504
+ result[key] = loaderDatas[key];
505
+ });
506
+ return result;
313
507
  }
314
508
  // Annotate the CommonJS export names for ESM import in node:
315
509
  0 && (module.exports = {
510
+ createAppRootElement,
316
511
  createMarkupGenerator,
317
512
  createUmiHandler,
318
513
  createUmiServerLoader
package/dist/types.d.ts CHANGED
@@ -1,3 +1,29 @@
1
+ export interface IOpts {
2
+ base: string;
3
+ routes: Record<string, {
4
+ path: string;
5
+ file: string;
6
+ id: string;
7
+ parentId?: string;
8
+ }>;
9
+ links?: Record<string, string>[];
10
+ metas?: Record<string, string>[];
11
+ styles?: (Record<string, string> | string)[];
12
+ favicons?: string[];
13
+ title?: string;
14
+ headScripts?: (Record<string, string> | string)[];
15
+ scripts?: (Record<string, string> | string)[];
16
+ mountElementId?: string;
17
+ esmScript?: boolean;
18
+ modifyHTML?: (html: string, args: {
19
+ path?: string;
20
+ }) => Promise<string>;
21
+ historyType?: 'hash' | 'browser';
22
+ }
23
+ export declare type IUserExtraRoute = string | {
24
+ path: string;
25
+ prerender: boolean;
26
+ };
1
27
  export interface IRoute {
2
28
  id: string;
3
29
  path?: string;
@@ -30,5 +56,13 @@ export interface IMetadata {
30
56
  lang?: string;
31
57
  metas?: IMetaTag[];
32
58
  }
59
+ export interface IhtmlPageOpts extends IMetadata {
60
+ headScripts?: (Record<string, string> | string)[];
61
+ links?: Record<string, string>[];
62
+ styles?: string[];
63
+ favicons?: string[];
64
+ scripts?: (Record<string, string> | string)[];
65
+ [key: string]: any;
66
+ }
33
67
  export declare type MetadataLoader<T = any> = (serverLoaderData: T, req?: IServerLoaderArgs) => LoaderReturn<IMetadata>;
34
68
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umijs/server",
3
- "version": "4.2.15",
3
+ "version": "4.3.1",
4
4
  "description": "@umijs/server",
5
5
  "homepage": "https://github.com/umijs/umi/tree/master/packages/server#readme",
6
6
  "bugs": "https://github.com/umijs/umi/issues",
@@ -16,10 +16,10 @@
16
16
  ],
17
17
  "dependencies": {
18
18
  "history": "5.3.0",
19
- "react": "18.1.0",
20
- "react-dom": "18.1.0",
19
+ "react": "18.3.1",
20
+ "react-dom": "18.3.1",
21
21
  "react-router-dom": "6.3.0",
22
- "@umijs/bundler-utils": "4.2.15"
22
+ "@umijs/bundler-utils": "4.3.1"
23
23
  },
24
24
  "publishConfig": {
25
25
  "access": "public"