@umijs/server 4.0.0-canary.20240402.1 → 4.0.0-canary.20240423.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 +101 -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
|
};
|
|
@@ -190,6 +193,7 @@ function createMarkupGenerator(opts) {
|
|
|
190
193
|
onShellReady() {
|
|
191
194
|
stream.pipe(writable);
|
|
192
195
|
},
|
|
196
|
+
bootstrapScripts: [jsx.manifest.assets["umi.js"] || "/umi.js"],
|
|
193
197
|
onError: reject
|
|
194
198
|
}
|
|
195
199
|
);
|
|
@@ -198,25 +202,60 @@ function createMarkupGenerator(opts) {
|
|
|
198
202
|
return "";
|
|
199
203
|
};
|
|
200
204
|
}
|
|
205
|
+
var normalizeRequest = (...args) => {
|
|
206
|
+
var _a, _b;
|
|
207
|
+
let request;
|
|
208
|
+
let serverLoaderRequest;
|
|
209
|
+
let serverLoaderArgs;
|
|
210
|
+
if (process.env.SSR_BUILD_TARGET === "worker") {
|
|
211
|
+
const [ev] = args;
|
|
212
|
+
const { pathname, searchParams } = new URL(ev.request.url);
|
|
213
|
+
request = {
|
|
214
|
+
url: ev.request.url,
|
|
215
|
+
pathname,
|
|
216
|
+
headers: ev.request.headers,
|
|
217
|
+
query: {
|
|
218
|
+
route: searchParams.get("route"),
|
|
219
|
+
url: searchParams.get("url")
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
} else {
|
|
223
|
+
const [req] = args;
|
|
224
|
+
request = {
|
|
225
|
+
url: `${req.protocol}://${req.get("host")}${req.originalUrl}`,
|
|
226
|
+
pathname: req.url,
|
|
227
|
+
headers: req.headers,
|
|
228
|
+
query: {
|
|
229
|
+
route: (_a = req.query.route) == null ? void 0 : _a.toString(),
|
|
230
|
+
url: (_b = req.query.url) == null ? void 0 : _b.toString()
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
if (request.pathname.startsWith("/__serverLoader") && request.query.route && request.query.url) {
|
|
235
|
+
serverLoaderRequest = new Request(request.query.url, {
|
|
236
|
+
headers: request.headers
|
|
237
|
+
});
|
|
238
|
+
serverLoaderArgs = {
|
|
239
|
+
request: serverLoaderRequest
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
request,
|
|
244
|
+
serverLoaderArgs
|
|
245
|
+
};
|
|
246
|
+
};
|
|
201
247
|
function createRequestHandler(opts) {
|
|
202
248
|
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
203
249
|
const normalizeHandlerArgs = (...args) => {
|
|
204
|
-
var _a, _b;
|
|
205
250
|
let ret;
|
|
251
|
+
const { request } = normalizeRequest(...args);
|
|
206
252
|
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 (
|
|
253
|
+
if (process.env.SSR_BUILD_TARGET === "worker") {
|
|
208
254
|
const [ev, workerOpts] = args;
|
|
209
|
-
|
|
255
|
+
let asyncRespondWith;
|
|
256
|
+
ev.respondWith(new Promise((r) => asyncRespondWith = r));
|
|
210
257
|
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
|
-
},
|
|
258
|
+
req: request,
|
|
220
259
|
async sendServerLoader(data) {
|
|
221
260
|
let res = new Response(JSON.stringify(data), {
|
|
222
261
|
headers: {
|
|
@@ -227,7 +266,7 @@ function createRequestHandler(opts) {
|
|
|
227
266
|
if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
|
|
228
267
|
res = await workerOpts.modifyResponse(res);
|
|
229
268
|
}
|
|
230
|
-
|
|
269
|
+
asyncRespondWith(res);
|
|
231
270
|
},
|
|
232
271
|
async sendPage(jsx) {
|
|
233
272
|
const [JSXProvider, serverInsertedHTMLCallbacks] = createJSXProvider(
|
|
@@ -254,8 +293,7 @@ function createRequestHandler(opts) {
|
|
|
254
293
|
}
|
|
255
294
|
}
|
|
256
295
|
});
|
|
257
|
-
stream.pipeThrough(transformStream)
|
|
258
|
-
let res = new Response(stream, {
|
|
296
|
+
let res = new Response(stream.pipeThrough(transformStream), {
|
|
259
297
|
headers: {
|
|
260
298
|
"content-type": "text/html; charset=utf-8"
|
|
261
299
|
},
|
|
@@ -264,24 +302,16 @@ function createRequestHandler(opts) {
|
|
|
264
302
|
if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
|
|
265
303
|
res = await workerOpts.modifyResponse(res);
|
|
266
304
|
}
|
|
267
|
-
|
|
305
|
+
asyncRespondWith(res);
|
|
268
306
|
},
|
|
269
307
|
otherwise() {
|
|
270
308
|
throw new Error("no page resource");
|
|
271
309
|
}
|
|
272
310
|
};
|
|
273
311
|
} else {
|
|
274
|
-
const [
|
|
312
|
+
const [_, res, next] = args;
|
|
275
313
|
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
|
-
},
|
|
314
|
+
req: request,
|
|
285
315
|
sendServerLoader(data) {
|
|
286
316
|
res.status(200).json(data);
|
|
287
317
|
},
|
|
@@ -325,28 +355,33 @@ function createRequestHandler(opts) {
|
|
|
325
355
|
return ret;
|
|
326
356
|
};
|
|
327
357
|
return async function unifiedRequestHandler(...args) {
|
|
328
|
-
let jsx;
|
|
329
358
|
const { req, sendServerLoader, sendPage, otherwise } = normalizeHandlerArgs(
|
|
330
359
|
...args
|
|
331
360
|
);
|
|
332
361
|
if (req.pathname.startsWith("/__serverLoader") && req.query.route && req.query.url) {
|
|
333
|
-
const
|
|
334
|
-
headers: req.headers
|
|
335
|
-
});
|
|
362
|
+
const { serverLoaderArgs } = normalizeRequest(...args);
|
|
336
363
|
const data = await executeLoader({
|
|
337
364
|
routeKey: req.query.route,
|
|
338
365
|
routesWithServerLoader: opts.routesWithServerLoader,
|
|
339
|
-
serverLoaderArgs
|
|
366
|
+
serverLoaderArgs
|
|
340
367
|
});
|
|
341
368
|
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
369
|
} else {
|
|
349
|
-
|
|
370
|
+
const render = opts.pluginManager.applyPlugins({
|
|
371
|
+
key: "render",
|
|
372
|
+
type: "compose",
|
|
373
|
+
initialValue: () => jsxGeneratorDeferrer(req.pathname, {
|
|
374
|
+
request: new Request(req.url, {
|
|
375
|
+
headers: req.headers
|
|
376
|
+
})
|
|
377
|
+
})
|
|
378
|
+
});
|
|
379
|
+
const jsx = await render();
|
|
380
|
+
if (jsx) {
|
|
381
|
+
await sendPage(jsx);
|
|
382
|
+
} else {
|
|
383
|
+
await otherwise();
|
|
384
|
+
}
|
|
350
385
|
}
|
|
351
386
|
};
|
|
352
387
|
}
|
|
@@ -396,6 +431,14 @@ function createUmiServerLoader(opts) {
|
|
|
396
431
|
});
|
|
397
432
|
};
|
|
398
433
|
}
|
|
434
|
+
function createAppRootElement(opts) {
|
|
435
|
+
return async (...args) => {
|
|
436
|
+
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
437
|
+
const { request, serverLoaderArgs } = normalizeRequest(...args);
|
|
438
|
+
const jsx = await jsxGeneratorDeferrer(request.pathname, serverLoaderArgs);
|
|
439
|
+
return () => jsx == null ? void 0 : jsx.element;
|
|
440
|
+
};
|
|
441
|
+
}
|
|
399
442
|
function matchRoutesForSSR(reqUrl, routesById) {
|
|
400
443
|
var _a;
|
|
401
444
|
return ((_a = (0, import_react_router_dom.matchRoutes)(createClientRoutes({ routesById }), reqUrl)) == null ? void 0 : _a.map(
|
|
@@ -438,20 +481,19 @@ async function executeMetadataLoader(params) {
|
|
|
438
481
|
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
439
482
|
return;
|
|
440
483
|
}
|
|
441
|
-
const
|
|
484
|
+
const loaderDatas = mod.metadataLoader(
|
|
442
485
|
serverLoaderData
|
|
443
486
|
);
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
{}
|
|
451
|
-
);
|
|
487
|
+
const result = {};
|
|
488
|
+
Object.values(MetaLoaderResultKeys).forEach((key) => {
|
|
489
|
+
if (loaderDatas == null ? void 0 : loaderDatas[key])
|
|
490
|
+
result[key] = loaderDatas[key];
|
|
491
|
+
});
|
|
492
|
+
return result;
|
|
452
493
|
}
|
|
453
494
|
// Annotate the CommonJS export names for ESM import in node:
|
|
454
495
|
0 && (module.exports = {
|
|
496
|
+
createAppRootElement,
|
|
455
497
|
createMarkupGenerator,
|
|
456
498
|
createUmiHandler,
|
|
457
499
|
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.20240423.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.20240423.1"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
25
25
|
"access": "public"
|