Reactã®ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ãšãã¬ãŒã ããžã§ãã管çã解説ãäžçäžã®ãŠãŒã¶ãŒã«æ»ãããªäœéšãæäŸããããã®ããã©ãŒãã³ã¹æé©åãšå¿çæ§åäžã®å®è·µæŠç¥ãåŠã³ãŸãã
Reactã®ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ããã¹ã¿ãŒããïŒãã¬ãŒã ããžã§ãã管çã¬ã€ã
仿¥ã®ãã€ãããã¯ãªãŠã§ãç°å¢ã«ãããŠãã·ãŒã ã¬ã¹ã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããšã¯æãéèŠã§ããäžçäžã®ãŠãŒã¶ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ãæ»ããã§ãã€ã³ã¿ã©ã¯ãã£ãã§ãã«ã¯ã€ãããªãããšãæåŸ ããŠããŸããReactã®ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ã®å°å ¥ã¯ãç§ãã¡ãããã©ãŒãã³ã¹ã«åãçµãæ¹æ³ã«é©åœãããããããããã®ç®æšãéæããããã®åŒ·åãªããŒã«ãæäŸããŸããããã®ãã©ãã€ã ã·ããã®äžå¿ã«ããã®ãããã¬ãŒã ããžã§ãã管çã®æŠå¿µã§ãããã®å æ¬çãªã¬ã€ãã§ã¯ãReactã®ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãæ¢æ±ãã倿§ãªããã€ã¹ããããã¯ãŒã¯æ¡ä»¶äžã§äžè²«ããŠã¹ã ãŒãºãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã確ä¿ããããã«ããã¬ãŒã ããžã§ããã广çã«ç®¡çããæ¹æ³ã«çŠç¹ãåœãŠãŸãã
ãã¬ãŒã ããžã§ãããçè§£ãã
Reactã®å ·äœçãªã¡ã«ããºã ã«é£ã³èŸŒãåã«ããã¬ãŒã ããžã§ãããšããåºæ¬çãªæŠå¿µãçè§£ããããšãéèŠã§ããã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ãUIéçºã«ãããŠããã¬ãŒã ãšã¯ç»é¢ã«è¡šç€ºãããåäžã®ç»åã®ããšã§ããåããã€ã³ã¿ã©ã¯ãã£ãæ§ã®é¯èŠãçã¿åºãããã«ããããã®ãã¬ãŒã ã¯é«éã§é£ç¶çã«ã¬ã³ããªã³ã°ãã衚瀺ãããŸããã»ãšãã©ã®çŸä»£çãªãã£ã¹ãã¬ã€ã®ç®æšãã¬ãŒã ã¬ãŒãã¯æ¯ç§60ãã¬ãŒã ïŒFPSïŒã§ããããã¯ãåãã¬ãŒã ãçŽ16.67ããªç§ïŒ1000ms / 60 FPSïŒä»¥å ã«ã¬ã³ããªã³ã°ããããŠãŒã¶ãŒã«æç€ºãããªããã°ãªããªãããšãæå³ããŸãã
ãããã£ãŠããã¬ãŒã ããžã§ãããšã¯ãåäžã®ãã¬ãŒã ã«å¿ èŠãªãã¹ãŠã®äœæ¥ãå®äºããããã«å²ãåœãŠãããæéã§ãããã®äœæ¥ã«ã¯éåžžã以äžã®ãã®ãå«ãŸããŸãïŒ
- JavaScriptã®å®è¡ïŒ Reactã³ã³ããŒãã³ããã€ãã³ããã³ãã©ãããžãã¹ããžãã¯ã®å®è¡ã
- ã¬ã€ã¢ãŠãèšç®ïŒãªãããŒïŒïŒ ç»é¢äžã®èŠçŽ ã®äœçœ®ãšå¯žæ³ã®æ±ºå®ã
- ãã€ã³ãã£ã³ã°ïŒãªãã€ã³ãïŒïŒ UIãæ§æãããã¯ã»ã«ã®æç»ã
- ã³ã³ããžããïŒ ç°ãªãèŠèŠèŠçŽ ã®ã¬ã€ã€ãŒåãšçµåã
ãããã®ã¹ãããã®ãããããå²ãåœãŠãããæéããé·ãããããšããã©ãŠã¶ã¯æ°ãããã¬ãŒã ãã¹ã±ãžã¥ãŒã«éãã«æç€ºã§ããªããªãããã¬ãŒã èœã¡ãã«ã¯ã«ã¯ããå¿çæ§ã®ãªããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªãããŸããããã¯ãã°ãã°ãžã£ã³ã¯ãšåŒã°ããŸãã
Reactã®ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³è§£èª¬
åŸæ¥ã®Reactã®ã¬ã³ããªã³ã°ã¯ã倧éšåãåæçã§ããããã³ã°ã§ãããã¹ããŒãã®æŽæ°ãçºçãããšãReactã¯å€æŽãDOMã«ã³ããããããã®ããã»ã¹ã¯ã¡ã€ã³ã¹ã¬ããããããã¯ãããŠãŒã¶ãŒå ¥åã®åŠçãã¢ãã¡ãŒã·ã§ã³ãšãã£ãä»ã®éèŠãªã¿ã¹ã¯ã®å®è¡ã劚ããå¯èœæ§ããããŸãããã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ã¯ãã¬ã³ããªã³ã°ã¿ã¹ã¯ãäžæãåéããèœåãå°å ¥ããããšã§ããããæ ¹æ¬çã«å€ããŸãã
Reactã®ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®äž»ãªç¹åŸŽã¯æ¬¡ã®ãšããã§ãïŒ
- åªå é äœä»ãïŒ Reactã¯ç°ãªãã¬ã³ããªã³ã°ã¿ã¹ã¯ã«åªå é äœãä»ããããšãã§ããããã«ãªããŸãããäŸãã°ãç·æ¥ã®æŽæ°ïŒãŠãŒã¶ãŒã®ã¿ã€ãã³ã°ãªã©ïŒã¯ãç·æ¥æ§ã®äœãæŽæ°ïŒããã¯ã°ã©ãŠã³ãã§ã®ããŒã¿ãã§ãããªã©ïŒãããé«ãåªå é äœãäžããããŸãã
- ããªãšã³ãã·ã§ã³ïŒ ããåªå 床ã®é«ãã¿ã¹ã¯ãå©çšå¯èœã«ãªã£ãå ŽåãReactã¯åªå 床ã®äœãã¬ã³ããªã³ã°ã¿ã¹ã¯ãäžæã§ããŸããããã«ãããéèŠãªãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãé·æéãããã¯ãããããšããªããªããŸãã
- ã¿ã€ããŒïŒ ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ã¯ãå éšã¿ã€ããŒãå©çšããŠäœæ¥ã管çã»ã¹ã±ãžã¥ãŒã«ããã¡ã€ã³ã¹ã¬ããã空ããŠããããšãç®æããŸããSuspenseïŒ ãã®æ©èœã«ãããã³ã³ããŒãã³ãã¯UIå šäœããããã¯ããããšãªãããŒã¿ããåŸ ã€ãããšãã§ãããã®éã¯ãã©ãŒã«ããã¯UIã衚瀺ããŸãã
ãã®ãã€ãã©ã€ã³ã®ç®æšã¯ã倧ããªã¬ã³ããªã³ã°ã¿ã¹ã¯ããã¬ãŒã ããžã§ãããè¶ ããã«å®è¡ã§ããå°ããªãã£ã³ã¯ã«åå²ããããšã§ããããã§ã¹ã±ãžã¥ãŒãªã³ã°ãéèŠã«ãªããŸãã
ã¹ã±ãžã¥ãŒã©ã®åœ¹å²
Reactã®ã¹ã±ãžã¥ãŒã©ã¯ãã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ã調æŽãããšã³ãžã³ã§ãã以äžã®åœ¹å²ãæ ããŸãïŒ
- æŽæ°ãªã¯ãšã¹ãïŒäŸïŒ`setState`ããïŒã®åä¿¡ã
- åæŽæ°ãžã®åªå é äœã®å²ãåœãŠã
- ã¡ã€ã³ã¹ã¬ããã®ãããã¯ãé¿ããããã«ãã¬ã³ããªã³ã°äœæ¥ããã€éå§ã忢ããããæ±ºå®ã
- äžèŠãªåã¬ã³ããªã³ã°ãæå°éã«æããããã®æŽæ°ã®ãããåŠçã
ã¹ã±ãžã¥ãŒã©ã¯ã1ãã¬ãŒã ãããã«è¡ãããäœæ¥éã劥åœãªç¯å²å ã«ä¿ã€ããšãç®æãããã¬ãŒã ããžã§ããã广çã«ç®¡çããŸããããã¯ãæœåšçã«å€§ããªã¬ã³ããŒãéåæã«åŠçã§ããåå¥ã®äœæ¥åäœã«åå²ããããšã§æ©èœããŸããã¹ã±ãžã¥ãŒã©ãçŸåšã®ãã¬ãŒã ã®ããžã§ãããè¶ éãããã ãšæ€åºããå ŽåãçŸåšã®ã¬ã³ããªã³ã°ã¿ã¹ã¯ãäžæåæ¢ãããã©ãŠã¶ã«å¶åŸ¡ãè²ãããŠãŒã¶ãŒå ¥åããã€ã³ãã£ã³ã°ãªã©ã®ä»ã®éèŠãªã€ãã³ããåŠçãããããšãã§ããŸãã
Reactã«ããããã¬ãŒã ããžã§ãã管çã®æŠç¥
ã³ã³ã«ã¬ã³ããªReactã¢ããªã±ãŒã·ã§ã³ã§ãã¬ãŒã ããžã§ããã广çã«ç®¡çããã«ã¯ãReactã®èœåãçè§£ããã³ã³ããŒãã³ãèšèšãšã¹ããŒã管çã®ãã¹ããã©ã¯ãã£ã¹ãæ¡çšããããšãçµã¿åããã£ãŠå¿ èŠã§ãã
1. `useDeferredValue` ãš `useTransition` ãæŽ»çšãã
ãããã®ããã¯ã¯ãã³ã³ã«ã¬ã³ãç°å¢ã§ã³ã¹ãã®é«ãUIæŽæ°ã管çããããã®åºç€ãšãªããŸãïŒ
- `useDeferredValue`: ãã®ããã¯ã䜿çšãããšãç·æ¥æ§ã®äœãUIéšåã®æŽæ°ãé å»¶ãããããšãã§ããŸããããã¯ãæ¥éã«å€åããå ¥åïŒæ€çŽ¢ã¯ãšãªãªã©ïŒãšããã®å ¥åã®çµæã衚瀺ããUIèŠçŽ ïŒæ€çŽ¢ããããããŠã³ãªã©ïŒãããå Žåã«æé©ã§ããçµæã®æŽæ°ãé å»¶ãããããšã§ãæ€çŽ¢çµæã®ã¬ã³ããªã³ã°ã«å°ãæéãããã£ãŠããå ¥åèªäœã¯å¿çæ§ãä¿ã€ããšãã§ããŸãã
äŸïŒ ãªã¢ã«ã¿ã€ã æ€çŽ¢ããŒãæ³åããŠãã ããããŠãŒã¶ãŒãå ¥åããã«ã€ããŠãæ€çŽ¢çµæãæŽæ°ãããŸããæ€çŽ¢ããžãã¯ãã¬ã³ããªã³ã°ãè€éãªå Žåãå ¥åãã£ãŒã«ããé ããªãå¯èœæ§ããããŸããæ€çŽ¢èªã«`useDeferredValue`ã䜿çšãããšãReactã¯å ¥åãã£ãŒã«ãã®æŽæ°ãåªå ããèšç®ã³ã¹ãã®é«ãæ€çŽ¢çµæã®ã¬ã³ããªã³ã°ãé å»¶ãããããšãã§ããŸãã
import React, { useState, useDeferredValue } from 'react';
function SearchComponent() {
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
const handleChange = (event) => {
setQuery(event.target.value);
};
// Imagine 'searchResults' is a computationally expensive operation
const searchResults = expensiveSearch(deferredQuery);
return (
{searchResults.map(result => (
- {result.name}
))}
);
}
- `useTransition`: ãã®ããã¯ã䜿çšãããšãã¹ããŒãæŽæ°ãããã©ã³ãžã·ã§ã³ããšããŠããŒã¯ã§ããŸãããã©ã³ãžã·ã§ã³ã¯ãReactãäžæã§ããç·æ¥æ§ã®äœãæŽæ°ã§ããããã¯ãå€§èŠæš¡ãªãªã¹ãã®ãã£ã«ã¿ãªã³ã°ãè€éãªãã¥ãŒéã®ããã²ãŒã·ã§ã³ãªã©ãã¬ã³ããªã³ã°ã«ããªãã®æéããããå¯èœæ§ã®ããæŽæ°ãããŒã¯ããã®ã«ç¹ã«äŸ¿å©ã§ãã`useTransition`ã¯`startTransition`颿°ãš`isPending`ããŒã«å€ãè¿ããŸãã`isPending`ãã©ã°ã¯ããã©ã³ãžã·ã§ã³ãé²è¡äžã«ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ã衚瀺ããããã«äœ¿çšã§ããŸãã
äŸïŒ ãŠãŒã¶ãŒã®éžæã«åºã¥ããŠãã£ã«ã¿ãªã³ã°ããå¿ èŠãããå€§èŠæš¡ãªããŒã¿ããŒãã«ãèããŠã¿ãŸãããã倧ããªããŒãã«ã®ãã£ã«ã¿ãªã³ã°ãšåã¬ã³ããªã³ã°ã«ã¯æéããããããšããããŸãããã£ã«ã¿ãªã³ã°ãããªã¬ãŒããã¹ããŒãæŽæ°ã`startTransition`ã§ã©ããããããšã§ãããç·æ¥ã®ã€ãã³ããçºçããå Žåã«ãã®æŽæ°ãäžæã§ããããšãReactã«äŒããUIã®ããªãŒãºãé²ããŸãã
import React, { useState, useTransition } from 'react';
function DataTable() {
const [data, setData] = useState([]);
const [filter, setFilter] = useState('');
const [isPending, startTransition] = useTransition();
const handleFilterChange = (event) => {
const newFilter = event.target.value;
startTransition(() => {
setFilter(newFilter);
// Potentially expensive filtering operation happens here or is triggered
// by the state update that is now a transition.
});
};
// Assume 'filteredData' is derived from 'data' and 'filter'
const filteredData = applyFilter(data, filter);
return (
{isPending && Loading...
}
{/* Render filteredData */}
);
}
2. ã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ãæé©åãã
ã³ã³ã«ã¬ã³ã·ãŒããã£ãŠããéå¹çãªã³ã³ããŒãã³ãã¬ã³ããªã³ã°ã¯ããã«ãã¬ãŒã ããžã§ããã䜿ãæãããŠããŸããŸãã以äžã®ãã¯ããã¯ã掻çšããŠãã ããïŒ
- `React.memo`: 颿°ã³ã³ããŒãã³ãã®å Žåã`React.memo`ã¯ã³ã³ããŒãã³ããã¡ã¢åããé«éã³ã³ããŒãã³ãã§ããpropsã倿Žãããå Žåã«ã®ã¿åã¬ã³ããªã³ã°ããã芪ãåã¬ã³ããªã³ã°ãããŠãã³ã³ããŒãã³ãã®propsãå€ãããªãå Žåã®äžèŠãªåã¬ã³ããªã³ã°ãé²ããŸãã
- `useCallback`: ã³ãŒã«ããã¯é¢æ°ãã¡ã¢åããŸããããã¯ãã¡ã¢åãããåã³ã³ããŒãã³ãïŒ`React.memo`ïŒã«ã³ãŒã«ããã¯ãæž¡ãéã«ç¹ã«äŸ¿å©ã§ã芪ã®ã¬ã³ããªã³ã°ããšã«æ°ãã颿°ã€ã³ã¹ã¿ã³ã¹ãäœæãããããšã«ããåã®åã¬ã³ããªã³ã°ãé²ããŸãã
- `useMemo`: èšç®çµæãã¡ã¢åããŸããã³ã³ããŒãã³ãå ã§å®è¡ãããè€éãªèšç®ãããå Žåã`useMemo`ã¯ãã®çµæããã£ãã·ã¥ããäŸåé¢ä¿ã倿Žãããå Žåã«ã®ã¿åèšç®ããããšã§ã貎éãªCPUãµã€ã¯ã«ãç¯çŽããŸãã
- ã³ã³ããŒãã³ãæ§é ãšãããã¡ã€ãªã³ã°ïŒ 倧ããªã³ã³ããŒãã³ããããå°ããã管çãããããã®ã«åå²ããŸããReact DevTools Profilerã䜿çšããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸããã³ã³ããŒãã³ãããããã¡ã€ã«ããŠãã©ã®ã³ã³ããŒãã³ããé »ç¹ã«åã¬ã³ããªã³ã°ãããŠãããããŸãã¯ã¬ã³ããªã³ã°ã«æéãããããããŠãããã確èªããŸãã
3. å¹ççãªã¹ããŒã管ç
ã¹ããŒãã®ç®¡çæ¹æ³ã¯ãã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãïŒ
- ããŒã«ã«ã¹ããŒã vs. ã°ããŒãã«ã¹ããŒãïŒ ã¹ããŒãã¯ã§ããã ãããŒã«ã«ã«ä¿ã¡ãŸããå€ãã®ã³ã³ããŒãã³ãéã§ã¹ããŒããå ±æããå¿ èŠãããå Žåã¯ãã°ããŒãã«ã¹ããŒã管çãœãªã¥ãŒã·ã§ã³ãæ€èšããŸãããã°ããŒãã«ã¹ããŒããžã®æŽæ°ãã©ã®ããã«åã¬ã³ããªã³ã°ãããªã¬ãŒãããã«æ³šæããŠãã ããã
- Context APIã®æé©åïŒ Reactã®Context APIã䜿çšããŠããå Žåãã³ã³ããã¹ããæ¶è²»ããã³ã³ããŒãã³ãã¯ãã³ã³ããã¹ãå€ã倿Žããããšãããšãé¢å¿ã®ããã³ã³ããã¹ãã®ç¹å®ã®éšåã倿ŽãããŠããªããŠãåã¬ã³ããªã³ã°ãããããšã«æ³šæããŠãã ãããã³ã³ããã¹ããåå²ããããã³ã³ããã¹ãå€ã«ã¡ã¢åæè¡ã䜿çšããããšãæ€èšããŠãã ããã
- ã»ã¬ã¯ã¿ãŒãã¿ãŒã³ïŒ ReduxãZustandã®ãããªã¹ããŒã管çã©ã€ãã©ãªã§ã¯ãã»ã¬ã¯ã¿ãŒã掻çšããŠãã³ã³ããŒãã³ããã°ããŒãã«ã¹ããŒãã®æŽæ°æã«åã¬ã³ããªã³ã°ãããã®ã§ã¯ãªãã賌èªããŠããç¹å®ã®ã¹ããŒãã倿Žãããå Žåã«ã®ã¿åã¬ã³ããªã³ã°ãããããã«ããŸãã
4. é·ããªã¹ãã®ããã®ä»®æ³å
äœåãã®ã¢ã€ãã ããªã¹ãã«ã¬ã³ããªã³ã°ãããšãã³ã³ã«ã¬ã³ã·ãŒã«é¢ä¿ãªãããã©ãŒãã³ã¹ã«æ·±å»ãªåœ±é¿ãäžããå¯èœæ§ããããŸããä»®æ³åïŒãŠã£ã³ããŠã€ã³ã°ãšãåŒã°ããïŒã¯ãçŸåšãã¥ãŒããŒãã«è¡šç€ºãããŠããã¢ã€ãã ã®ã¿ãã¬ã³ããªã³ã°ããæè¡ã§ãããŠãŒã¶ãŒãã¹ã¯ããŒã«ãããšãç»é¢å€ã®ã¢ã€ãã ã¯ã¢ã³ããŠã³ããããæ°ããã¢ã€ãã ãã¬ã³ããªã³ã°ãããŠããŠã³ããããŸãã`react-window`ã`react-virtualized`ã®ãããªã©ã€ãã©ãªã¯ããã®ããã®åªããããŒã«ã§ãã
äŸïŒ ãœãŒã·ã£ã«ã¡ãã£ã¢ã®ãã£ãŒããé·ãååãªã¹ããäžåºŠã«1000åã®ãªã¹ãã¢ã€ãã ãã¬ã³ããªã³ã°ãã代ããã«ãä»®æ³åã¯ç»é¢ã«è¡šç€ºããã10ã20åã®ã¢ã€ãã ã®ã¿ãã¬ã³ããªã³ã°ããŸããããã«ãããReactãšãã©ãŠã¶ã1ãã¬ãŒã ãããã«è¡ãäœæ¥éãå€§å¹ ã«åæžãããŸãã
5. ã³ãŒãåå²ãšé å»¶èªã¿èŸŒã¿
ãã¬ãŒã ããžã§ãã管çã«çŽæ¥é¢ä¿ããããã§ã¯ãããŸããããåæã®JavaScriptãã€ããŒããåæžããå¿ èŠãªãã®ã ããèªã¿èŸŒãããšã§ãäœæããã©ãŒãã³ã¹ãåäžãããã©ãŠã¶å šäœã®è² è·ãæžããããšã§éæ¥çã«åœ¹ç«ã€ããšããããŸããã³ã³ããŒãã³ãã®ã³ãŒãåå²ãå®è£ ããã«ã¯ã`React.lazy`ãš`Suspense`ã䜿çšããŸãã
import React, { Suspense, lazy } from 'react';
const ExpensiveComponent = lazy(() => import('./ExpensiveComponent'));
function App() {
return (
My App
Loading component... }>
6. ãããŠã³ã¹ãšã¹ããããªã³ã°
`useDeferredValue`ãš`useTransition`ã¯å€ãã®ã³ã³ã«ã¬ã³ã·ãŒé¢é£ã®é å»¶ãåŠçããŸãããåŸæ¥ã®ãããŠã³ã¹ãšã¹ããããªã³ã°ãé »ç¹ãªã€ãã³ãã管çããããã«äŸç¶ãšããŠäŸ¡å€ããããŸãïŒ
- ãããŠã³ã¹ïŒ äžå®æéã®é掻ååŸã«ã®ã¿é¢æ°ãåŒã³åºãããããã«ããŸããããã¯ããŠã£ã³ããŠã®ãªãµã€ãºãå ¥åã®å€æŽãªã©ããŠãŒã¶ãŒãæäœã忢ããåŸã®æçµçãªç¶æ ã®ã¿ã«é¢å¿ãããã€ãã³ãã«åœ¹ç«ã¡ãŸãã
- ã¹ããããªã³ã°ïŒ æå®ãããæéééå ã§é¢æ°ãæå€§1ååŒã³åºãããããã«ããŸããããã¯ãã¹ã¯ããŒã«ã®ãããªã€ãã³ãã«åœ¹ç«ã¡ãUIã宿çã«æŽæ°ããããããã¹ãŠã®ã¹ã¯ããŒã«ã€ãã³ãã§æŽæ°ããããªãå Žåã«äœ¿çšããŸãã
ãããã®ãã¯ããã¯ã¯ãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ã®ãã颿°ãžã®éå°ãªåŒã³åºããé²ãããã¬ãŒã ããžã§ãããä¿è·ããŸãã
7. ããããã³ã°æäœãé¿ãã
JavaScriptã³ãŒããã¡ã€ã³ã¹ã¬ããããããã¯ãããããªé·æéå®è¡ãããåææäœãå®è¡ããªãããã«ããŠãã ãããããã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- ã¡ã€ã³ã¹ã¬ããã§ã®éãèšç®ïŒ è€éãªèšç®ã¯Web Workerã«ãªãããŒããããã`useDeferredValue`ãŸãã¯`useTransition`ã䜿çšããŠé å»¶ãããŸãã
- åæçãªããŒã¿ãã§ããïŒ ããŒã¿ãã§ããã«ã¯åžžã«éåæã¡ãœããã䜿çšããŸãã
- Reactã®å¶åŸ¡å€ã§ã®å€§èŠæš¡ãªDOMæäœïŒ DOMãçŽæ¥æäœããå Žåã¯ãæ éãã€éåæã«è¡ããŸãã
ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ã®ãããã¡ã€ãªã³ã°ãšãããã°
ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ãçè§£ãæé©åããã«ã¯ãåªãããããã¡ã€ãªã³ã°ããŒã«ãå¿ èŠã§ãïŒ
- React DevTools ProfilerïŒ ãããäž»èŠãªããŒã«ã§ããã€ã³ã¿ã©ã¯ã·ã§ã³ãèšé²ããã©ã®ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããããããªãã¬ã³ããªã³ã°ãããããã©ããããã®æéãããã£ããã確èªã§ããŸããã³ã³ã«ã¬ã³ãã¢ãŒãã§ã¯ãReactãã©ã®ããã«äœæ¥ãåªå
é äœä»ãããäžæãããã芳å¯ã§ããŸãã以äžã«æ³šç®ããŠãã ããïŒ
- åã ã®ã³ã³ããŒãã³ãã®ã¬ã³ããŒæéã
- ã³ãããæéã
- ããªããããã¬ã³ããŒããããïŒãæ å ±ã
- `useTransition`ãš`useDeferredValue`ã®åœ±é¿ã
- ãã©ãŠã¶ã®ããã©ãŒãã³ã¹ããŒã«ïŒ Chrome DevToolsïŒããã©ãŒãã³ã¹ã¿ãïŒãFirefox Developer Toolsã¯ãJavaScriptã®å®è¡ãã¬ã€ã¢ãŠãããã€ã³ãã£ã³ã°ãã³ã³ããžããã«é¢ããè©³çŽ°ãªæŽå¯ãæäŸããŸããã¡ã€ã³ã¹ã¬ããããããã¯ããŠããé·ãã¿ã¹ã¯ãç¹å®ã§ããŸãã
- ãã¬ãŒã ãã£ãŒãïŒ React DevToolsãšãã©ãŠã¶ããŒã«ã®äž¡æ¹ããã¬ãŒã ãã£ãŒããæäŸããŸããããã¯ãJavaScript颿°ã®ã³ãŒã«ã¹ã¿ãã¯ãšå®è¡æéãèŠèŠçã«è¡šçŸããæéã®ãããæäœãç°¡åã«èŠã€ããããšãã§ããŸãã
ãããã¡ã€ãªã³ã°ããŒã¿ã®è§£é
ãããã¡ã€ãªã³ã°ããéã«ã¯ã以äžã«æ³šæããŠãã ããïŒ
- ãã³ã°ã¿ã¹ã¯ïŒ ã¡ã€ã³ã¹ã¬ããã§50ms以äžãããã¿ã¹ã¯ã¯ãèŠèŠçãªãžã£ã³ã¯ãåŒãèµ·ããå¯èœæ§ããããŸããã³ã³ã«ã¬ã³ãReactã¯ããããåå²ããããšãç®æããŸãã
- é »ç¹ãªåã¬ã³ããªã³ã°ïŒ ã³ã³ããŒãã³ãã®äžèŠãªåã¬ã³ããªã³ã°ãç¹ã«å€§èŠæš¡ãŸãã¯è€éãªã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ã¯ãããã«ãã¬ãŒã ããžã§ãããæ¶è²»ããå¯èœæ§ããããŸãã
- ã³ããããã§ãŒãºã®æéïŒ ReactãDOMãæŽæ°ããã®ã«ãããæéãã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ã¯ããããã³ããããã³ã°ã«ããããšãç®æããŠããŸãããéåžžã«é·ãã³ãããã¯äŸç¶ãšããŠå¿çæ§ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- `interleaved`ã¬ã³ããŒïŒ React DevTools Profilerã§ã¯ã`interleaved`ãšããŒã¯ãããã¬ã³ããŒã衚瀺ãããããšããããŸããããã¯ãReactãããåªå 床ã®é«ãæŽæ°ãåŠçããããã«ã¬ã³ããŒãäžæåæ¢ããããšã瀺ããŠãããããã¯ã³ã³ã«ã¬ã³ãã¢ãŒãã§æåŸ ãããæãŸããåäœã§ãã
ãã¬ãŒã ããžã§ãã管çã«ãããã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«æ§ç¯ããå Žåããã¬ãŒã ããžã§ããç®¡çæŠç¥ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããããã€ãã®èŠå ããããŸãïŒ
- ããã€ã¹ã®å€æ§æ§ïŒ ãŠãŒã¶ãŒã¯ããã€ãšã³ãã®ãã¹ã¯ããããã©ãããããããå®äŸ¡ãªã¹ããŒããã©ã³ãŸã§ãããŸããŸãªããã€ã¹ã§ã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããŸããããã©ãŒãã³ã¹ã®æé©åã¯ãæ§èœã®äœãããŒããŠã§ã¢ã䜿çšããŠãããŠãŒã¶ãŒã«ãšã£ãŠéåžžã«éèŠã§ããMacBook Proã§ã¹ã ãŒãºã«åäœããUIããããŒãšã³ãã®Androidããã€ã¹ã§ã¯ã«ã¯ã€ãå¯èœæ§ããããŸãã
- ãããã¯ãŒã¯ã®å€åæ§ïŒ ç°ãªãå°åã®ãŠãŒã¶ãŒã¯ãã€ã³ã¿ãŒãããã®é床ãä¿¡é Œæ§ã倧ããç°ãªãå ŽåããããŸãããã¬ãŒã ããžã§ããã«çŽæ¥é¢ä¿ããããã§ã¯ãããŸãããããããã¯ãŒã¯ãé ããšããŒã¿ãã§ãããé å»¶ãããããåã¬ã³ããªã³ã°ãããªã¬ãŒããããšã§ããã©ãŒãã³ã¹ã®åé¡ãæªåãããå¯èœæ§ããããŸããã³ãŒãåå²ãå¹ççãªããŒã¿ãã§ãããã¿ãŒã³ãªã©ã®ãã¯ããã¯ãäžå¯æ¬ ã§ãã
- ã¢ã¯ã»ã·ããªãã£ïŒ ããã©ãŒãã³ã¹ã®æé©åãã¢ã¯ã»ã·ããªãã£ã«æªåœ±é¿ãäžããªãããã«ããŠãã ãããäŸãã°ãä¿çäžã®ç¶æ ã瀺ãèŠèŠçãªæãããïŒã¹ãããŒãªã©ïŒã䜿çšããŠããå Žåãããããã¹ã¯ãªãŒã³ãªãŒããŒã«ãã£ãŠãã¢ããŠã³ã¹ãããããã«ããŠãã ããã
- æåçãªæåŸ ïŒ ããã©ãŒãã³ã¹ã¯æ®éçãªæåŸ ã§ããããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®ã³ã³ããã¹ãã¯ç°ãªãå ŽåããããŸããUIã®å¿çæ§ãããã®å°åã§ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã«æåŸ ããåäœãšäžèŽããŠããããšã確èªããŠãã ããã
ãã¹ããã©ã¯ãã£ã¹ã®æŠèŠ
Reactã®ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã§ãã¬ãŒã ããžã§ããã广çã«ç®¡çããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãæ¡çšããŠãã ããïŒ
- æ¥éã«å€åããå ¥åã«åºã¥ãç·æ¥æ§ã®äœãUIæŽæ°ãé å»¶ãããããã«`useDeferredValue`ã䜿çšããã
- äžæå¯èœãªç·æ¥æ§ã®äœãã¹ããŒãæŽæ°ãããŒã¯ããããã«`useTransition`ã䜿çšããããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ã«ã¯`isPending`ã䜿çšããã
- `React.memo`ã`useCallback`ã`useMemo`ã䜿çšããŠã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ãæé©åããã
- ã¹ããŒããããŒã«ã«ã«ä¿ã¡ãã°ããŒãã«ã¹ããŒããå¹ççã«ç®¡çããã
- é·ããªã¹ããä»®æ³åãã衚瀺ãããŠããã¢ã€ãã ã®ã¿ãã¬ã³ããªã³ã°ããã
- `React.lazy`ãš`Suspense`ã§ã³ãŒãåå²ã掻çšããã
- é »ç¹ãªã€ãã³ããã³ãã©ã«ãããŠã³ã¹ãšã¹ããããªã³ã°ãå®è£ ããã
- React DevToolsãšãã©ãŠã¶ã®ããã©ãŒãã³ã¹ããŒã«ã䜿çšããŠå·æã«ãããã¡ã€ãªã³ã°ããã
- ã¡ã€ã³ã¹ã¬ããã§ã®ããããã³ã°JavaScriptæäœãé¿ããã
- 倿§ãªããã€ã¹ãšãããã¯ãŒã¯æ¡ä»¶ã§ãã¹ãããã
çµè«
Reactã®ã³ã³ã«ã¬ã³ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã¯ãããã©ãŒãã³ã¹ãé«ãå¿çæ§ã®è¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããäžã§å€§ããªé£èºã衚ããŠããŸããé å»¶ãåªå é äœä»ããå¹ççãªã¬ã³ããªã³ã°ãªã©ã®ãã¯ããã¯ãéããŠãã¬ãŒã ããžã§ãããçè§£ããç©æ¥µçã«ç®¡çããããšã§ãäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠã¹ã ãŒãºã§æµãããããªæèŠã®ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããReactãæäŸããããŒã«ã掻çšããç±å¿ã«ãããã¡ã€ãªã³ã°ããåžžã«ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåªå ããŠãã ããããã¬ãŒã ããžã§ãã管çããã¹ã¿ãŒããããšã¯ãåãªãæè¡çãªæé©åã§ã¯ãªããã°ããŒãã«ãªããžã¿ã«ã©ã³ãã¹ã±ãŒãã§åªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã®éèŠãªã¹ãããã§ãã
仿¥ãããããã®ååãé©çšããŠãããéããããå¿çæ§ã®é«ãReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŸãããïŒ