@umijs/server 4.0.87 → 4.0.88
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 +9 -7
- package/dist/ssr.js +61 -11
- package/dist/types.d.ts +22 -0
- package/package.json +2 -2
package/dist/ssr.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import type { UmiRequest } from './types';
|
|
2
3
|
interface RouteLoaders {
|
|
3
4
|
[key: string]: () => Promise<any>;
|
|
4
5
|
}
|
|
5
6
|
export declare type ServerInsertedHTMLHook = (callbacks: () => React.ReactNode) => void;
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
interface CreateRequestServerlessOptions {
|
|
8
|
+
/**
|
|
9
|
+
* folder path for `build-manifest.json`
|
|
10
|
+
*/
|
|
11
|
+
sourceDir?: string;
|
|
8
12
|
}
|
|
9
|
-
interface CreateRequestHandlerOptions {
|
|
13
|
+
interface CreateRequestHandlerOptions extends CreateRequestServerlessOptions {
|
|
10
14
|
routesWithServerLoader: RouteLoaders;
|
|
11
15
|
PluginManager: any;
|
|
12
16
|
manifest: ((sourceDir?: string) => {
|
|
@@ -21,11 +25,9 @@ interface CreateRequestHandlerOptions {
|
|
|
21
25
|
createHistory: (opts: any) => any;
|
|
22
26
|
helmetContext?: any;
|
|
23
27
|
ServerInsertedHTMLContext: React.Context<ServerInsertedHTMLHook | null>;
|
|
24
|
-
withoutHTML?: boolean;
|
|
25
|
-
sourceDir?: string;
|
|
26
28
|
}
|
|
27
29
|
export declare function createMarkupGenerator(opts: CreateRequestHandlerOptions): (url: string) => Promise<unknown>;
|
|
28
30
|
export default function createRequestHandler(opts: CreateRequestHandlerOptions): (req: any, res: any, next: any) => Promise<any>;
|
|
29
|
-
export declare function createUmiHandler(opts: CreateRequestHandlerOptions): (req:
|
|
30
|
-
export declare function createUmiServerLoader(opts: CreateRequestHandlerOptions): (req:
|
|
31
|
+
export declare function createUmiHandler(opts: CreateRequestHandlerOptions): (req: UmiRequest, params?: CreateRequestHandlerOptions) => Promise<NodeJS.ReadableStream>;
|
|
32
|
+
export declare function createUmiServerLoader(opts: CreateRequestHandlerOptions): (req: UmiRequest) => Promise<any>;
|
|
31
33
|
export {};
|
package/dist/ssr.js
CHANGED
|
@@ -84,10 +84,26 @@ function createJSXGenerator(opts) {
|
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
86
86
|
const loaderData = {};
|
|
87
|
+
const metadata = {};
|
|
87
88
|
await Promise.all(
|
|
88
89
|
matches.filter((id) => routes[id].hasServerLoader).map(
|
|
89
90
|
(id) => new Promise(async (resolve) => {
|
|
90
|
-
loaderData[id] = await executeLoader(
|
|
91
|
+
loaderData[id] = await executeLoader({
|
|
92
|
+
routeKey: id,
|
|
93
|
+
routesWithServerLoader,
|
|
94
|
+
serverLoaderArgs
|
|
95
|
+
});
|
|
96
|
+
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
|
+
);
|
|
106
|
+
}
|
|
91
107
|
resolve();
|
|
92
108
|
})
|
|
93
109
|
)
|
|
@@ -100,7 +116,7 @@ function createJSXGenerator(opts) {
|
|
|
100
116
|
location: url,
|
|
101
117
|
manifest,
|
|
102
118
|
loaderData,
|
|
103
|
-
|
|
119
|
+
metadata
|
|
104
120
|
};
|
|
105
121
|
const element = await opts.getClientRootComponent(
|
|
106
122
|
context
|
|
@@ -173,15 +189,19 @@ function createRequestHandler(opts) {
|
|
|
173
189
|
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
174
190
|
return async function(req, res, next) {
|
|
175
191
|
if (req.url.startsWith("/__serverLoader") && req.query.route) {
|
|
176
|
-
const
|
|
177
|
-
req.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
192
|
+
const serverLoaderRequest = new Request(req.query.url, {
|
|
193
|
+
headers: req.headers
|
|
194
|
+
});
|
|
195
|
+
const data = await executeLoader({
|
|
196
|
+
routeKey: req.query.route,
|
|
197
|
+
routesWithServerLoader: opts.routesWithServerLoader,
|
|
198
|
+
serverLoaderArgs: { request: serverLoaderRequest }
|
|
199
|
+
});
|
|
181
200
|
res.status(200).json(data);
|
|
182
201
|
return;
|
|
183
202
|
}
|
|
184
|
-
const
|
|
203
|
+
const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
|
|
204
|
+
const request = new Request(fullUrl, {
|
|
185
205
|
headers: req.headers
|
|
186
206
|
});
|
|
187
207
|
const jsx = await jsxGeneratorDeferrer(req.url, { request });
|
|
@@ -213,7 +233,13 @@ function createUmiHandler(opts) {
|
|
|
213
233
|
...opts,
|
|
214
234
|
...params
|
|
215
235
|
});
|
|
216
|
-
const
|
|
236
|
+
const loaderArgs = {
|
|
237
|
+
request: req
|
|
238
|
+
};
|
|
239
|
+
const jsx = await jsxGeneratorDeferrer(
|
|
240
|
+
new URL(req.url).pathname,
|
|
241
|
+
loaderArgs
|
|
242
|
+
);
|
|
217
243
|
if (!jsx) {
|
|
218
244
|
throw new Error("no page resource");
|
|
219
245
|
}
|
|
@@ -223,7 +249,14 @@ function createUmiHandler(opts) {
|
|
|
223
249
|
function createUmiServerLoader(opts) {
|
|
224
250
|
return async function(req) {
|
|
225
251
|
const query = Object.fromEntries(new URL(req.url).searchParams);
|
|
226
|
-
|
|
252
|
+
const serverLoaderRequest = new Request(query.url, {
|
|
253
|
+
headers: req.headers
|
|
254
|
+
});
|
|
255
|
+
return await executeLoader({
|
|
256
|
+
routeKey: query.route,
|
|
257
|
+
routesWithServerLoader: opts.routesWithServerLoader,
|
|
258
|
+
serverLoaderArgs: { request: serverLoaderRequest }
|
|
259
|
+
});
|
|
227
260
|
};
|
|
228
261
|
}
|
|
229
262
|
function matchRoutesForSSR(reqUrl, routesById) {
|
|
@@ -254,13 +287,30 @@ function createClientRoute(route) {
|
|
|
254
287
|
index
|
|
255
288
|
};
|
|
256
289
|
}
|
|
257
|
-
async function executeLoader(
|
|
290
|
+
async function executeLoader(params) {
|
|
291
|
+
const { routeKey, routesWithServerLoader, serverLoaderArgs } = params;
|
|
258
292
|
const mod = await routesWithServerLoader[routeKey]();
|
|
259
293
|
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
260
294
|
return;
|
|
261
295
|
}
|
|
262
296
|
return mod.serverLoader(serverLoaderArgs);
|
|
263
297
|
}
|
|
298
|
+
async function executeMetadataLoader(params) {
|
|
299
|
+
const {
|
|
300
|
+
routesWithServerLoader,
|
|
301
|
+
routeKey,
|
|
302
|
+
serverLoaderArgs,
|
|
303
|
+
serverLoaderData
|
|
304
|
+
} = params;
|
|
305
|
+
const mod = await routesWithServerLoader[routeKey]();
|
|
306
|
+
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
return mod.metadataLoader(
|
|
310
|
+
serverLoaderData,
|
|
311
|
+
serverLoaderArgs
|
|
312
|
+
);
|
|
313
|
+
}
|
|
264
314
|
// Annotate the CommonJS export names for ESM import in node:
|
|
265
315
|
0 && (module.exports = {
|
|
266
316
|
createMarkupGenerator,
|
package/dist/types.d.ts
CHANGED
|
@@ -10,3 +10,25 @@ export interface IRoutesById {
|
|
|
10
10
|
export interface IRouteCustom extends IRoute {
|
|
11
11
|
[key: string]: any;
|
|
12
12
|
}
|
|
13
|
+
declare type LoaderReturn<T> = T | Promise<T>;
|
|
14
|
+
export declare type UmiRequest = Partial<Request> & Pick<Request, 'url' | 'headers'>;
|
|
15
|
+
export interface IServerLoaderArgs {
|
|
16
|
+
request: UmiRequest;
|
|
17
|
+
}
|
|
18
|
+
export declare type ServerLoader<T = any> = (req?: IServerLoaderArgs) => LoaderReturn<T>;
|
|
19
|
+
export interface IMetaTag {
|
|
20
|
+
name: string;
|
|
21
|
+
content: string;
|
|
22
|
+
}
|
|
23
|
+
export interface IMetadata {
|
|
24
|
+
title?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
keywords?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* @default 'en'
|
|
29
|
+
*/
|
|
30
|
+
lang?: string;
|
|
31
|
+
metas?: IMetaTag[];
|
|
32
|
+
}
|
|
33
|
+
export declare type MetadataLoader<T = any> = (serverLoaderData: T, req?: IServerLoaderArgs) => LoaderReturn<IMetadata>;
|
|
34
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umijs/server",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.88",
|
|
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.
|
|
22
|
+
"@umijs/bundler-utils": "4.0.88"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
25
25
|
"access": "public"
|