Skip to content

Commit 08c37bb

Browse files
authored
🐛 fix: 修复页面白屏错误 (#122)
* 🐛 fix: 修复页面白屏错误 * chore: fix lint * chore: update * chore: 更新说明 * chore: update wait: umijs/dumi#2165 * chore: update peerdeps * chore: re-import
1 parent 7d6977a commit 08c37bb

File tree

4 files changed

+42
-44
lines changed

4 files changed

+42
-44
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
"react-layout-kit": "^1",
7575
"react-syntax-highlighter": "^15",
7676
"shiki-es": "^0.2",
77+
"swr": "^2.2.5",
7778
"use-merge-value": "^1",
7879
"zustand": "^4.4.1",
7980
"zustand-utils": "^1"
@@ -122,7 +123,7 @@
122123
"vitest": "latest"
123124
},
124125
"peerDependencies": {
125-
"dumi": "^2.0.0",
126+
"dumi": "^2.4.7",
126127
"react": ">=16.8",
127128
"react-dom": ">=16.8"
128129
},

src/components/StoreUpdater/index.tsx

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
11
import { useDebounceEffect } from 'ahooks';
2-
import {
3-
useLocale,
4-
useLocation,
5-
useNavData,
6-
useRouteMeta,
7-
useSidebarData,
8-
useSiteData,
9-
useTabMeta,
10-
} from 'dumi';
2+
import { useLocale, useLocation, useNavData, useSidebarData, useSiteData, useTabMeta } from 'dumi';
113
import isEqual from 'fast-deep-equal';
124
import React, { memo, useEffect } from 'react';
135
import { SiteStore, useStoreApi } from '../../store/useSiteStore';
6+
import { useRouteMeta } from './useRouteMeta';
147

158
const isBrowser = typeof window !== 'undefined';
169

@@ -71,13 +64,14 @@ const getHomeNav = (id: string) => ({
7164
export const StoreUpdater = memo(() => {
7265
const siteData = useSiteData();
7366
const sidebar = useSidebarData();
74-
const routeMeta = useRouteMeta();
7567
const tabMeta = useTabMeta();
7668
const navData = useNavData();
7769
const location = useLocation();
7870
const locale = useLocale();
7971
const storeApi = useStoreApi();
8072

73+
useRouteMeta();
74+
8175
useSyncState('siteData', siteData, () => {
8276
// eslint-disable-next-line @typescript-eslint/no-unused-vars
8377
const { setLoading, ...data } = siteData;
@@ -92,7 +86,6 @@ export const StoreUpdater = memo(() => {
9286
});
9387

9488
useSyncState('sidebar', sidebar);
95-
useSyncState('routeMeta', routeMeta);
9689
useSyncState('location', location);
9790
useSyncState('tabMeta', tabMeta);
9891
useSyncState('locale', locale);
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { getRouteMetaById, useMatchedRoute } from 'dumi';
2+
import type { IRouteMeta } from 'dumi/dist/client/theme-api/types';
3+
import useSWR from 'swr';
4+
import { useStoreApi } from '../../store/useSiteStore';
5+
6+
const EMPTY_META = {
7+
frontmatter: {},
8+
toc: [],
9+
texts: [],
10+
} as any;
11+
12+
// https://github.com/umijs/dumi/pull/2165
13+
export const useRouteMeta = () => {
14+
const storeApi = useStoreApi();
15+
const matched = useMatchedRoute();
16+
17+
const merge = (meta: IRouteMeta = EMPTY_META) => {
18+
if (matched.meta) {
19+
Object.keys(matched.meta).forEach((key) => {
20+
(meta as any)[key] ??= (matched.meta as any)[key];
21+
});
22+
}
23+
return meta;
24+
};
25+
26+
useSWR(matched.id, getRouteMetaById, {
27+
fallback: EMPTY_META,
28+
onSuccess: (meta) => {
29+
storeApi.setState({ routeMeta: merge(meta) });
30+
},
31+
});
32+
};

src/store/useSiteStore.ts

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,15 @@
1-
import { AtomAsset } from 'dumi-assets-types';
2-
import {
3-
ILocale,
4-
ILocalesConfig,
5-
INavItem,
6-
IPreviewerProps,
7-
IRouteMeta,
8-
ISidebarGroup,
9-
IThemeConfig,
10-
} from 'dumi/dist/client/theme-api/types';
11-
import { PICKED_PKG_FIELDS } from 'dumi/dist/constants';
1+
import type { ISiteContext } from 'dumi/dist/client/theme-api/context';
2+
import { ILocale, INavItem, IRouteMeta, ISidebarGroup } from 'dumi/dist/client/theme-api/types';
123
import equal from 'fast-deep-equal';
134
import type { Location } from 'history';
14-
import { createWithEqualityFn } from 'zustand/traditional';
15-
16-
import { ComponentType } from 'react';
175
import { StoreApi } from 'zustand';
186
import { createContext } from 'zustand-utils';
197
import { devtools } from 'zustand/middleware';
8+
import { createWithEqualityFn } from 'zustand/traditional';
209

2110
export type NavData = (INavItem & { children?: INavItem[] | undefined })[];
2211

23-
export interface ISiteData {
24-
pkg: Partial<Record<keyof typeof PICKED_PKG_FIELDS, any>>;
25-
entryExports: Record<string, any>;
26-
demos: Record<
27-
string,
28-
{
29-
component: ComponentType;
30-
asset: IPreviewerProps['asset'];
31-
routeId: string;
32-
}
33-
>;
34-
35-
components: Record<string, AtomAsset>;
36-
locales: ILocalesConfig;
37-
themeConfig: IThemeConfig;
38-
loading: boolean;
39-
setLoading: (status: boolean) => void;
40-
}
12+
export type ISiteData = ISiteContext;
4113

4214
export interface SiteStore {
4315
siteData: ISiteData;

0 commit comments

Comments
 (0)