@umijs/server 4.0.0-canary.20231019.1 → 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 +10 -5
- package/dist/ssr.js +72 -17
- 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
|
|
@@ -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,14 +190,22 @@ 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
|
-
|
|
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
|
+
});
|
|
180
201
|
res.status(200).json(data);
|
|
181
202
|
return;
|
|
182
203
|
}
|
|
183
|
-
const
|
|
204
|
+
const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
|
|
205
|
+
const request = new Request(fullUrl, {
|
|
206
|
+
headers: req.headers
|
|
207
|
+
});
|
|
208
|
+
const jsx = await jsxGeneratorDeferrer(req.url, { request });
|
|
184
209
|
if (!jsx)
|
|
185
210
|
return next();
|
|
186
211
|
const writable = new import_stream.Writable();
|
|
@@ -209,7 +234,13 @@ function createUmiHandler(opts) {
|
|
|
209
234
|
...opts,
|
|
210
235
|
...params
|
|
211
236
|
});
|
|
212
|
-
const
|
|
237
|
+
const loaderArgs = {
|
|
238
|
+
request: req
|
|
239
|
+
};
|
|
240
|
+
const jsx = await jsxGeneratorDeferrer(
|
|
241
|
+
new URL(req.url).pathname,
|
|
242
|
+
loaderArgs
|
|
243
|
+
);
|
|
213
244
|
if (!jsx) {
|
|
214
245
|
throw new Error("no page resource");
|
|
215
246
|
}
|
|
@@ -219,7 +250,14 @@ function createUmiHandler(opts) {
|
|
|
219
250
|
function createUmiServerLoader(opts) {
|
|
220
251
|
return async function(req) {
|
|
221
252
|
const query = Object.fromEntries(new URL(req.url).searchParams);
|
|
222
|
-
|
|
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
|
+
});
|
|
223
261
|
};
|
|
224
262
|
}
|
|
225
263
|
function matchRoutesForSSR(reqUrl, routesById) {
|
|
@@ -250,12 +288,29 @@ function createClientRoute(route) {
|
|
|
250
288
|
index
|
|
251
289
|
};
|
|
252
290
|
}
|
|
253
|
-
async function executeLoader(
|
|
291
|
+
async function executeLoader(params) {
|
|
292
|
+
const { routeKey, routesWithServerLoader, serverLoaderArgs } = params;
|
|
293
|
+
const mod = await routesWithServerLoader[routeKey]();
|
|
294
|
+
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
return mod.serverLoader(serverLoaderArgs);
|
|
298
|
+
}
|
|
299
|
+
async function executeMetadataLoader(params) {
|
|
300
|
+
const {
|
|
301
|
+
routesWithServerLoader,
|
|
302
|
+
routeKey,
|
|
303
|
+
serverLoaderArgs,
|
|
304
|
+
serverLoaderData
|
|
305
|
+
} = params;
|
|
254
306
|
const mod = await routesWithServerLoader[routeKey]();
|
|
255
307
|
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
256
308
|
return;
|
|
257
309
|
}
|
|
258
|
-
return
|
|
310
|
+
return mod.metadataLoader(
|
|
311
|
+
serverLoaderData,
|
|
312
|
+
serverLoaderArgs
|
|
313
|
+
);
|
|
259
314
|
}
|
|
260
315
|
// Annotate the CommonJS export names for ESM import in node:
|
|
261
316
|
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.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"
|