@umijs/server 4.0.0-canary.20231019.2 → 4.0.0-canary.20231109.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 +9 -7
- package/dist/ssr.js +67 -16
- 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
|
|
@@ -138,17 +154,18 @@ function createMarkupGenerator(opts) {
|
|
|
138
154
|
next();
|
|
139
155
|
};
|
|
140
156
|
writable.on("finish", async () => {
|
|
157
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
141
158
|
let html = Buffer.concat(chunks).toString("utf8");
|
|
142
159
|
html += await getGenerateStaticHTML(serverInsertedHTMLCallbacks);
|
|
143
160
|
if (opts.helmetContext) {
|
|
144
161
|
html = html.replace(
|
|
145
162
|
/(<\/head>)/,
|
|
146
163
|
[
|
|
147
|
-
opts.helmetContext.helmet.title.toString(),
|
|
148
|
-
opts.helmetContext.helmet.priority.toString(),
|
|
149
|
-
opts.helmetContext.helmet.meta.toString(),
|
|
150
|
-
opts.helmetContext.helmet.link.toString(),
|
|
151
|
-
opts.helmetContext.helmet.script.toString(),
|
|
164
|
+
(_b = (_a = opts.helmetContext.helmet) == null ? void 0 : _a.title) == null ? void 0 : _b.toString(),
|
|
165
|
+
(_d = (_c = opts.helmetContext.helmet) == null ? void 0 : _c.priority) == null ? void 0 : _d.toString(),
|
|
166
|
+
(_f = (_e = opts.helmetContext.helmet) == null ? void 0 : _e.meta) == null ? void 0 : _f.toString(),
|
|
167
|
+
(_h = (_g = opts.helmetContext.helmet) == null ? void 0 : _g.link) == null ? void 0 : _h.toString(),
|
|
168
|
+
(_j = (_i = opts.helmetContext.helmet) == null ? void 0 : _i.script) == null ? void 0 : _j.toString(),
|
|
152
169
|
"$1"
|
|
153
170
|
].filter(Boolean).join("\n")
|
|
154
171
|
);
|
|
@@ -173,15 +190,19 @@ function createRequestHandler(opts) {
|
|
|
173
190
|
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
174
191
|
return async function(req, res, next) {
|
|
175
192
|
if (req.url.startsWith("/__serverLoader") && req.query.route) {
|
|
176
|
-
const
|
|
177
|
-
req.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
193
|
+
const serverLoaderRequest = new Request(req.query.url, {
|
|
194
|
+
headers: req.headers
|
|
195
|
+
});
|
|
196
|
+
const data = await executeLoader({
|
|
197
|
+
routeKey: req.query.route,
|
|
198
|
+
routesWithServerLoader: opts.routesWithServerLoader,
|
|
199
|
+
serverLoaderArgs: { request: serverLoaderRequest }
|
|
200
|
+
});
|
|
181
201
|
res.status(200).json(data);
|
|
182
202
|
return;
|
|
183
203
|
}
|
|
184
|
-
const
|
|
204
|
+
const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
|
|
205
|
+
const request = new Request(fullUrl, {
|
|
185
206
|
headers: req.headers
|
|
186
207
|
});
|
|
187
208
|
const jsx = await jsxGeneratorDeferrer(req.url, { request });
|
|
@@ -213,7 +234,13 @@ function createUmiHandler(opts) {
|
|
|
213
234
|
...opts,
|
|
214
235
|
...params
|
|
215
236
|
});
|
|
216
|
-
const
|
|
237
|
+
const loaderArgs = {
|
|
238
|
+
request: req
|
|
239
|
+
};
|
|
240
|
+
const jsx = await jsxGeneratorDeferrer(
|
|
241
|
+
new URL(req.url).pathname,
|
|
242
|
+
loaderArgs
|
|
243
|
+
);
|
|
217
244
|
if (!jsx) {
|
|
218
245
|
throw new Error("no page resource");
|
|
219
246
|
}
|
|
@@ -223,7 +250,14 @@ function createUmiHandler(opts) {
|
|
|
223
250
|
function createUmiServerLoader(opts) {
|
|
224
251
|
return async function(req) {
|
|
225
252
|
const query = Object.fromEntries(new URL(req.url).searchParams);
|
|
226
|
-
|
|
253
|
+
const serverLoaderRequest = new Request(query.url, {
|
|
254
|
+
headers: req.headers
|
|
255
|
+
});
|
|
256
|
+
return await executeLoader({
|
|
257
|
+
routeKey: query.route,
|
|
258
|
+
routesWithServerLoader: opts.routesWithServerLoader,
|
|
259
|
+
serverLoaderArgs: { request: serverLoaderRequest }
|
|
260
|
+
});
|
|
227
261
|
};
|
|
228
262
|
}
|
|
229
263
|
function matchRoutesForSSR(reqUrl, routesById) {
|
|
@@ -254,13 +288,30 @@ function createClientRoute(route) {
|
|
|
254
288
|
index
|
|
255
289
|
};
|
|
256
290
|
}
|
|
257
|
-
async function executeLoader(
|
|
291
|
+
async function executeLoader(params) {
|
|
292
|
+
const { routeKey, routesWithServerLoader, serverLoaderArgs } = params;
|
|
258
293
|
const mod = await routesWithServerLoader[routeKey]();
|
|
259
294
|
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
260
295
|
return;
|
|
261
296
|
}
|
|
262
297
|
return mod.serverLoader(serverLoaderArgs);
|
|
263
298
|
}
|
|
299
|
+
async function executeMetadataLoader(params) {
|
|
300
|
+
const {
|
|
301
|
+
routesWithServerLoader,
|
|
302
|
+
routeKey,
|
|
303
|
+
serverLoaderArgs,
|
|
304
|
+
serverLoaderData
|
|
305
|
+
} = params;
|
|
306
|
+
const mod = await routesWithServerLoader[routeKey]();
|
|
307
|
+
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
return mod.metadataLoader(
|
|
311
|
+
serverLoaderData,
|
|
312
|
+
serverLoaderArgs
|
|
313
|
+
);
|
|
314
|
+
}
|
|
264
315
|
// Annotate the CommonJS export names for ESM import in node:
|
|
265
316
|
0 && (module.exports = {
|
|
266
317
|
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.0-canary.
|
|
3
|
+
"version": "4.0.0-canary.20231109.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.20231109.1"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
25
25
|
"access": "public"
|