@umijs/renderer-react 4.0.0-canary.20240509.3 → 4.0.0-canary.20240510.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.
@@ -23,4 +23,5 @@ export declare function useServerLoaderData<T extends ServerLoaderFunc = any>():
23
23
  export declare function useClientLoaderData(): {
24
24
  data: any;
25
25
  };
26
+ export declare function useLoaderData<T extends ServerLoaderFunc = any>(): Awaited<ReturnType<T>>;
26
27
  export {};
@@ -1,3 +1,4 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
1
2
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
3
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
4
  var _excluded = ["element"];
@@ -25,6 +26,7 @@ export function useRouteProps() {
25
26
  props = _objectWithoutProperties(_ref, _excluded);
26
27
  return props;
27
28
  }
29
+ // @deprecated Please use `useLoaderData` instead.
28
30
  export function useServerLoaderData() {
29
31
  var routes = useSelectedRoutes();
30
32
  var _useAppData2 = useAppData(),
@@ -47,7 +49,6 @@ export function useServerLoaderData() {
47
49
  data = _React$useState2[0],
48
50
  setData = _React$useState2[1];
49
51
  React.useEffect(function () {
50
- // @ts-ignore
51
52
  if (!window.__UMI_LOADER_DATA__) {
52
53
  // 支持 ssr 降级,客户端兜底加载 serverLoader 数据
53
54
  Promise.all(routes.filter(function (route) {
@@ -75,10 +76,19 @@ export function useServerLoaderData() {
75
76
  data: data
76
77
  };
77
78
  }
79
+
80
+ // @deprecated Please use `useLoaderData` instead.
78
81
  export function useClientLoaderData() {
79
82
  var route = useRouteData();
80
83
  var appData = useAppData();
81
84
  return {
82
85
  data: appData.clientLoaderData[route.route.id]
83
86
  };
87
+ }
88
+ export function useLoaderData() {
89
+ var serverLoaderData = useServerLoaderData();
90
+ var clientLoaderData = useClientLoaderData();
91
+ return {
92
+ data: _objectSpread(_objectSpread({}, serverLoaderData.data), clientLoaderData.data)
93
+ };
84
94
  }
package/dist/browser.js CHANGED
@@ -131,9 +131,7 @@ var getBrowser = function getBrowser(opts, routesElement) {
131
131
  _useState2 = _slicedToArray(_useState, 2),
132
132
  clientLoaderData = _useState2[0],
133
133
  setClientLoaderData = _useState2[1];
134
- var _useState3 = useState(
135
- // @ts-ignore
136
- window.__UMI_LOADER_DATA__ || {}),
134
+ var _useState3 = useState(window.__UMI_LOADER_DATA__ || {}),
137
135
  _useState4 = _slicedToArray(_useState3, 2),
138
136
  serverLoaderData = _useState4[0],
139
137
  setServerLoaderData = _useState4[1];
@@ -181,9 +179,13 @@ var getBrowser = function getBrowser(opts, routesElement) {
181
179
  });
182
180
  }
183
181
  }
182
+ var clientLoader = (_opts$routes$id = opts.routes[id]) === null || _opts$routes$id === void 0 ? void 0 : _opts$routes$id.clientLoader;
183
+ var hasClientLoader = !!clientLoader;
184
+ var hasServerLoader = (_opts$routes$id2 = opts.routes[id]) === null || _opts$routes$id2 === void 0 ? void 0 : _opts$routes$id2.hasServerLoader;
184
185
  // server loader
185
186
  // use ?. since routes patched with patchClientRoutes is not exists in opts.routes
186
- if (!isFirst && (_opts$routes$id = opts.routes[id]) !== null && _opts$routes$id !== void 0 && _opts$routes$id.hasServerLoader) {
187
+
188
+ if (!isFirst && hasServerLoader && !hasClientLoader && !window.__UMI_LOADER_DATA__) {
187
189
  fetchServerLoader({
188
190
  id: id,
189
191
  basename: basename,
@@ -200,9 +202,32 @@ var getBrowser = function getBrowser(opts, routesElement) {
200
202
  }
201
203
  // client loader
202
204
  // onPatchClientRoutes 添加的 route 在 opts.routes 里是不存在的
203
- var clientLoader = (_opts$routes$id2 = opts.routes[id]) === null || _opts$routes$id2 === void 0 ? void 0 : _opts$routes$id2.clientLoader;
204
- if (clientLoader && !clientLoaderData[id]) {
205
- clientLoader().then(function (data) {
205
+ var hasClientLoaderDataInRoute = !!clientLoaderData[id];
206
+
207
+ // Check if hydration is needed or there's no server loader for the current route
208
+ var shouldHydrateOrNoServerLoader = hasClientLoader && clientLoader.hydrate || !hasServerLoader;
209
+
210
+ // Check if server loader data is missing in the global window object
211
+ var isServerLoaderDataMissing = hasServerLoader && !window.__UMI_LOADER_DATA__;
212
+ if (hasClientLoader && !hasClientLoaderDataInRoute && (shouldHydrateOrNoServerLoader || isServerLoaderDataMissing)) {
213
+ // ...
214
+ clientLoader({
215
+ serverLoader: function serverLoader() {
216
+ return fetchServerLoader({
217
+ id: id,
218
+ basename: basename,
219
+ cb: function cb(data) {
220
+ // setServerLoaderData when startTransition because if ssr is enabled,
221
+ // the component may being hydrated and setLoaderData will break the hydration
222
+ React.startTransition(function () {
223
+ setServerLoaderData(function (d) {
224
+ return _objectSpread(_objectSpread({}, d), {}, _defineProperty({}, id, data));
225
+ });
226
+ });
227
+ }
228
+ });
229
+ }
230
+ }).then(function (data) {
206
231
  setClientLoaderData(function (d) {
207
232
  return _objectSpread(_objectSpread({}, d), {}, _defineProperty({}, id, data));
208
233
  });
@@ -248,9 +273,7 @@ export function renderClient(opts) {
248
273
  // 为了测试,直接返回组件
249
274
  if (opts.components) return Browser;
250
275
  if (opts.hydrate) {
251
- // @ts-ignore
252
276
  var loaderData = window.__UMI_LOADER_DATA__ || {};
253
- // @ts-ignore
254
277
  var metadata = window.__UMI_METADATA_LOADER_DATA__ || {};
255
278
  var hydtateHtmloptions = {
256
279
  metadata: metadata,
package/dist/html.js CHANGED
@@ -102,9 +102,7 @@ export function Html(_ref) {
102
102
  id: mountElementId
103
103
  }, children));
104
104
  }
105
- var serverBuildManifest = typeof window === 'undefined' ? manifest :
106
- // @ts-ignore
107
- window.__UMI_BUILD_MANIFEST_DATA__;
105
+ var serverBuildManifest = typeof window === 'undefined' ? manifest : window.__UMI_BUILD_MANIFEST_DATA__;
108
106
  return (
109
107
  /*#__PURE__*/
110
108
  // FIXME: Resolve the hydrate warning for suppressHydrationWarning(3)
@@ -138,8 +136,11 @@ export function Html(_ref) {
138
136
  content = _normalizeScripts2.content,
139
137
  rest = _objectWithoutProperties(_normalizeScripts2, _excluded2);
140
138
  return /*#__PURE__*/React.createElement("script", _extends({
139
+ dangerouslySetInnerHTML: {
140
+ __html: content
141
+ },
141
142
  key: key
142
- }, rest), content);
143
+ }, rest));
143
144
  })))
144
145
  );
145
146
  }
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export { createBrowserHistory, createHashHistory, createMemoryHistory, type History, } from 'history';
2
2
  export { Helmet, HelmetProvider } from 'react-helmet-async';
3
3
  export { createSearchParams, generatePath, matchPath, matchRoutes, Navigate, NavLink, Outlet, resolvePath, useLocation, useMatch, useNavigate, useOutlet, useOutletContext, useParams, useResolvedPath, useRoutes, useSearchParams, } from 'react-router-dom';
4
- export { useAppData, useClientLoaderData, useRouteProps, useSelectedRoutes, useServerLoaderData, } from './appContext';
4
+ export { useAppData, useClientLoaderData, useLoaderData, useRouteProps, useSelectedRoutes, useServerLoaderData, } from './appContext';
5
5
  export { renderClient, __getRoot } from './browser';
6
6
  export { LinkWithPrefetch as Link } from './link';
7
7
  export { useRouteData } from './routeContext';
8
+ export type { ClientLoader } from './types';
8
9
  export { __useFetcher } from './useFetcher';
9
10
  export { withRouter, type RouteComponentProps } from './withRouter';
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { createBrowserHistory, createHashHistory, createMemoryHistory } from 'history';
2
2
  export { Helmet, HelmetProvider } from 'react-helmet-async';
3
3
  export { createSearchParams, generatePath, matchPath, matchRoutes, Navigate, NavLink, Outlet, resolvePath, useLocation, useMatch, useNavigate, useOutlet, useOutletContext, useParams, useResolvedPath, useRoutes, useSearchParams } from 'react-router-dom';
4
- export { useAppData, useClientLoaderData, useRouteProps, useSelectedRoutes, useServerLoaderData } from "./appContext";
4
+ export { useAppData, useClientLoaderData, useLoaderData, useRouteProps, useSelectedRoutes, useServerLoaderData } from "./appContext";
5
5
  export { renderClient, __getRoot } from "./browser";
6
6
  export { LinkWithPrefetch as Link } from "./link";
7
7
  export { useRouteData } from "./routeContext";
package/dist/types.d.ts CHANGED
@@ -1,8 +1,21 @@
1
1
  /// <reference types="react" />
2
- import type { IhtmlPageOpts } from '@umijs/server/dist/types';
2
+ import type { IhtmlPageOpts, ServerLoader } from '@umijs/server/dist/types';
3
3
  import type { RouteMatch, RouteObject } from 'react-router-dom';
4
+ declare global {
5
+ interface Window {
6
+ __UMI_LOADER_DATA__: any;
7
+ __UMI_METADATA_LOADER_DATA__: any;
8
+ __UMI_BUILD_MANIFEST_DATA__: any;
9
+ }
10
+ }
11
+ declare type ClientLoaderFunctionArgs = {
12
+ serverLoader: ServerLoader;
13
+ };
14
+ export declare type ClientLoader = ((args: ClientLoaderFunctionArgs) => Promise<any>) & {
15
+ hydrate?: boolean;
16
+ };
4
17
  export interface IRouteSSRProps {
5
- clientLoader?: () => Promise<any>;
18
+ clientLoader?: ClientLoader;
6
19
  hasServerLoader?: boolean;
7
20
  }
8
21
  export interface IRouteConventionExportProps {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umijs/renderer-react",
3
- "version": "4.0.0-canary.20240509.3",
3
+ "version": "4.0.0-canary.20240510.1",
4
4
  "description": "@umijs/renderer-react",
5
5
  "homepage": "https://github.com/umijs/umi/tree/master/packages/renderer-react#readme",
6
6
  "bugs": "https://github.com/umijs/umi/issues",