@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 +20 -5
- package/dist/ssr.js +269 -74
- package/dist/types.d.ts +34 -0
- package/package.json +4 -4
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
133
|
-
|
|
134
|
-
|
|
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 =
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
|
380
|
+
serverLoaderArgs
|
|
199
381
|
});
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
20
|
-
"react-dom": "18.1
|
|
19
|
+
"react": "18.3.1",
|
|
20
|
+
"react-dom": "18.3.1",
|
|
21
21
|
"react-router-dom": "6.3.0",
|
|
22
|
-
"@umijs/bundler-utils": "4.
|
|
22
|
+
"@umijs/bundler-utils": "4.3.1"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
25
25
|
"access": "public"
|