Skip to content
This repository was archived by the owner on Jul 6, 2025. It is now read-only.

Commit fae524f

Browse files
committed
Rename suspenseData to deferedData
1 parent e5cb948 commit fae524f

File tree

10 files changed

+71
-69
lines changed

10 files changed

+71
-69
lines changed

examples/feature-apps/suspense-ssr/server.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { renderToReadableStream } from "react-dom/server";
55
serve({
66
routes: "./routes/**/*.tsx",
77
ssr: {
8-
suspense: true,
8+
dataDefer: true,
99
render: (ctx) => renderToReadableStream(<App ssrContext={ctx} />, ctx),
1010
},
1111
});

examples/react-app/server.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ serve({
1111
},
1212
},
1313
ssr: {
14-
// when set `suspense` to `true`, the router will loading data in suspense mode
15-
// please check https://alephjs.org/docs/react/router/suspense
16-
suspense: false,
14+
// when set `dataDefer` to `true`, the router will loading data as defer
15+
// please check https://alephjs.org/docs/react/router/data-defer
16+
dataDefer: false,
1717
render: (ctx) => renderToReadableStream(<App ssrContext={ctx} />, ctx),
1818
},
1919
});

framework/react/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export type Mutation<T> = {
3131
};
3232

3333
export type DataContextProps<T = unknown> = {
34-
suspenseData?: { current?: T };
34+
deferedData?: { current?: T };
3535
data: T;
3636
isMutating: HttpMethod | boolean;
3737
mutation: Mutation<T>;

framework/react/data.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export type DataProviderProps = PropsWithChildren<{
1616
}>;
1717

1818
export const DataProvider: FC<DataProviderProps> = ({ dataUrl, dataCache, children }) => {
19-
const suspenseData = useRef<unknown>();
19+
const deferedData = useRef<unknown>();
2020
const [data, setData] = useState(() => {
2121
const cached = dataCache.get(dataUrl);
2222
if (cached) {
@@ -28,10 +28,10 @@ export const DataProvider: FC<DataProviderProps> = ({ dataUrl, dataCache, childr
2828
if (res instanceof Promise) {
2929
return res.then((data) => {
3030
dataCache.set(dataUrl, data);
31-
suspenseData.current = data;
31+
deferedData.current = data;
3232
}).catch((error) => {
3333
dataCache.set(dataUrl, error);
34-
suspenseData.current = error;
34+
deferedData.current = error;
3535
});
3636
}
3737
throw new Error(`Data for ${dataUrl} has invalid type [function].`);
@@ -171,19 +171,19 @@ export const DataProvider: FC<DataProviderProps> = ({ dataUrl, dataCache, childr
171171

172172
return createElement(
173173
DataContext.Provider,
174-
{ value: { suspenseData, data, isMutating, mutation, reload } },
174+
{ value: { deferedData, data, isMutating, mutation, reload } },
175175
children,
176176
);
177177
};
178178

179-
export const useData = <T = unknown>(): Omit<DataContextProps<T>, "suspenseData"> => {
180-
const { suspenseData, data, ...rest } = useContext(DataContext) as DataContextProps<T>;
179+
export const useData = <T = unknown>(): Omit<DataContextProps<T>, "deferedData"> => {
180+
const { deferedData, data, ...rest } = useContext(DataContext) as DataContextProps<T>;
181181
if (data instanceof Promise) {
182-
if (suspenseData?.current instanceof Error) {
183-
throw suspenseData.current;
182+
if (deferedData?.current instanceof Error) {
183+
throw deferedData.current;
184184
}
185-
if (suspenseData?.current !== undefined) {
186-
return { ...rest, data: suspenseData.current };
185+
if (deferedData?.current !== undefined) {
186+
return { ...rest, data: deferedData.current };
187187
}
188188
throw data;
189189
}

framework/react/router.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@ export type SSRContext = {
1515
readonly routeModules: RouteModule[];
1616
readonly headCollection: string[];
1717
readonly errorBoundaryHandler?: CallableFunction;
18-
readonly suspense: boolean;
18+
readonly dataDefer: boolean;
1919
};
2020

2121
export type RouterProps = {
2222
readonly ssrContext?: SSRContext;
23-
readonly suspense?: boolean;
23+
readonly dataDefer?: boolean;
2424
readonly createPortal?: RouterContextProps["createPortal"];
2525
};
2626

2727
// deno-lint-ignore no-explicit-any
2828
const global = window as any;
2929

3030
/** The `Router` component for react. */
31-
export const Router: FC<RouterProps> = ({ ssrContext, suspense, createPortal }) => {
31+
export const Router: FC<RouterProps> = ({ ssrContext, dataDefer: dataDeferProp, createPortal }) => {
3232
const [url, setUrl] = useState(() => ssrContext?.url || new URL(window.location?.href));
3333
const [modules, setModules] = useState(() => ssrContext?.routeModules || loadSSRModulesFromTag());
3434
const dataCache = useMemo(() => {
@@ -72,7 +72,7 @@ export const Router: FC<RouterProps> = ({ ssrContext, suspense, createPortal })
7272
routeModules[filename] = { defaultExport, withData };
7373
return { defaultExport, withData };
7474
};
75-
const isSuspense = document.body.getAttribute("data-suspense") ?? suspense;
75+
const dataDefer = document.body.getAttribute("data-defer") ?? dataDeferProp;
7676
const prefetchData = async (dataUrl: string) => {
7777
const rd: RouteData = {};
7878
const fetchData = async () => {
@@ -90,7 +90,7 @@ export const Router: FC<RouterProps> = ({ ssrContext, suspense, createPortal })
9090
}
9191
// clean up data cache
9292
setTimeout(() => dataCache.delete(dataUrl), 0);
93-
if (isSuspense) {
93+
if (dataDefer) {
9494
throw err;
9595
} else {
9696
// todo: better notify UI
@@ -109,7 +109,7 @@ export const Router: FC<RouterProps> = ({ ssrContext, suspense, createPortal })
109109
throw new FetchError(500, {}, "Data must be valid JSON");
110110
}
111111
};
112-
if (isSuspense) {
112+
if (dataDefer) {
113113
rd.data = fetchData;
114114
} else {
115115
rd.data = await fetchData();
@@ -361,20 +361,20 @@ function loadSSRModulesFromTag(): RouteModule[] {
361361
try {
362362
const data = JSON.parse(el.innerText);
363363
if (Array.isArray(data)) {
364-
let suspenseData: Record<string, unknown> | null | undefined = undefined;
364+
let deferedData: Record<string, unknown> | null | undefined = undefined;
365365
const routeModules = getRouteModules();
366-
return data.map(({ url, filename, suspense, ...rest }) => {
367-
if (suspense) {
368-
if (suspenseData === undefined) {
369-
const el = window.document?.getElementById("suspense-data");
366+
return data.map(({ url, filename, dataDefered, ...rest }) => {
367+
if (dataDefered) {
368+
if (deferedData === undefined) {
369+
const el = window.document?.getElementById("defered-data");
370370
if (el) {
371-
suspenseData = JSON.parse(el.innerText);
371+
deferedData = JSON.parse(el.innerText);
372372
} else {
373-
suspenseData = null;
373+
deferedData = null;
374374
}
375375
}
376-
if (suspenseData) {
377-
rest.data = suspenseData[url];
376+
if (deferedData) {
377+
rest.data = deferedData[url];
378378
}
379379
}
380380
return {

framework/vue/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export type Mutation<T> = {
2727
};
2828

2929
export type DataContextProps<T = unknown> = {
30-
suspenseData?: { current?: T };
30+
deferedData?: { current?: T };
3131
data: T;
3232
isMutating: HttpMethod | boolean;
3333
mutation: Mutation<T>;

framework/vue/router.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -308,20 +308,20 @@ function loadSSRModulesFromTag(): RouteModule[] {
308308
try {
309309
const data = JSON.parse(el.innerText);
310310
if (Array.isArray(data)) {
311-
let suspenseData: Record<string, unknown> | null | undefined = undefined;
311+
let deferedData: Record<string, unknown> | null | undefined = undefined;
312312
const routeModules = getRouteModules();
313-
return data.map(({ url, filename, suspense, ...rest }) => {
314-
if (suspense) {
315-
if (suspenseData === undefined) {
316-
const el = window.document?.getElementById("suspense-data");
313+
return data.map(({ url, filename, dataDefered, ...rest }) => {
314+
if (dataDefered) {
315+
if (deferedData === undefined) {
316+
const el = window.document?.getElementById("defered-data");
317317
if (el) {
318-
suspenseData = JSON.parse(el.innerText);
318+
deferedData = JSON.parse(el.innerText);
319319
} else {
320-
suspenseData = null;
320+
deferedData = null;
321321
}
322322
}
323-
if (suspenseData) {
324-
rest.data = suspenseData[url];
323+
if (deferedData) {
324+
rest.data = deferedData[url];
325325
}
326326
}
327327
return {

server/html.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export type HTMLRewriterHandlers = {
1818
type LoadOptions = {
1919
isDev: boolean;
2020
importMap: ImportMap;
21-
ssr?: { suspense?: boolean };
21+
ssr?: { dataDefer?: boolean };
2222
hmrWebSocketUrl?: string;
2323
};
2424

@@ -28,7 +28,7 @@ type LoadOptions = {
2828
// - add `./framework/core/nomodule.ts`
2929
// - check the `<head>` and `<body>` elements
3030
// - check the `<ssr-body>` element if the ssr is enabled
31-
// - add `data-suspense` attribute to `<body>` if using suspense ssr
31+
// - add `data-defer` attribute to `<body>` if possible
3232
export async function loadAndFixIndexHtml(options: LoadOptions): Promise<Uint8Array> {
3333
const { html, hasSSRBody } = await loadIndexHtml();
3434
return fixIndexHtml(html, hasSSRBody, options);
@@ -174,8 +174,8 @@ function fixIndexHtml(html: Uint8Array, hasSSRBody: boolean, options: LoadOption
174174
});
175175
rewriter.on("body", {
176176
element: (el: Element) => {
177-
if (ssr?.suspense) {
178-
el.setAttribute("data-suspense", "true");
177+
if (ssr?.dataDefer) {
178+
el.setAttribute("data-defer", "true");
179179
}
180180
if (deployId) {
181181
el.setAttribute("data-deployment-id", deployId);

0 commit comments

Comments
 (0)