@umijs/server 4.0.28 → 4.0.30
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/server.js +10 -1
- package/dist/ssr.d.ts +3 -0
- package/dist/ssr.js +75 -15
- package/package.json +2 -2
package/dist/server.js
CHANGED
|
@@ -33,7 +33,16 @@ var import_styles = require("./styles");
|
|
|
33
33
|
async function getMarkup(opts) {
|
|
34
34
|
let markup = import_server.default.renderToString(import_react.default.createElement("div", { id: opts.mountElementId || "root" }));
|
|
35
35
|
function propsToString(opts2) {
|
|
36
|
-
return Object.keys(opts2.props).filter((key) =>
|
|
36
|
+
return Object.keys(opts2.props).filter((key) => {
|
|
37
|
+
const isValidBoolean = opts2.props[key] !== false;
|
|
38
|
+
return !(opts2.filters || []).includes(key) && isValidBoolean;
|
|
39
|
+
}).map((key) => {
|
|
40
|
+
const value = opts2.props[key];
|
|
41
|
+
if (value === true) {
|
|
42
|
+
return `${key}`;
|
|
43
|
+
}
|
|
44
|
+
return `${key}=${JSON.stringify(value)}`;
|
|
45
|
+
}).join(" ");
|
|
37
46
|
}
|
|
38
47
|
function getScriptContent(script) {
|
|
39
48
|
const attrs = propsToString({
|
package/dist/ssr.d.ts
CHANGED
|
@@ -13,6 +13,9 @@ interface CreateRequestHandlerOptions {
|
|
|
13
13
|
getValidKeys: () => any;
|
|
14
14
|
getRoutes: (PluginManager: any) => any;
|
|
15
15
|
getClientRootComponent: (PluginManager: any) => any;
|
|
16
|
+
helmetContext: any;
|
|
17
|
+
createHistory: (opts: any) => any;
|
|
16
18
|
}
|
|
19
|
+
export declare function createMarkupGenerator(opts: CreateRequestHandlerOptions): (url: string) => Promise<unknown>;
|
|
17
20
|
export default function createRequestHandler(opts: CreateRequestHandlerOptions): (req: any, res: any, next: any) => Promise<any>;
|
|
18
21
|
export {};
|
package/dist/ssr.js
CHANGED
|
@@ -19,33 +19,40 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
// src/ssr.ts
|
|
20
20
|
var ssr_exports = {};
|
|
21
21
|
__export(ssr_exports, {
|
|
22
|
+
createMarkupGenerator: () => createMarkupGenerator,
|
|
22
23
|
default: () => createRequestHandler
|
|
23
24
|
});
|
|
24
25
|
module.exports = __toCommonJS(ssr_exports);
|
|
26
|
+
var import_stream = require("stream");
|
|
25
27
|
var import_server = require("react-dom/server");
|
|
26
28
|
var import_react_router_dom = require("react-router-dom");
|
|
27
|
-
function
|
|
28
|
-
return async
|
|
29
|
+
function createJSXGenerator(opts) {
|
|
30
|
+
return async (url) => {
|
|
29
31
|
const {
|
|
30
32
|
routesWithServerLoader,
|
|
31
33
|
PluginManager,
|
|
32
34
|
getPlugins,
|
|
33
35
|
getValidKeys,
|
|
34
|
-
getRoutes
|
|
36
|
+
getRoutes,
|
|
37
|
+
createHistory
|
|
35
38
|
} = opts;
|
|
36
|
-
|
|
37
|
-
const data = await executeLoader(req.query.route, routesWithServerLoader);
|
|
38
|
-
res.status(200).json(data);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
39
|
+
createHistory({ type: "memory", initialEntries: [url], initialIndex: 1 });
|
|
41
40
|
const pluginManager = PluginManager.create({
|
|
42
41
|
plugins: getPlugins(),
|
|
43
42
|
validKeys: getValidKeys()
|
|
44
43
|
});
|
|
45
44
|
const { routes, routeComponents } = await getRoutes(pluginManager);
|
|
46
|
-
|
|
45
|
+
await pluginManager.applyPlugins({
|
|
46
|
+
key: "patchRoutes",
|
|
47
|
+
type: "event",
|
|
48
|
+
args: {
|
|
49
|
+
routes,
|
|
50
|
+
routeComponents
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const matches = matchRoutesForSSR(url, routes);
|
|
47
54
|
if (matches.length === 0) {
|
|
48
|
-
return
|
|
55
|
+
return;
|
|
49
56
|
}
|
|
50
57
|
const loaderData = {};
|
|
51
58
|
await Promise.all(matches.filter((id) => routes[id].hasServerLoader).map((id) => new Promise(async (resolve) => {
|
|
@@ -57,13 +64,64 @@ function createRequestHandler(opts) {
|
|
|
57
64
|
routes,
|
|
58
65
|
routeComponents,
|
|
59
66
|
pluginManager,
|
|
60
|
-
location:
|
|
67
|
+
location: url,
|
|
61
68
|
manifest,
|
|
62
69
|
loaderData
|
|
63
70
|
};
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
71
|
+
return {
|
|
72
|
+
element: await opts.getClientRootComponent(context),
|
|
73
|
+
manifest
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function createMarkupGenerator(opts) {
|
|
78
|
+
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
79
|
+
return async (url) => {
|
|
80
|
+
const jsx = await jsxGeneratorDeferrer(url);
|
|
81
|
+
if (jsx) {
|
|
82
|
+
return new Promise(async (resolve, reject) => {
|
|
83
|
+
let chunks = [];
|
|
84
|
+
const writable = new import_stream.Writable();
|
|
85
|
+
writable._write = (chunk, _encoding, next) => {
|
|
86
|
+
chunks.push(Buffer.from(chunk));
|
|
87
|
+
next();
|
|
88
|
+
};
|
|
89
|
+
writable.on("finish", () => {
|
|
90
|
+
let html = Buffer.concat(chunks).toString("utf8");
|
|
91
|
+
html = html.replace(/(<\/head>)/, [
|
|
92
|
+
opts.helmetContext.helmet.title.toString(),
|
|
93
|
+
opts.helmetContext.helmet.priority.toString(),
|
|
94
|
+
opts.helmetContext.helmet.meta.toString(),
|
|
95
|
+
opts.helmetContext.helmet.link.toString(),
|
|
96
|
+
opts.helmetContext.helmet.script.toString(),
|
|
97
|
+
"$1"
|
|
98
|
+
].filter(Boolean).join("/n"));
|
|
99
|
+
resolve(html);
|
|
100
|
+
});
|
|
101
|
+
const stream = (0, import_server.renderToPipeableStream)(jsx.element, {
|
|
102
|
+
onShellReady() {
|
|
103
|
+
stream.pipe(writable);
|
|
104
|
+
},
|
|
105
|
+
onError: reject
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return "";
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function createRequestHandler(opts) {
|
|
113
|
+
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
114
|
+
return async function(req, res, next) {
|
|
115
|
+
if (req.url.startsWith("/__serverLoader") && req.query.route) {
|
|
116
|
+
const data = await executeLoader(req.query.route, opts.routesWithServerLoader);
|
|
117
|
+
res.status(200).json(data);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const jsx = await jsxGeneratorDeferrer(req.url);
|
|
121
|
+
if (!jsx)
|
|
122
|
+
return next();
|
|
123
|
+
const stream = (0, import_server.renderToPipeableStream)(jsx.element, {
|
|
124
|
+
bootstrapScripts: [jsx.manifest.assets["umi.js"] || "/umi.js"],
|
|
67
125
|
onShellReady() {
|
|
68
126
|
res.setHeader("Content-type", "text/html");
|
|
69
127
|
stream.pipe(res);
|
|
@@ -108,4 +166,6 @@ async function executeLoader(routeKey, routesWithServerLoader) {
|
|
|
108
166
|
return await mod.serverLoader();
|
|
109
167
|
}
|
|
110
168
|
// Annotate the CommonJS export names for ESM import in node:
|
|
111
|
-
0 && (module.exports = {
|
|
169
|
+
0 && (module.exports = {
|
|
170
|
+
createMarkupGenerator
|
|
171
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umijs/server",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.30",
|
|
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",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"dev": "umi-scripts father dev"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@umijs/bundler-utils": "4.0.
|
|
23
|
+
"@umijs/bundler-utils": "4.0.30",
|
|
24
24
|
"history": "5.3.0",
|
|
25
25
|
"react": "18.1.0",
|
|
26
26
|
"react-dom": "18.1.0",
|