React Suspenseã䜿ã£ãŠããã¹ããããã³ã³ããŒãã³ãããªãŒã®è€éãªããŒãã£ã³ã°ç¶æ ã管çããæ¹æ³ãæ¢ããŸãã广çãªãã¹ããããããŒãã£ã³ã°ç®¡çã§ãã¹ã ãŒãºãªãŠãŒã¶ãŒäœéšãå®çŸããæ¹æ³ãåŠã³ãŸãããã
React Suspense ããŒãã£ã³ã°ç¶æ ã®ã³ã³ããžã·ã§ã³ããªãŒïŒãã¹ããããããŒãã£ã³ã°ç®¡ç
React Suspenseã¯ãäž»ã«ããŒã¿ååŸãªã©ã®éåææäœãããåªé ã«æ±ãããã«å°å ¥ããã匷åãªæ©èœã§ããããŒã¿ã®èªã¿èŸŒã¿ãåŸ ã£ãŠããéãã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ããäžæåæ¢ïŒsuspendïŒããããã®éã«ãã©ãŒã«ããã¯UIã衚瀺ããããšãã§ããŸããããã¯ãUIã®ããŸããŸãªéšåãç°ãªããœãŒã¹ããã®éåæããŒã¿ã«äŸåããè€éãªã³ã³ããŒãã³ãããªãŒãæ±ãå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãããã®èšäºã§ã¯ããã¹ããããã³ã³ããŒãã³ãæ§é å ã§Suspenseã广çã«äœ¿çšããæ¹æ³ã«ã€ããŠæãäžããäžè¬çãªèª²é¡ã«å¯ŸåŠããå®è·µçãªäŸãæäŸããŸãã
React Suspenseãšãã®å©ç¹ã®çè§£
ãã¹ããããã·ããªãªã«é£ã³èŸŒãåã«ãReact Suspenseã®ã³ã¢ã³ã³ã»ããã埩ç¿ããŸãããã
React Suspenseãšã¯ïŒ
Suspenseã¯ãäžéšã®ã³ãŒããèªã¿èŸŒãŸããã®ããåŸ
ã¡ããåŸ
æ©äžã«è¡šç€ºããããŒãã£ã³ã°ç¶æ
ïŒãã©ãŒã«ããã¯ïŒã宣èšçã«æå®ã§ããReactã³ã³ããŒãã³ãã§ããé
å»¶èªã¿èŸŒã¿ãããã³ã³ããŒãã³ãïŒReact.lazy
ã䜿çšïŒããSuspenseãšçµ±åãããããŒã¿ååŸã©ã€ãã©ãªãšé£æºããŠåäœããŸãã
Suspenseã䜿çšããå©ç¹ïŒ
- ãŠãŒã¶ãŒäœéšã®åäžïŒ 空çœã®ç»é¢ã®ä»£ããã«æå³ã®ããããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããã¢ããªã®å¿çæ§ãé«ããŸãã
- 宣èšçãªããŒãã£ã³ã°ç¶æ ïŒ ããŒãã£ã³ã°ç¶æ ãã³ã³ããŒãã³ãããªãŒã§çŽæ¥å®çŸ©ãããããã³ãŒããèªã¿ããããçè§£ãããããªããŸãã
- ã³ãŒãåå²ïŒ Suspenseã¯ã³ãŒãåå²ïŒ
React.lazy
ã䜿çšïŒãšã·ãŒã ã¬ã¹ã«é£æºããåæèªã¿èŸŒã¿æéãæ¹åããŸãã - éåæããŒã¿ååŸã®ç°¡çŽ åïŒ Suspenseã¯äºææ§ã®ããããŒã¿ååŸã©ã€ãã©ãªãšçµ±åããããŒã¿èªã¿èŸŒã¿ã«å¯Ÿããããåççãªã¢ãããŒããå¯èœã«ããŸãã
課é¡ïŒãã¹ããããããŒãã£ã³ã°ç¶æ
Suspenseã¯äžè¬çã«ããŒãã£ã³ã°ç¶æ ãç°¡çŽ åããŸãããæ·±ããã¹ããããã³ã³ããŒãã³ãããªãŒã§ã®ããŒãã£ã³ã°ç¶æ ã®ç®¡çã¯è€éã«ãªãããšããããŸãã芪ã³ã³ããŒãã³ããåæããŒã¿ãååŸãããã®åŸããããããç¬èªã®ããŒã¿ãååŸããåã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããã·ããªãªãæ³åããŠã¿ãŠãã ããã芪ã³ã³ããŒãã³ãã¯ããŒã¿ã衚瀺ããŠããã®ã«ãåã³ã³ããŒãã³ãã¯ãŸã èªã¿èŸŒã¿äžã§ãããšããç¶æ³ã«ãªãããŸãšãŸãã®ãªããŠãŒã¶ãŒäœéšã«ã€ãªããå¯èœæ§ããããŸãã
ãã®ç°¡ç¥åãããã³ã³ããŒãã³ãæ§é ãèããŠã¿ãŸãããïŒ
<ParentComponent>
<ChildComponent1>
<GrandChildComponent />
</ChildComponent1>
<ChildComponent2 />
</ParentComponent>
ãããã®åã³ã³ããŒãã³ãã¯ãéåæã§ããŒã¿ãååŸããŠããå¯èœæ§ããããŸãããããã®ãã¹ããããããŒãã£ã³ã°ç¶æ ãåªé ã«åŠçããããã®æŠç¥ãå¿ èŠã§ãã
Suspenseã«ãããã¹ããããããŒãã£ã³ã°ç®¡çã®æŠç¥
ãã¹ããããããŒãã£ã³ã°ç¶æ ã广çã«ç®¡çããããã«æ¡çšã§ããããã€ãã®æŠç¥ã以äžã«ç€ºããŸãïŒ
1. åå¥ã®Suspenseå¢ç
æãçŽæ¥çãªã¢ãããŒãã¯ãããŒã¿ãååŸããåã³ã³ããŒãã³ããç¬èªã®<Suspense>
å¢çã§ã©ããããããšã§ããããã«ãããåã³ã³ããŒãã³ããç¬èªã®ããŒãã£ã³ã°ç¶æ
ãç¬ç«ããŠç®¡çã§ããããã«ãªããŸãã
const ParentComponent = () => {
// ...
return (
<div>
<h2>芪ã³ã³ããŒãã³ã</h2>
<ChildComponent1 />
<ChildComponent2 />
</div>
);
};
const ChildComponent1 = () => {
return (
<Suspense fallback={<p>åã³ã³ããŒãã³ã1ãèªã¿èŸŒã¿äž...</p>}>
<AsyncChild1 />
</Suspense>
);
};
const ChildComponent2 = () => {
return (
<Suspense fallback={<p>åã³ã³ããŒãã³ã2ãèªã¿èŸŒã¿äž...</p>}>
<AsyncChild2 />
</Suspense>
);
};
const AsyncChild1 = () => {
const data = useAsyncData('child1'); // éåæããŒã¿ååŸã®ããã®ã«ã¹ã¿ã ããã¯
return <p>å1ããã®ããŒã¿: {data}</p>;
};
const AsyncChild2 = () => {
const data = useAsyncData('child2'); // éåæããŒã¿ååŸã®ããã®ã«ã¹ã¿ã ããã¯
return <p>å2ããã®ããŒã¿: {data}</p>;
};
const useAsyncData = (key) => {
const [data, setData] = React.useState(null);
React.useEffect(() => {
let didCancel = false;
const fetchData = async () => {
// ããŒã¿ååŸã®é
å»¶ãã·ãã¥ã¬ãŒã
await new Promise(resolve => setTimeout(resolve, 1000));
if (!didCancel) {
setData(`${key}ã®ããŒã¿`);
}
};
fetchData();
return () => {
didCancel = true;
};
}, [key]);
if (data === null) {
throw new Promise(resolve => setTimeout(resolve, 1000)); // åŸã§è§£æ±ºããããããã¹ãã·ãã¥ã¬ãŒã
}
return data;
};
export default ParentComponent;
é·æïŒ å®è£ ãç°¡åã§ãåã³ã³ããŒãã³ããç¬èªã®ããŒãã£ã³ã°ç¶æ ãåŠçããŸãã çæïŒ è€æ°ã®ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãç°ãªãã¿ã€ãã³ã°ã§è¡šç€ºããããŠãŒã¶ãŒã«äžå¿«æãäžããå¯èœæ§ããããŸããããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã®ããŠã©ãŒã¿ãŒãã©ãŒã«ã广ã¯ãèŠèŠçã«é åçã§ãªãå ŽåããããŸãã
2. ãããã¬ãã«ã§ã®å ±æSuspenseå¢ç
å¥ã®ã¢ãããŒãã¯ãã³ã³ããŒãã³ãããªãŒå
šäœããããã¬ãã«ã§åäžã®<Suspense>
å¢çã§ã©ããããããšã§ããããã«ããããã¹ãŠã®éåæããŒã¿ãèªã¿èŸŒãŸãããŸã§UIå
šäœãåŸ
æ©ãããã®åŸã§ã¬ã³ããªã³ã°ãããããã«ãªããŸãã
const App = () => {
return (
<Suspense fallback={<p>ã¢ããªãèªã¿èŸŒã¿äž...</p>}>
<ParentComponent />
</Suspense>
);
};
é·æïŒ ããäžè²«æ§ã®ããããŒãã£ã³ã°äœéšãæäŸããŸãããã¹ãŠã®ããŒã¿ãèªã¿èŸŒãŸããåŸã«UIå šäœãäžåºŠã«è¡šç€ºãããŸãã çæïŒ ç¹ã«äžéšã®ã³ã³ããŒãã³ããããŒã¿ã®èªã¿èŸŒã¿ã«ããªãã®æéãèŠããå ŽåããŠãŒã¶ãŒã¯äœããèŠããŸã§ã«é·æéåŸ ããªããã°ãªããªãå¯èœæ§ããããŸããããã¯ãªãŒã«ãªã¢ããã·ã³ã°ã®ã¢ãããŒãã§ããããã¹ãŠã®ã·ããªãªã«çæ³çãšã¯éããŸããã
3. å調ããŒãã£ã³ã°ã®ããã®SuspenseList
<SuspenseList>
ã¯ãSuspenseå¢çã衚瀺ãããé åºã調æŽã§ããã³ã³ããŒãã³ãã§ããããã«ãããããŒãã£ã³ã°ç¶æ
ã®è¡šç€ºãå¶åŸ¡ãããŠã©ãŒã¿ãŒãã©ãŒã«å¹æãé²ããããã¹ã ãŒãºãªèŠèŠçé·ç§»ãäœæã§ããŸãã
<SuspenseList>
ã«ã¯2ã€ã®äž»èŠãªpropsããããŸãïŒ
* `revealOrder`: <SuspenseList>
ã®åã衚瀺ãããé åºãå¶åŸ¡ããŸãã`'forwards'`ã`'backwards'`ããŸãã¯`'together'`ãæå®ã§ããŸãã
* `tail`: äžéšã衚瀺æºåå®äºã§ããã¹ãŠã§ã¯ãªãå Žåã«ããŸã 衚瀺ãããŠããªãæ®ãã®ã¢ã€ãã ãã©ãããããå¶åŸ¡ããŸãã`'collapsed'`ãŸãã¯`'suspended'`ãæå®ã§ããŸãã
import { unstable_SuspenseList as SuspenseList } from 'react';
const ParentComponent = () => {
return (
<div>
<h2>芪ã³ã³ããŒãã³ã</h2>
<SuspenseList revealOrder="forwards" tail="suspended">
<Suspense fallback={<p>åã³ã³ããŒãã³ã1ãèªã¿èŸŒã¿äž...</p>}>
<ChildComponent1 />
</Suspense>
<Suspense fallback={<p>åã³ã³ããŒãã³ã2ãèªã¿èŸŒã¿äž...</p>}>
<ChildComponent2 />
</Suspense>
</SuspenseList>
</div>
);
};
ãã®äŸã§ã¯ã`revealOrder="forwards"` propsã«ãããChildComponent1
ãChildComponent2
ã®åã«è¡šç€ºãããããšãä¿èšŒãããŸãã`tail="suspended"` propsã«ãããChildComponent1
ãå®å
šã«èªã¿èŸŒãŸãããŸã§ChildComponent2
ã®ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããç¶ããŸãã
é·æïŒ ããŒãã£ã³ã°ç¶æ
ã衚瀺ãããé åºããã现ããå¶åŸ¡ã§ããããäºæž¬å¯èœã§èŠèŠçã«é
åçãªããŒãã£ã³ã°äœéšãåµåºããŸãããŠã©ãŒã¿ãŒãã©ãŒã«å¹æãé²ããŸãã
çæïŒ <SuspenseList>
ãšãã®propsã«ã€ããŠããæ·±ãçè§£ãå¿
èŠã§ããåå¥ã®Suspenseå¢çãããèšå®ãè€éã«ãªãå¯èœæ§ããããŸãã
4. Suspenseãšã«ã¹ã¿ã ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã®çµã¿åãã
<Suspense>
ãæäŸããããã©ã«ãã®ãã©ãŒã«ããã¯UIã®ä»£ããã«ããŠãŒã¶ãŒã«ããå€ãã®èŠèŠçãªã³ã³ããã¹ããæäŸããã«ã¹ã¿ã ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãäœæã§ããŸããäŸãã°ãèªã¿èŸŒãŸããã³ã³ããŒãã³ãã®ã¬ã€ã¢ãŠããæš¡å£ããã¹ã±ã«ãã³ããŒãã£ã³ã°ã¢ãã¡ãŒã·ã§ã³ã衚瀺ããããšãã§ããŸããããã«ãããäœæããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒäœéšã倧å¹
ã«åäžããŸãã
const ChildComponent1 = () => {
return (
<Suspense fallback={<SkeletonLoader />}>
<AsyncChild1 />
</Suspense>
);
};
const SkeletonLoader = () => {
return (
<div className="skeleton-loader">
<div className="skeleton-line"></div>
<div className="skeleton-line"></div>
<div className="skeleton-line"></div>
</div>
);
};
ïŒã¢ãã¡ãŒã·ã§ã³å¹æãäœæããã«ã¯ã`.skeleton-loader`ãš`.skeleton-line`ã®CSSã¹ã¿ã€ãªã³ã°ãå¥éå®çŸ©ããå¿ èŠããããŸããïŒ
é·æïŒ ããé åçã§æ å ±éã®å€ãããŒãã£ã³ã°äœéšãåµåºããŸããäœæããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã çæïŒ åçŽãªããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãããå®è£ ã«æéãããããŸãã
5. Suspenseãšçµ±åãããããŒã¿ååŸã©ã€ãã©ãªã®æŽ»çš
RelayãSWRïŒStale-While-RevalidateïŒãªã©ã®äžéšã®ããŒã¿ååŸã©ã€ãã©ãªã¯ãSuspenseãšã·ãŒã ã¬ã¹ã«é£æºããããã«èšèšãããŠããŸãããããã®ã©ã€ãã©ãªã¯ãããŒã¿ååŸäžã«ã³ã³ããŒãã³ããäžæåæ¢ããããã®çµã¿èŸŒã¿ã¡ã«ããºã ãæäŸããããŒãã£ã³ã°ç¶æ ã®ç®¡çã容æã«ããŸãã
以äžã¯SWRã䜿çšããäŸã§ãïŒ
import useSWR from 'swr'
const AsyncChild1 = () => {
const { data, error } = useSWR('/api/data', fetcher)
if (error) return <div>èªã¿èŸŒã¿ã«å€±æããŸãã</div>
if (!data) return <div>èªã¿èŸŒã¿äž...</div> // SWRãå
éšã§SuspenseãåŠç
return <div>{data.name}</div>
}
const fetcher = (...args) => fetch(...args).then(res => res.json())
SWRã¯ãããŒã¿èªã¿èŸŒã¿ç¶æ
ã«åºã¥ããŠSuspenseã®åäœãèªåçã«åŠçããŸããããŒã¿ããŸã å©çšã§ããªãå Žåãã³ã³ããŒãã³ãã¯äžæåæ¢ãã<Suspense>
ã®ãã©ãŒã«ããã¯ã衚瀺ãããŸãã
é·æïŒ ããŒã¿ååŸãšããŒãã£ã³ã°ç¶æ ã®ç®¡çãç°¡çŽ åããŸããããã©ãŒãã³ã¹åäžã®ããã®ãã£ãã·ã³ã°ãåæ€èšŒæŠç¥ããã°ãã°æäŸããŸãã çæïŒ ç¹å®ã®ããŒã¿ååŸã©ã€ãã©ãªãæ¡çšããå¿ èŠããããŸããã©ã€ãã©ãªã«é¢é£ããåŠç¿æ²ç·ããããããããŸããã
é«åºŠãªèæ ®äºé
ãšã©ãŒå¢çã«ãããšã©ãŒãã³ããªã³ã°
Suspenseã¯ããŒãã£ã³ã°ç¶æ ãåŠçããŸãããããŒã¿ååŸäžã«çºçããå¯èœæ§ã®ãããšã©ãŒã¯åŠçããŸããããšã©ãŒãã³ããªã³ã°ã«ã¯ããšã©ãŒå¢çïŒError BoundariesïŒã䜿çšããå¿ èŠããããŸãããšã©ãŒå¢çã¯ãåã³ã³ããŒãã³ãããªãŒå ã®ã©ããã§çºçããJavaScriptãšã©ãŒããã£ãããããããã®ãšã©ãŒããã°ã«èšé²ãããã©ãŒã«ããã¯UIã衚瀺ããReactã³ã³ããŒãã³ãã§ãã
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// 次ã®ã¬ã³ããªã³ã°ã§ãã©ãŒã«ããã¯UIã衚瀺ãããããã«ç¶æ
ãæŽæ°ããŸãã
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// ãšã©ãŒããšã©ãŒå ±åãµãŒãã¹ã«èšé²ããããšãã§ããŸã
console.error(error, errorInfo);
}
render() {
if (this.state.hasError) {
// ä»»æã®ã«ã¹ã¿ã ãã©ãŒã«ããã¯UIãã¬ã³ããªã³ã°ã§ããŸã
return <h1>åé¡ãçºçããŸããã</h1>;
}
return this.props.children;
}
}
const ParentComponent = () => {
return (
<ErrorBoundary>
<Suspense fallback={<p>èªã¿èŸŒã¿äž...</p>}>
<ChildComponent />
</Suspense>
</ErrorBoundary>
);
};
ããŒã¿ååŸäžã«çºçããå¯èœæ§ã®ãããšã©ãŒãåŠçããããã«ã<Suspense>
å¢çã<ErrorBoundary>
ã§ã©ããããŸãã
ããã©ãŒãã³ã¹ã®æé©å
Suspenseã¯ãŠãŒã¶ãŒäœéšãåäžãããŸãããããã©ãŒãã³ã¹ã®ããã«ããã¯ãé¿ããããã«ããŒã¿ååŸãšã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ãæé©åããããšãäžå¯æ¬ ã§ãã以äžãèæ ®ããŠãã ããïŒ
- ã¡ã¢åïŒ åãpropsãåãåãã³ã³ããŒãã³ãã®äžèŠãªåã¬ã³ããªã³ã°ãé²ãããã«
React.memo
ã䜿çšããŸãã - ã³ãŒãåå²ïŒ
React.lazy
ã䜿çšããŠã³ãŒããå°ããªãã£ã³ã¯ã«åå²ããåæèªã¿èŸŒã¿æéãççž®ããŸãã - ãã£ãã·ã³ã°ïŒ éè€ããããŒã¿ååŸãé¿ããããã«ãã£ãã·ã³ã°æŠç¥ãå®è£ ããŸãã
- ãããŠã³ã¹ãšã¹ããããªã³ã°ïŒ APIåŒã³åºãã®é »åºŠãå¶éããããã«ãããŠã³ã¹ãšã¹ããããªã³ã°ã®ãã¯ããã¯ã䜿çšããŸãã
ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒ
Suspenseã¯ãNext.jsãRemixãªã©ã®ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãã¬ãŒã ã¯ãŒã¯ã§ã䜿çšã§ããŸãããã ããSuspenseã䜿çšããSSRã¯ãããŒã¿ãã€ãã¬ãŒã·ã§ã³ã«é¢é£ããè€éããåŒãèµ·ããå¯èœæ§ããããããæ éãªæ€èšãå¿ èŠã§ãããµãŒããŒã§ååŸãããããŒã¿ãã¯ã©ã€ã¢ã³ãã§é©åã«ã·ãªã¢ã©ã€ãºããããã€ãã¬ãŒããããããšãä¿èšŒããŠãäžæŽåãé¿ããããšãéèŠã§ããSSRãã¬ãŒã ã¯ãŒã¯ã¯éåžžãSSRã§Suspenseã管çããããã®ãã«ããŒããã¹ããã©ã¯ãã£ã¹ãæäŸããŠããŸãã
å®è·µçãªäŸãšãŠãŒã¹ã±ãŒã¹
Suspenseãå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã©ã®ããã«äœ¿çšã§ããããããã€ãã®å®è·µçãªäŸãèŠãŠã¿ãŸãããïŒ
1. Eã³ããŒã¹ã®è£œåããŒãž
Eã³ããŒã¹ã®è£œåããŒãžã§ã¯ã補å詳现ãã¬ãã¥ãŒãé¢é£è£œåãªã©ãéåæã§ããŒã¿ãèªã¿èŸŒãè€æ°ã®ã»ã¯ã·ã§ã³ãããå ŽåããããŸããSuspenseã䜿çšããŠãããŒã¿ååŸäžã«åã»ã¯ã·ã§ã³ã®ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ã§ããŸãã
2. ãœãŒã·ã£ã«ã¡ãã£ã¢ãã£ãŒã
ãœãŒã·ã£ã«ã¡ãã£ã¢ãã£ãŒãã§ã¯ãæçš¿ãã³ã¡ã³ãããŠãŒã¶ãŒãããã£ãŒã«ãç¬ç«ããŠããŒã¿ãèªã¿èŸŒãããšããããŸããSuspenseã䜿çšããŠãããŒã¿ååŸäžã«åæçš¿ã®ã¹ã±ã«ãã³ããŒãã£ã³ã°ã¢ãã¡ãŒã·ã§ã³ã衚瀺ã§ããŸãã
3. ããã·ã¥ããŒãã¢ããªã±ãŒã·ã§ã³
ããã·ã¥ããŒãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç°ãªããœãŒã¹ããããŒã¿ãèªã¿èŸŒããã£ãŒããããŒãã«ãããããããå ŽåããããŸããSuspenseã䜿çšããŠãããŒã¿ååŸäžã«åãã£ãŒããããŒãã«ããŸãã¯ãããã®ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ã§ããŸãã
**ã°ããŒãã«**ãªããã·ã¥ããŒãã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠã¯ã以äžãèæ ®ããŠãã ããïŒ
- ã¿ã€ã ãŸãŒã³ïŒ ãŠãŒã¶ãŒã®ããŒã«ã«ã¿ã€ã ãŸãŒã³ã§ããŒã¿ã衚瀺ããŸãã
- éè²šïŒ ééç䟡å€ããŠãŒã¶ãŒã®çŸå°é貚ã§è¡šç€ºããŸãã
- èšèªïŒ ããã·ã¥ããŒãã€ã³ã¿ãŒãã§ãŒã¹ã®å€èšèªãµããŒããæäŸããŸãã
- å°åããŒã¿ïŒ ãŠãŒã¶ãŒãå°åãåœã«åºã¥ããŠããŒã¿ããã£ã«ã¿ãªã³ã°ããã³è¡šç€ºã§ããããã«ããŸãã
çµè«
React Suspenseã¯ãReactã¢ããªã±ãŒã·ã§ã³ã§éåæã®ããŒã¿ååŸãšããŒãã£ã³ã°ç¶æ ã管çããããã®åŒ·åãªããŒã«ã§ãããã¹ããããããŒãã£ã³ã°ç®¡çã®ããã®ããŸããŸãªæŠç¥ãçè§£ããããšã§ãè€éãªã³ã³ããŒãã³ãããªãŒã§ãã£ãŠããããã¹ã ãŒãºã§é åçãªãŠãŒã¶ãŒäœéšãåµåºã§ããŸããæ¬çªã¢ããªã±ãŒã·ã§ã³ã§Suspenseã䜿çšããéã«ã¯ããšã©ãŒãã³ããªã³ã°ãããã©ãŒãã³ã¹æé©åããµãŒããŒãµã€ãã¬ã³ããªã³ã°ãèæ ®ããããšãå¿ããªãã§ãã ãããéåææäœã¯å€ãã®ã¢ããªã±ãŒã·ã§ã³ã§äžè¬çã§ãããReact Suspenseã䜿çšããããšã§ãããããã¯ãªãŒã³ã«åŠçããæ¹æ³ãåŸãããŸãã