@umijs/server 4.0.0-canary.20240402.1 → 4.0.0-canary.20240419.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 +4 -5
- package/dist/ssr.js +100 -59
- package/dist/types.d.ts +1 -11
- package/package.json +2 -2
package/dist/ssr.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference lib="webworker" />
|
|
2
2
|
import type { RequestHandler } from '@umijs/bundler-utils/compiled/express';
|
|
3
3
|
import React from 'react';
|
|
4
|
-
import type {
|
|
4
|
+
import type { IhtmlPageOpts, UmiRequest } from './types';
|
|
5
5
|
interface RouteLoaders {
|
|
6
6
|
[key: string]: () => Promise<any>;
|
|
7
7
|
}
|
|
@@ -14,20 +14,18 @@ interface CreateRequestServerlessOptions {
|
|
|
14
14
|
}
|
|
15
15
|
interface CreateRequestHandlerOptions extends CreateRequestServerlessOptions {
|
|
16
16
|
routesWithServerLoader: RouteLoaders;
|
|
17
|
-
|
|
17
|
+
pluginManager: any;
|
|
18
18
|
manifest: ((sourceDir?: string) => {
|
|
19
19
|
assets: Record<string, string>;
|
|
20
20
|
}) | {
|
|
21
21
|
assets: Record<string, string>;
|
|
22
22
|
};
|
|
23
|
-
getPlugins: () => any;
|
|
24
|
-
getValidKeys: () => any;
|
|
25
23
|
getRoutes: (PluginManager: any) => any;
|
|
26
24
|
getClientRootComponent: (PluginManager: any) => any;
|
|
27
25
|
createHistory: (opts: any) => any;
|
|
28
26
|
helmetContext?: any;
|
|
29
27
|
ServerInsertedHTMLContext: React.Context<ServerInsertedHTMLHook | null>;
|
|
30
|
-
|
|
28
|
+
htmlPageOpts: IhtmlPageOpts;
|
|
31
29
|
renderFromRoot: boolean;
|
|
32
30
|
mountElementId: string;
|
|
33
31
|
}
|
|
@@ -42,4 +40,5 @@ declare type IWorkerRequestHandlerArgs = [
|
|
|
42
40
|
export default function createRequestHandler(opts: CreateRequestHandlerOptions): (...args: IExpressRequestHandlerArgs | IWorkerRequestHandlerArgs) => Promise<void>;
|
|
43
41
|
export declare function createUmiHandler(opts: CreateRequestHandlerOptions): (req: UmiRequest, params?: CreateRequestHandlerOptions) => Promise<NodeJS.ReadableStream>;
|
|
44
42
|
export declare function createUmiServerLoader(opts: CreateRequestHandlerOptions): (req: UmiRequest) => Promise<any>;
|
|
43
|
+
export declare function createAppRootElement(opts: CreateRequestHandlerOptions): (...args: IExpressRequestHandlerArgs | IWorkerRequestHandlerArgs) => Promise<() => React.ReactElement<any, string | React.JSXElementConstructor<any>> | undefined>;
|
|
45
44
|
export {};
|
package/dist/ssr.js
CHANGED
|
@@ -29,6 +29,7 @@ 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,
|
|
@@ -39,6 +40,14 @@ var import_react = __toESM(require("react"));
|
|
|
39
40
|
var ReactDomServer = __toESM(require("react-dom/server"));
|
|
40
41
|
var import_react_router_dom = require("react-router-dom");
|
|
41
42
|
var import_stream = require("stream");
|
|
43
|
+
var MetaLoaderResultKeys = /* @__PURE__ */ ((MetaLoaderResultKeys2) => {
|
|
44
|
+
MetaLoaderResultKeys2["Title"] = "title";
|
|
45
|
+
MetaLoaderResultKeys2["Description"] = "description";
|
|
46
|
+
MetaLoaderResultKeys2["Keywords"] = "keywords";
|
|
47
|
+
MetaLoaderResultKeys2["Lang"] = "lang";
|
|
48
|
+
MetaLoaderResultKeys2["Metas"] = "metas";
|
|
49
|
+
return MetaLoaderResultKeys2;
|
|
50
|
+
})(MetaLoaderResultKeys || {});
|
|
42
51
|
var createJSXProvider = (Provider) => {
|
|
43
52
|
const serverInsertedHTMLCallbacks = /* @__PURE__ */ new Set();
|
|
44
53
|
const JSXProvider = (props) => {
|
|
@@ -59,20 +68,14 @@ function createJSXGenerator(opts) {
|
|
|
59
68
|
return async (url, serverLoaderArgs) => {
|
|
60
69
|
const {
|
|
61
70
|
routesWithServerLoader,
|
|
62
|
-
|
|
63
|
-
getPlugins,
|
|
64
|
-
getValidKeys,
|
|
71
|
+
pluginManager,
|
|
65
72
|
getRoutes,
|
|
66
73
|
createHistory,
|
|
67
74
|
sourceDir
|
|
68
75
|
} = opts;
|
|
69
76
|
createHistory({ type: "memory", initialEntries: [url], initialIndex: 1 });
|
|
70
|
-
const pluginManager = PluginManager.create({
|
|
71
|
-
plugins: getPlugins(),
|
|
72
|
-
validKeys: getValidKeys()
|
|
73
|
-
});
|
|
74
77
|
const { routes, routeComponents } = await getRoutes(pluginManager);
|
|
75
|
-
|
|
78
|
+
pluginManager.applyPlugins({
|
|
76
79
|
key: "patchRoutes",
|
|
77
80
|
type: "event",
|
|
78
81
|
args: {
|
|
@@ -100,11 +103,11 @@ function createJSXGenerator(opts) {
|
|
|
100
103
|
serverLoaderArgs,
|
|
101
104
|
serverLoaderData: loaderData[id]
|
|
102
105
|
});
|
|
103
|
-
Object.entries(metadataLoaderData).forEach(([k, v]) => {
|
|
106
|
+
metadataLoaderData && Object.entries(metadataLoaderData).forEach(([k, v]) => {
|
|
104
107
|
if (Array.isArray(v)) {
|
|
105
|
-
opts.
|
|
108
|
+
opts.htmlPageOpts[k] = (opts.htmlPageOpts[k] || []).concat(v);
|
|
106
109
|
} else {
|
|
107
|
-
opts.
|
|
110
|
+
opts.htmlPageOpts[k] = v;
|
|
108
111
|
}
|
|
109
112
|
});
|
|
110
113
|
}
|
|
@@ -120,7 +123,7 @@ function createJSXGenerator(opts) {
|
|
|
120
123
|
location: url,
|
|
121
124
|
manifest,
|
|
122
125
|
loaderData,
|
|
123
|
-
|
|
126
|
+
htmlPageOpts: opts.htmlPageOpts,
|
|
124
127
|
renderFromRoot: opts.renderFromRoot,
|
|
125
128
|
mountElementId: opts.mountElementId
|
|
126
129
|
};
|
|
@@ -198,25 +201,60 @@ function createMarkupGenerator(opts) {
|
|
|
198
201
|
return "";
|
|
199
202
|
};
|
|
200
203
|
}
|
|
204
|
+
var normalizeRequest = (...args) => {
|
|
205
|
+
var _a, _b;
|
|
206
|
+
let request;
|
|
207
|
+
let serverLoaderRequest;
|
|
208
|
+
let serverLoaderArgs;
|
|
209
|
+
if (process.env.SSR_BUILD_TARGET === "worker") {
|
|
210
|
+
const [ev] = args;
|
|
211
|
+
const { pathname, searchParams } = new URL(ev.request.url);
|
|
212
|
+
request = {
|
|
213
|
+
url: ev.request.url,
|
|
214
|
+
pathname,
|
|
215
|
+
headers: ev.request.headers,
|
|
216
|
+
query: {
|
|
217
|
+
route: searchParams.get("route"),
|
|
218
|
+
url: searchParams.get("url")
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
} else {
|
|
222
|
+
const [req] = args;
|
|
223
|
+
request = {
|
|
224
|
+
url: `${req.protocol}://${req.get("host")}${req.originalUrl}`,
|
|
225
|
+
pathname: req.url,
|
|
226
|
+
headers: req.headers,
|
|
227
|
+
query: {
|
|
228
|
+
route: (_a = req.query.route) == null ? void 0 : _a.toString(),
|
|
229
|
+
url: (_b = req.query.url) == null ? void 0 : _b.toString()
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
if (request.pathname.startsWith("/__serverLoader") && request.query.route && request.query.url) {
|
|
234
|
+
serverLoaderRequest = new Request(request.query.url, {
|
|
235
|
+
headers: request.headers
|
|
236
|
+
});
|
|
237
|
+
serverLoaderArgs = {
|
|
238
|
+
request: serverLoaderRequest
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
request,
|
|
243
|
+
serverLoaderArgs
|
|
244
|
+
};
|
|
245
|
+
};
|
|
201
246
|
function createRequestHandler(opts) {
|
|
202
247
|
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
203
248
|
const normalizeHandlerArgs = (...args) => {
|
|
204
|
-
var _a, _b;
|
|
205
249
|
let ret;
|
|
250
|
+
const { request } = normalizeRequest(...args);
|
|
206
251
|
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>`;
|
|
207
|
-
if (
|
|
252
|
+
if (process.env.SSR_BUILD_TARGET === "worker") {
|
|
208
253
|
const [ev, workerOpts] = args;
|
|
209
|
-
|
|
254
|
+
let asyncRespondWith;
|
|
255
|
+
ev.respondWith(new Promise((r) => asyncRespondWith = r));
|
|
210
256
|
ret = {
|
|
211
|
-
req:
|
|
212
|
-
url: ev.request.url,
|
|
213
|
-
pathname,
|
|
214
|
-
headers: ev.request.headers,
|
|
215
|
-
query: {
|
|
216
|
-
route: searchParams.get("route"),
|
|
217
|
-
url: searchParams.get("url")
|
|
218
|
-
}
|
|
219
|
-
},
|
|
257
|
+
req: request,
|
|
220
258
|
async sendServerLoader(data) {
|
|
221
259
|
let res = new Response(JSON.stringify(data), {
|
|
222
260
|
headers: {
|
|
@@ -227,7 +265,7 @@ function createRequestHandler(opts) {
|
|
|
227
265
|
if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
|
|
228
266
|
res = await workerOpts.modifyResponse(res);
|
|
229
267
|
}
|
|
230
|
-
|
|
268
|
+
asyncRespondWith(res);
|
|
231
269
|
},
|
|
232
270
|
async sendPage(jsx) {
|
|
233
271
|
const [JSXProvider, serverInsertedHTMLCallbacks] = createJSXProvider(
|
|
@@ -254,8 +292,7 @@ function createRequestHandler(opts) {
|
|
|
254
292
|
}
|
|
255
293
|
}
|
|
256
294
|
});
|
|
257
|
-
stream.pipeThrough(transformStream)
|
|
258
|
-
let res = new Response(stream, {
|
|
295
|
+
let res = new Response(stream.pipeThrough(transformStream), {
|
|
259
296
|
headers: {
|
|
260
297
|
"content-type": "text/html; charset=utf-8"
|
|
261
298
|
},
|
|
@@ -264,24 +301,16 @@ function createRequestHandler(opts) {
|
|
|
264
301
|
if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
|
|
265
302
|
res = await workerOpts.modifyResponse(res);
|
|
266
303
|
}
|
|
267
|
-
|
|
304
|
+
asyncRespondWith(res);
|
|
268
305
|
},
|
|
269
306
|
otherwise() {
|
|
270
307
|
throw new Error("no page resource");
|
|
271
308
|
}
|
|
272
309
|
};
|
|
273
310
|
} else {
|
|
274
|
-
const [
|
|
311
|
+
const [_, res, next] = args;
|
|
275
312
|
ret = {
|
|
276
|
-
req:
|
|
277
|
-
url: `${req.protocol}://${req.get("host")}${req.originalUrl}`,
|
|
278
|
-
pathname: req.url,
|
|
279
|
-
headers: req.headers,
|
|
280
|
-
query: {
|
|
281
|
-
route: (_a = req.query.route) == null ? void 0 : _a.toString(),
|
|
282
|
-
url: (_b = req.query.url) == null ? void 0 : _b.toString()
|
|
283
|
-
}
|
|
284
|
-
},
|
|
313
|
+
req: request,
|
|
285
314
|
sendServerLoader(data) {
|
|
286
315
|
res.status(200).json(data);
|
|
287
316
|
},
|
|
@@ -325,28 +354,33 @@ function createRequestHandler(opts) {
|
|
|
325
354
|
return ret;
|
|
326
355
|
};
|
|
327
356
|
return async function unifiedRequestHandler(...args) {
|
|
328
|
-
let jsx;
|
|
329
357
|
const { req, sendServerLoader, sendPage, otherwise } = normalizeHandlerArgs(
|
|
330
358
|
...args
|
|
331
359
|
);
|
|
332
360
|
if (req.pathname.startsWith("/__serverLoader") && req.query.route && req.query.url) {
|
|
333
|
-
const
|
|
334
|
-
headers: req.headers
|
|
335
|
-
});
|
|
361
|
+
const { serverLoaderArgs } = normalizeRequest(...args);
|
|
336
362
|
const data = await executeLoader({
|
|
337
363
|
routeKey: req.query.route,
|
|
338
364
|
routesWithServerLoader: opts.routesWithServerLoader,
|
|
339
|
-
serverLoaderArgs
|
|
365
|
+
serverLoaderArgs
|
|
340
366
|
});
|
|
341
367
|
await sendServerLoader(data);
|
|
342
|
-
} else if (jsx = await jsxGeneratorDeferrer(req.pathname, {
|
|
343
|
-
request: new Request(req.url, {
|
|
344
|
-
headers: req.headers
|
|
345
|
-
})
|
|
346
|
-
})) {
|
|
347
|
-
await sendPage(jsx);
|
|
348
368
|
} else {
|
|
349
|
-
|
|
369
|
+
const render = opts.pluginManager.applyPlugins({
|
|
370
|
+
key: "render",
|
|
371
|
+
type: "compose",
|
|
372
|
+
initialValue: () => jsxGeneratorDeferrer(req.pathname, {
|
|
373
|
+
request: new Request(req.url, {
|
|
374
|
+
headers: req.headers
|
|
375
|
+
})
|
|
376
|
+
})
|
|
377
|
+
});
|
|
378
|
+
const jsx = await render();
|
|
379
|
+
if (jsx) {
|
|
380
|
+
await sendPage(jsx);
|
|
381
|
+
} else {
|
|
382
|
+
await otherwise();
|
|
383
|
+
}
|
|
350
384
|
}
|
|
351
385
|
};
|
|
352
386
|
}
|
|
@@ -396,6 +430,14 @@ function createUmiServerLoader(opts) {
|
|
|
396
430
|
});
|
|
397
431
|
};
|
|
398
432
|
}
|
|
433
|
+
function createAppRootElement(opts) {
|
|
434
|
+
return async (...args) => {
|
|
435
|
+
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
436
|
+
const { request, serverLoaderArgs } = normalizeRequest(...args);
|
|
437
|
+
const jsx = await jsxGeneratorDeferrer(request.pathname, serverLoaderArgs);
|
|
438
|
+
return () => jsx == null ? void 0 : jsx.element;
|
|
439
|
+
};
|
|
440
|
+
}
|
|
399
441
|
function matchRoutesForSSR(reqUrl, routesById) {
|
|
400
442
|
var _a;
|
|
401
443
|
return ((_a = (0, import_react_router_dom.matchRoutes)(createClientRoutes({ routesById }), reqUrl)) == null ? void 0 : _a.map(
|
|
@@ -438,20 +480,19 @@ async function executeMetadataLoader(params) {
|
|
|
438
480
|
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
439
481
|
return;
|
|
440
482
|
}
|
|
441
|
-
const
|
|
483
|
+
const loaderDatas = mod.metadataLoader(
|
|
442
484
|
serverLoaderData
|
|
443
485
|
);
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
{}
|
|
451
|
-
);
|
|
486
|
+
const result = {};
|
|
487
|
+
Object.values(MetaLoaderResultKeys).forEach((key) => {
|
|
488
|
+
if (loaderDatas == null ? void 0 : loaderDatas[key])
|
|
489
|
+
result[key] = loaderDatas[key];
|
|
490
|
+
});
|
|
491
|
+
return result;
|
|
452
492
|
}
|
|
453
493
|
// Annotate the CommonJS export names for ESM import in node:
|
|
454
494
|
0 && (module.exports = {
|
|
495
|
+
createAppRootElement,
|
|
455
496
|
createMarkupGenerator,
|
|
456
497
|
createUmiHandler,
|
|
457
498
|
createUmiServerLoader
|
package/dist/types.d.ts
CHANGED
|
@@ -55,18 +55,8 @@ export interface IMetadata {
|
|
|
55
55
|
*/
|
|
56
56
|
lang?: string;
|
|
57
57
|
metas?: IMetaTag[];
|
|
58
|
-
headScripts?: (Record<string, string> | string)[];
|
|
59
|
-
links?: Record<string, string>[];
|
|
60
|
-
styles?: string[];
|
|
61
|
-
favicons?: string[];
|
|
62
|
-
scripts?: (Record<string, string> | string)[];
|
|
63
|
-
[key: string]: any;
|
|
64
58
|
}
|
|
65
|
-
export interface
|
|
66
|
-
title?: string;
|
|
67
|
-
description?: string;
|
|
68
|
-
keywords?: string[];
|
|
69
|
-
metas?: IMetaTag[];
|
|
59
|
+
export interface IhtmlPageOpts extends IMetadata {
|
|
70
60
|
headScripts?: (Record<string, string> | string)[];
|
|
71
61
|
links?: Record<string, string>[];
|
|
72
62
|
styles?: string[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umijs/server",
|
|
3
|
-
"version": "4.0.0-canary.
|
|
3
|
+
"version": "4.0.0-canary.20240419.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",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"react": "18.1.0",
|
|
20
20
|
"react-dom": "18.1.0",
|
|
21
21
|
"react-router-dom": "6.3.0",
|
|
22
|
-
"@umijs/bundler-utils": "4.0.0-canary.
|
|
22
|
+
"@umijs/bundler-utils": "4.0.0-canary.20240419.1"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
25
25
|
"access": "public"
|