@umijs/server 4.0.0-canary.20220614.2 → 4.0.0-canary.20220620.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 ADDED
@@ -0,0 +1,18 @@
1
+ interface RouteLoaders {
2
+ [key: string]: () => Promise<any>;
3
+ }
4
+ interface CreateRequestHandlerOptions {
5
+ routesWithServerLoader: RouteLoaders;
6
+ PluginManager: any;
7
+ manifest: (() => {
8
+ assets: Record<string, string>;
9
+ }) | {
10
+ assets: Record<string, string>;
11
+ };
12
+ getPlugins: () => any;
13
+ getValidKeys: () => any;
14
+ getRoutes: (PluginManager: any) => any;
15
+ getClientRootComponent: (PluginManager: any) => any;
16
+ }
17
+ export default function createRequestHandler(opts: CreateRequestHandlerOptions): (req: any, res: any, next: any) => Promise<any>;
18
+ export {};
package/dist/ssr.js ADDED
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const server_1 = require("react-dom/server");
4
+ const react_router_dom_1 = require("react-router-dom");
5
+ function createRequestHandler(opts) {
6
+ return async function (req, res, next) {
7
+ const { routesWithServerLoader, PluginManager, getPlugins, getValidKeys, getRoutes, } = opts;
8
+ // 切换路由场景下,会通过此 API 执行 server loader
9
+ if (req.url.startsWith('/__serverLoader') && req.query.route) {
10
+ const data = await executeLoader(req.query.route, routesWithServerLoader);
11
+ res.status(200).json(data);
12
+ return;
13
+ }
14
+ const pluginManager = PluginManager.create({
15
+ plugins: getPlugins(),
16
+ validKeys: getValidKeys(),
17
+ });
18
+ const { routes, routeComponents } = await getRoutes(pluginManager);
19
+ const matches = matchRoutesForSSR(req.url, routes);
20
+ if (matches.length === 0) {
21
+ return next();
22
+ }
23
+ const loaderData = {};
24
+ await Promise.all(matches
25
+ .filter((id) => routes[id].hasServerLoader)
26
+ .map((id) => new Promise(async (resolve) => {
27
+ loaderData[id] = await executeLoader(id, routesWithServerLoader);
28
+ resolve();
29
+ })));
30
+ const manifest = typeof opts.manifest === 'function' ? opts.manifest() : opts.manifest;
31
+ const context = {
32
+ routes,
33
+ routeComponents,
34
+ pluginManager,
35
+ location: req.url,
36
+ manifest,
37
+ loaderData,
38
+ };
39
+ const jsx = await opts.getClientRootComponent(context);
40
+ const stream = (0, server_1.renderToPipeableStream)(jsx, {
41
+ bootstrapScripts: [manifest.assets['umi.js'] || '/umi.js'],
42
+ onShellReady() {
43
+ res.setHeader('Content-type', 'text/html');
44
+ stream.pipe(res);
45
+ },
46
+ onError(x) {
47
+ console.error(x);
48
+ },
49
+ });
50
+ };
51
+ }
52
+ exports.default = createRequestHandler;
53
+ function matchRoutesForSSR(reqUrl, routesById) {
54
+ var _a;
55
+ return (((_a = (0, react_router_dom_1.matchRoutes)(createClientRoutes({ routesById }), reqUrl)) === null || _a === void 0 ? void 0 : _a.map((route) => route.route.id)) || []);
56
+ }
57
+ function createClientRoutes(opts) {
58
+ const { routesById, parentId } = opts;
59
+ return Object.keys(routesById)
60
+ .filter((id) => routesById[id].parentId === parentId)
61
+ .map((id) => {
62
+ const route = createClientRoute(routesById[id]);
63
+ const children = createClientRoutes({
64
+ routesById,
65
+ parentId: route.id,
66
+ });
67
+ if (children.length > 0) {
68
+ // @ts-ignore
69
+ route.children = children;
70
+ }
71
+ return route;
72
+ });
73
+ }
74
+ function createClientRoute(route) {
75
+ const { id, path, index } = route;
76
+ return {
77
+ id,
78
+ path,
79
+ index,
80
+ };
81
+ }
82
+ async function executeLoader(routeKey, routesWithServerLoader) {
83
+ const mod = await routesWithServerLoader[routeKey]();
84
+ if (!mod.serverLoader || typeof mod.serverLoader !== 'function') {
85
+ return;
86
+ }
87
+ // TODO: 处理错误场景
88
+ return await mod.serverLoader();
89
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umijs/server",
3
- "version": "4.0.0-canary.20220614.2",
3
+ "version": "4.0.0-canary.20220620.1",
4
4
  "description": "@umijs/server",
5
5
  "homepage": "https://github.com/umijs/umi-next/tree/master/packages/server#readme",
6
6
  "bugs": "https://github.com/umijs/umi-next/issues",
@@ -20,7 +20,7 @@
20
20
  "dev": "pnpm build -- --watch"
21
21
  },
22
22
  "dependencies": {
23
- "@umijs/bundler-utils": "4.0.0-canary.20220614.2",
23
+ "@umijs/bundler-utils": "4.0.0-canary.20220620.1",
24
24
  "history": "5.3.0",
25
25
  "react": "18.1.0",
26
26
  "react-dom": "18.1.0",