@umijs/server 4.0.86 → 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 +10 -5
- package/dist/ssr.js +66 -12
- package/dist/types.d.ts +22 -0
- package/package.json +2 -2
package/dist/ssr.d.ts
CHANGED
|
@@ -1,9 +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
|
-
interface
|
|
7
|
+
interface CreateRequestServerlessOptions {
|
|
8
|
+
/**
|
|
9
|
+
* folder path for `build-manifest.json`
|
|
10
|
+
*/
|
|
11
|
+
sourceDir?: string;
|
|
12
|
+
}
|
|
13
|
+
interface CreateRequestHandlerOptions extends CreateRequestServerlessOptions {
|
|
7
14
|
routesWithServerLoader: RouteLoaders;
|
|
8
15
|
PluginManager: any;
|
|
9
16
|
manifest: ((sourceDir?: string) => {
|
|
@@ -18,11 +25,9 @@ interface CreateRequestHandlerOptions {
|
|
|
18
25
|
createHistory: (opts: any) => any;
|
|
19
26
|
helmetContext?: any;
|
|
20
27
|
ServerInsertedHTMLContext: React.Context<ServerInsertedHTMLHook | null>;
|
|
21
|
-
withoutHTML?: boolean;
|
|
22
|
-
sourceDir?: string;
|
|
23
28
|
}
|
|
24
29
|
export declare function createMarkupGenerator(opts: CreateRequestHandlerOptions): (url: string) => Promise<unknown>;
|
|
25
30
|
export default function createRequestHandler(opts: CreateRequestHandlerOptions): (req: any, res: any, next: any) => Promise<any>;
|
|
26
|
-
export declare function createUmiHandler(opts: CreateRequestHandlerOptions): (req:
|
|
27
|
-
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>;
|
|
28
33
|
export {};
|
package/dist/ssr.js
CHANGED
|
@@ -55,7 +55,7 @@ var createJSXProvider = (Provider, serverInsertedHTMLCallbacks) => {
|
|
|
55
55
|
return JSXProvider;
|
|
56
56
|
};
|
|
57
57
|
function createJSXGenerator(opts) {
|
|
58
|
-
return async (url) => {
|
|
58
|
+
return async (url, serverLoaderArgs) => {
|
|
59
59
|
const {
|
|
60
60
|
routesWithServerLoader,
|
|
61
61
|
PluginManager,
|
|
@@ -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,14 +189,22 @@ 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
|
-
|
|
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
|
+
});
|
|
180
200
|
res.status(200).json(data);
|
|
181
201
|
return;
|
|
182
202
|
}
|
|
183
|
-
const
|
|
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 });
|
|
184
208
|
if (!jsx)
|
|
185
209
|
return next();
|
|
186
210
|
const writable = new import_stream.Writable();
|
|
@@ -209,7 +233,13 @@ function createUmiHandler(opts) {
|
|
|
209
233
|
...opts,
|
|
210
234
|
...params
|
|
211
235
|
});
|
|
212
|
-
const
|
|
236
|
+
const loaderArgs = {
|
|
237
|
+
request: req
|
|
238
|
+
};
|
|
239
|
+
const jsx = await jsxGeneratorDeferrer(
|
|
240
|
+
new URL(req.url).pathname,
|
|
241
|
+
loaderArgs
|
|
242
|
+
);
|
|
213
243
|
if (!jsx) {
|
|
214
244
|
throw new Error("no page resource");
|
|
215
245
|
}
|
|
@@ -219,7 +249,14 @@ function createUmiHandler(opts) {
|
|
|
219
249
|
function createUmiServerLoader(opts) {
|
|
220
250
|
return async function(req) {
|
|
221
251
|
const query = Object.fromEntries(new URL(req.url).searchParams);
|
|
222
|
-
|
|
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
|
+
});
|
|
223
260
|
};
|
|
224
261
|
}
|
|
225
262
|
function matchRoutesForSSR(reqUrl, routesById) {
|
|
@@ -250,12 +287,29 @@ function createClientRoute(route) {
|
|
|
250
287
|
index
|
|
251
288
|
};
|
|
252
289
|
}
|
|
253
|
-
async function executeLoader(
|
|
290
|
+
async function executeLoader(params) {
|
|
291
|
+
const { routeKey, routesWithServerLoader, serverLoaderArgs } = params;
|
|
292
|
+
const mod = await routesWithServerLoader[routeKey]();
|
|
293
|
+
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
return mod.serverLoader(serverLoaderArgs);
|
|
297
|
+
}
|
|
298
|
+
async function executeMetadataLoader(params) {
|
|
299
|
+
const {
|
|
300
|
+
routesWithServerLoader,
|
|
301
|
+
routeKey,
|
|
302
|
+
serverLoaderArgs,
|
|
303
|
+
serverLoaderData
|
|
304
|
+
} = params;
|
|
254
305
|
const mod = await routesWithServerLoader[routeKey]();
|
|
255
306
|
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
256
307
|
return;
|
|
257
308
|
}
|
|
258
|
-
return
|
|
309
|
+
return mod.metadataLoader(
|
|
310
|
+
serverLoaderData,
|
|
311
|
+
serverLoaderArgs
|
|
312
|
+
);
|
|
259
313
|
}
|
|
260
314
|
// Annotate the CommonJS export names for ESM import in node:
|
|
261
315
|
0 && (module.exports = {
|
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"
|