From c973bb76e898efb37fdf8810e33460248e9b69c4 Mon Sep 17 00:00:00 2001 From: Jinbao1001 Date: Mon, 1 Apr 2024 10:41:30 +0800 Subject: [PATCH] feat: add client metadata hydrate data --- examples/ssr-demo/.umirc.ts | 2 +- packages/preset-umi/src/features/ssr/ssr.ts | 2 +- .../src/features/tmpFiles/tmpFiles.ts | 18 +++----- packages/preset-umi/templates/server.tpl | 3 +- packages/renderer-react/src/browser.tsx | 10 ++++- packages/renderer-react/src/html.tsx | 19 ++++---- packages/renderer-react/src/server.tsx | 2 +- packages/renderer-react/src/types.ts | 2 +- packages/server/src/ssr.ts | 44 +++++++------------ packages/server/src/types.ts | 7 +-- 10 files changed, 47 insertions(+), 62 deletions(-) diff --git a/examples/ssr-demo/.umirc.ts b/examples/ssr-demo/.umirc.ts index 4cc8d65ccf22..c905a4960ba7 100644 --- a/examples/ssr-demo/.umirc.ts +++ b/examples/ssr-demo/.umirc.ts @@ -9,7 +9,7 @@ export default { scripts: [`https://a.com/b.js`], ssr: { builder: 'webpack', - hydrateFromHtml: true, + hydrateFromRoot: false, }, styles: [`body { color: red; }`, `https://a.com/b.css`], diff --git a/packages/preset-umi/src/features/ssr/ssr.ts b/packages/preset-umi/src/features/ssr/ssr.ts index 78e30b4f58ca..ede66b9d22a0 100644 --- a/packages/preset-umi/src/features/ssr/ssr.ts +++ b/packages/preset-umi/src/features/ssr/ssr.ts @@ -27,7 +27,7 @@ export default (api: IApi) => { serverBuildPath: zod.string(), platform: zod.string(), builder: zod.enum(['esbuild', 'webpack']), - hydrateFromHtml: zod.boolean(), + hydrateFromRoot: zod.boolean(), }) .deepPartial(); }, diff --git a/packages/preset-umi/src/features/tmpFiles/tmpFiles.ts b/packages/preset-umi/src/features/tmpFiles/tmpFiles.ts index 16ac6ef96676..1863f0b19b8c 100644 --- a/packages/preset-umi/src/features/tmpFiles/tmpFiles.ts +++ b/packages/preset-umi/src/features/tmpFiles/tmpFiles.ts @@ -2,11 +2,11 @@ import { importLazy, lodash, winPath } from '@umijs/utils'; import { existsSync, readdirSync } from 'fs'; import { basename, dirname, join } from 'path'; import { RUNTIME_TYPE_FILE_NAME } from 'umi'; +import { getMarkupArgs } from '../../commands/dev/getMarkupArgs'; import { TEMPLATES_DIR } from '../../constants'; import { IApi } from '../../types'; import { getModuleExports } from './getModuleExports'; import { importsToStr } from './importsToStr'; - const routesApi: typeof import('./routes') = importLazy( require.resolve('./routes'), ); @@ -496,16 +496,8 @@ if (process.env.NODE_ENV === 'development') { } return memo; }, []); - const { - headScripts, - scripts, - styles, - title, - favicons, - links, - metas, - ssr, - } = api.config; + const { headScripts, scripts, styles, title, favicons, links, metas } = + await getMarkupArgs({ api }); api.writeTmpFile({ noPluginDir: true, path: 'umi.server.ts', @@ -531,9 +523,9 @@ if (process.env.NODE_ENV === 'development') { favicons, links, metas, + scripts: scripts || [], }), - scripts: JSON.stringify(scripts || []), - hydrateFromHtml: ssr?.hydrateFromHtml ?? true, + hydrateFromRoot: api.config.ssr?.hydrateFromRoot ?? false, }, }); } diff --git a/packages/preset-umi/templates/server.tpl b/packages/preset-umi/templates/server.tpl index e52a07d8d61e..02a2a181f97f 100644 --- a/packages/preset-umi/templates/server.tpl +++ b/packages/preset-umi/templates/server.tpl @@ -52,8 +52,7 @@ const createOpts = { createHistory, ServerInsertedHTMLContext, metadata: {{{metadata}}}, - scripts: {{{scripts}}}, - hydrateFromHtml: {{{hydrateFromHtml}}} + hydrateFromRoot: {{{hydrateFromRoot}}} }; const requestHandler = createRequestHandler(createOpts); diff --git a/packages/renderer-react/src/browser.tsx b/packages/renderer-react/src/browser.tsx index 9553d5510b8f..9dd23058d2d8 100644 --- a/packages/renderer-react/src/browser.tsx +++ b/packages/renderer-react/src/browser.tsx @@ -100,7 +100,7 @@ export type RenderClientOpts = { * ssr 是否从 html 根节点开始 hydrate * @doc 默认 true,从 html 开始渲染,false 时从 app root 开始 */ - hydrateFromHtml?: boolean; + hydrateFromRoot?: boolean; /** * 当前的路由配置 */ @@ -336,13 +336,19 @@ const getBrowser = ( */ export function renderClient(opts: RenderClientOpts) { const rootElement = opts.rootElement || document.getElementById('root')!; + const Browser = getBrowser(opts, ); // 为了测试,直接返回组件 if (opts.components) return Browser; if (opts.hydrate) { + // @ts-ignore + const loaderData = window.__UMI_LOADER_DATA__ || {}; + // @ts-ignore + const metadata = window.__UMI_METADATA_LOADER_DATA__ || {}; + ReactDOM.hydrateRoot( document, - + , ); diff --git a/packages/renderer-react/src/html.tsx b/packages/renderer-react/src/html.tsx index a7c408c0af44..c80adc363e70 100644 --- a/packages/renderer-react/src/html.tsx +++ b/packages/renderer-react/src/html.tsx @@ -94,15 +94,16 @@ export function Html({ />
{children}
- {loaderData && ( -