Reactãšã©ãŒããŠã³ããªãŒã䜿çšããŠãšã©ãŒãé©åã«åŠçããã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ãé²ããããè¯ããŠãŒã¶ãŒäœéšãæäŸããæ¹æ³ãåŠã³ãŸãããã¹ããã©ã¯ãã£ã¹ãšå®è·µçãªäŸãå«ã¿ãŸãã
Reactãšã©ãŒããŠã³ããªãŒïŒå ç¢ãªãšã©ãŒãã³ããªã³ã°ã¬ã€ã
ãŠã§ãéçºã®äžçã§ã¯ãå ç¢ã§å埩åã®ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšãæãéèŠã§ãããŠãŒã¶ãŒã¯ã·ãŒã ã¬ã¹ãªäœéšãæåŸ ããŠãããäºæãã¬ãšã©ãŒã¯ãã©ã¹ãã¬ãŒã·ã§ã³ãé¢è±ã«ã€ãªããå¯èœæ§ããããŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããããã®äººæ°ã®JavaScriptã©ã€ãã©ãªã§ããReactã¯ããšã©ãŒãé©åã«åŠçããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸããããããšã©ãŒããŠã³ããªãŒã§ãã
ãã®ã¬ã€ãã§ã¯ããšã©ãŒããŠã³ããªãŒã®æŠå¿µãæãäžãããã®ç®çãå®è£ ããã¹ããã©ã¯ãã£ã¹ããããŠReactã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ãšãŠãŒã¶ãŒäœéšãå€§å¹ ã«åäžãããæ¹æ³ã«ã€ããŠæ¢ããŸãã
Reactãšã©ãŒããŠã³ããªãŒãšã¯ïŒ
React 16ã§å°å ¥ããããšã©ãŒããŠã³ããªãŒã¯ãåã³ã³ããŒãã³ãããªãŒå ã®ã©ããã§çºçããJavaScriptãšã©ãŒããã£ãããããããã®ãšã©ãŒããã°ã«èšé²ããã³ã³ããŒãã³ãããªãŒå šäœãã¯ã©ãã·ã¥ããã代ããã«ãã©ãŒã«ããã¯UIã衚瀺ããReactã³ã³ããŒãã³ãã§ãããããã¯ã¢ããªã±ãŒã·ã§ã³ã®ã»ãŒããã£ãããã®ãããªãã®ã§ãèŽåœçãªãšã©ãŒãäŒæããŠãŠãŒã¶ãŒäœéšã劚ããã®ãé²ããŸããReactã³ã³ããŒãã³ãå ã§äŸå€ã屿çãã€å¶åŸ¡ãããæ¹æ³ã§åŠçããææ®µãæäŸããŸãã
ãšã©ãŒããŠã³ããªãŒãç»å Žããåã¯ãReactã³ã³ããŒãã³ãã§ãã£ãããããªãã£ããšã©ãŒã¯ãã¢ããªã±ãŒã·ã§ã³å šäœã®ã¯ã©ãã·ã¥ã空çœç»é¢ã®è¡šç€ºã«ã€ãªããããšããããããŸããããšã©ãŒããŠã³ããªãŒã䜿çšãããšããšã©ãŒã®åœ±é¿ãåé¢ããUIã®åœ±é¿ãåããéšåã®ã¿ããšã©ãŒã¡ãã»ãŒãžã«çœ®ãæããããã¢ããªã±ãŒã·ã§ã³ã®æ®ãã®éšåã¯æ©èœãç¶ããããšãä¿èšŒãããŸãã
ãªããšã©ãŒããŠã³ããªãŒã䜿çšããã®ãïŒ
ãšã©ãŒããŠã³ããªãŒã䜿çšããå©ç¹ã¯æ°å€ããããŸãïŒ
- ãŠãŒã¶ãŒäœéšã®åäžïŒ ã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ãã代ããã«ããŠãŒã¶ãŒã¯èŠªåãªãšã©ãŒã¡ãã»ãŒãžãç®ã«ããå詊è¡ãããã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã䜿ãç¶ãããããããšãã§ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§åäžïŒ ãšã©ãŒããŠã³ããªãŒã¯é£éçãªé害ãé²ãããšã©ãŒã®åœ±é¿ãã³ã³ããŒãã³ãããªãŒã®ç¹å®ã®éšåã«éå®ããŸãã
- ãããã°ã®å®¹æåïŒ ãšã©ãŒããŠã³ããªãŒã«ãã£ãŠãã£ããããããšã©ãŒããã°ã«èšé²ããããšã§ããšã©ãŒã®åå ã«é¢ãã貎éãªæŽå¯ãåŸãŠãã¢ããªã±ãŒã·ã§ã³ããã广çã«ãããã°ã§ããŸãã
- æ¬çªç°å¢ãžã®å¯Ÿå¿ïŒ ãšã©ãŒããŠã³ããªãŒã¯ãäºæãã¬ãšã©ãŒããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã®è©å€ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ãããæ¬çªç°å¢ã«ãããŠéåžžã«éèŠã§ãã
- ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ãµããŒãïŒ äžçäžããã®ãŠãŒã¶ãŒå ¥åãæ§ã ãªAPIããã®ããŒã¿ãæ±ãå Žåããšã©ãŒãçºçããå¯èœæ§ãé«ããªããŸãããšã©ãŒããŠã³ããªãŒã¯ãã°ããŒãã«ãªãŠãŒã¶ãŒã«å¯ŸããŠããå埩åã®ããã¢ããªã±ãŒã·ã§ã³ãå¯èœã«ããŸãã
ãšã©ãŒããŠã³ããªãŒã®å®è£ ïŒã¹ããããã€ã¹ãããã¬ã€ã
Reactã§ãšã©ãŒããŠã³ããªãŒãäœæããã®ã¯æ¯èŒçç°¡åã§ããstatic getDerivedStateFromError()
ãŸã㯠componentDidCatch()
ã©ã€ããµã€ã¯ã«ã¡ãœããïŒãããã¯ãã®äž¡æ¹ïŒãå®è£
ããã¯ã©ã¹ã³ã³ããŒãã³ããå®çŸ©ããå¿
èŠããããŸãã
1. ãšã©ãŒããŠã³ããªãŒã³ã³ããŒãã³ãã®äœæ
ãŸããåºæ¬çãªãšã©ãŒããŠã³ããªãŒã³ã³ããŒãã³ããäœæããŸãããïŒ
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// 次ã®ã¬ã³ããªã³ã°ã§ãã©ãŒã«ããã¯UIã衚瀺ãããããã«stateãæŽæ°ããŸãã
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// ãšã©ãŒå ±åãµãŒãã¹ã«ãšã©ãŒãèšé²ããããšãã§ããŸã
logErrorToMyService(error, errorInfo);
console.error("Caught error: ", error, errorInfo);
}
render() {
if (this.state.hasError) {
// ä»»æã®ã«ã¹ã¿ã ãã©ãŒã«ããã¯UIãã¬ã³ããªã³ã°ã§ããŸã
return (
Something went wrong.
{this.state.error && this.state.error.toString()}
{this.state.errorInfo && this.state.errorInfo.componentStack}
);
}
return this.props.children;
}
}
説æïŒ
constructor(props)
: ã³ã³ããŒãã³ãã®stateãhasError: false
ã§åæåããŸããstatic getDerivedStateFromError(error)
: ãã®ã©ã€ããµã€ã¯ã«ã¡ãœããã¯ãåå«ã³ã³ããŒãã³ãã«ãã£ãŠãšã©ãŒãã¹ããŒãããåŸã«åŒã³åºãããŸããã¹ããŒããããšã©ãŒãåŒæ°ãšããŠåãåããstateãæŽæ°ããããã®å€ãè¿ããŸãããã®å ŽåãhasError
ãtrue
ã«èšå®ããŸããcomponentDidCatch(error, errorInfo)
: ãã®ã©ã€ããµã€ã¯ã«ã¡ãœããã¯ãåå«ã³ã³ããŒãã³ãã«ãã£ãŠãšã©ãŒãã¹ããŒãããåŸã«åŒã³åºãããŸããã¹ããŒããããšã©ãŒãšãã©ã®ã³ã³ããŒãã³ãããšã©ãŒãã¹ããŒãããã«é¢ããæ å ±ãå«ããªããžã§ã¯ãïŒerrorInfo.componentStack
ïŒã®2ã€ã®åŒæ°ãåãåããŸããéåžžãããã§ãšã©ãŒå ±åãµãŒãã¹ã«ãšã©ãŒããã°èšé²ããŸããrender()
:this.state.hasError
ãtrue
ã®å Žåããã©ãŒã«ããã¯UIïŒãã®å Žåã¯ã·ã³ãã«ãªãšã©ãŒã¡ãã»ãŒãžïŒãã¬ã³ããªã³ã°ããŸããããã§ãªãå Žåã¯ãthis.props.children
ã䜿çšããŠåã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããŸãã
2. ã³ã³ããŒãã³ãããšã©ãŒããŠã³ããªãŒã§ã©ãããã
ãšã©ãŒããŠã³ããªãŒã³ã³ããŒãã³ããã§ããã®ã§ãä»»æã®ã³ã³ããŒãã³ãããªãŒãããã§ã©ããã§ããŸããäŸïŒ
MyComponent
ãŸãã¯ãã®åå«ã®ããããããšã©ãŒãã¹ããŒãããšãErrorBoundary
ãããããã£ããããŠãã©ãŒã«ããã¯UIãã¬ã³ããªã³ã°ããŸãã
3. ãšã©ãŒã®ãã®ã³ã°
ã¢ããªã±ãŒã·ã§ã³ã®åé¡ãç¹å®ãä¿®æ£ããããã«ããšã©ãŒããŠã³ããªãŒã«ãã£ãŠãã£ããããããšã©ãŒããã°ã«èšé²ããããšã¯éåžžã«éèŠã§ããcomponentDidCatch()
ã¡ãœããã¯ãããè¡ãã®ã«æé©ãªå Žæã§ãã
SentryãBugsnagãRollbarãªã©ã®ããŸããŸãªãšã©ãŒå ±åãµãŒãã¹ã䜿çšããŠãæ¬çªç°å¢ã®ãšã©ãŒã远跡ã§ããŸãããããã®ãµãŒãã¹ã¯ããšã©ãŒã®éçŽãã¹ã¿ãã¯ãã¬ãŒã¹åæããŠãŒã¶ãŒãã£ãŒãããã¯åéãªã©ã®æ©èœãæäŸããŸãã
æ¶ç©ºã®logErrorToMyService()
颿°ã䜿çšããäŸïŒ
componentDidCatch(error, errorInfo) {
logErrorToMyService(error, errorInfo);
console.error("Caught error: ", error, errorInfo);
}
ãšã©ãŒããŠã³ããªãŒã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
ãšã©ãŒããŠã³ããªãŒã广çã«å©çšããã«ã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- ç²åºŠïŒ ãšã©ãŒããŠã³ããªãŒã®é©åãªç²åºŠã決å®ããŸããã¢ããªã±ãŒã·ã§ã³ã®ã»ã¯ã·ã§ã³å šäœãã©ããããã®ã¯åºããããããããŸãããããã¹ãŠã®ã³ã³ããŒãã³ããã©ããããã®ã¯çްãããããããããŸãããäžèŠãªãªãŒããŒããããçããããããšãªããšã©ãŒã广çã«åé¢ãããã©ã³ã¹ãç®æããŸããããUIã®ç¬ç«ããã»ã¯ã·ã§ã³ãã©ããããã®ãè¯ãã¢ãããŒãã§ãã
- ãã©ãŒã«ããã¯UIïŒ ãŠãŒã¶ãŒã«åœ¹ç«ã€æ å ±ãæäŸããããŠãŒã¶ãŒãã¬ã³ããªãŒãªãã©ãŒã«ããã¯UIãèšèšããŸããæè¡çãªè©³çްãã¹ã¿ãã¯ãã¬ãŒã¹ã®è¡šç€ºã¯ãäžè¬ã®ãŠãŒã¶ãŒã«ã¯åœ¹ç«ããªãå¯èœæ§ãé«ãããé¿ããŠãã ããã代ããã«ãç°¡åãªãšã©ãŒã¡ãã»ãŒãžãæäŸããããŒãžã®åèªã¿èŸŒã¿ããµããŒããžã®é£çµ¡ãªã©ã®å¯èœãªã¢ã¯ã·ã§ã³ãææ¡ããŸããäŸãã°ãeã³ããŒã¹ãµã€ãã§ã¯æ¯æãã³ã³ããŒãã³ãã倱æããå Žåã«å¥ã®æ¯æãæ¹æ³ã詊ãããææ¡ãããããœãŒã·ã£ã«ã¡ãã£ã¢ã¢ããªã§ã¯ãããã¯ãŒã¯ãšã©ãŒãçºçããå Žåã«ãã£ãŒãã®æŽæ°ãææ¡ãããããããšãèããããŸãã
- ãšã©ãŒå ±åïŒ ãšã©ãŒããŠã³ããªãŒã«ãã£ãŠãã£ããããããšã©ãŒã¯ãå¿ ããšã©ãŒå ±åãµãŒãã¹ã«ãã°èšé²ããŠãã ãããããã«ãããæ¬çªç°å¢ã®ãšã©ãŒã远跡ããæ¹åç¹ãç¹å®ã§ããŸãããšã©ãŒãã°ã«ã¯ããšã©ãŒã¡ãã»ãŒãžãã¹ã¿ãã¯ãã¬ãŒã¹ããŠãŒã¶ãŒã³ã³ããã¹ããªã©ã®ååãªæ å ±ãå«ããããã«ããŠãã ããã
- é çœ®ïŒ ãšã©ãŒããŠã³ããªãŒãã³ã³ããŒãã³ãããªãŒå ã«æŠç¥çã«é 眮ããŸããå€éšAPIããããŒã¿ããã§ãããããããŠãŒã¶ãŒå ¥åãåŠçããããããªã©ããšã©ãŒãçºçããããã³ã³ããŒãã³ããã©ããããããšãæ€èšããŠãã ãããéåžžãã¢ããªå šäœãåäžã®ãšã©ãŒããŠã³ããªãŒã§ã©ããããã®ã§ã¯ãªããæãå¿ èŠãªå Žæã«è€æ°ã®ããŠã³ããªãŒãé 眮ããŸããäŸãã°ããŠãŒã¶ãŒãããã¡ã€ã«ã衚瀺ããã³ã³ããŒãã³ãããã©ãŒã éä¿¡ãåŠçããã³ã³ããŒãã³ãããŸãã¯ãµãŒãããŒãã£ã®å°å³ãã¬ã³ããªã³ã°ããã³ã³ããŒãã³ããªã©ãã©ããããããšãèããããŸãã
- ãã¹ãïŒ ãšã©ãŒããŠã³ããªãŒãæåŸ ã©ããã«æ©èœããŠããããšã確èªããããã«ã培åºçã«ãã¹ãããŠãã ãããã³ã³ããŒãã³ãã§ãšã©ãŒãã·ãã¥ã¬ãŒããããšã©ãŒããŠã³ããªãŒããããããã£ããããŠãã©ãŒã«ããã¯UIã衚瀺ããããšã確èªããŸããJestãReact Testing Libraryãªã©ã®ããŒã«ã¯ããšã©ãŒããŠã³ããªãŒã®åäœãã¹ããçµ±åãã¹ããäœæããã®ã«åœ¹ç«ã¡ãŸããAPIã®å€±æãç¡å¹ãªããŒã¿å ¥åãã·ãã¥ã¬ãŒãããŠãšã©ãŒãããªã¬ãŒããããšãã§ããŸãã
- ã€ãã³ããã³ãã©ã«ã¯äœ¿çšããªãïŒ ãšã©ãŒããŠã³ããªãŒã¯ã€ãã³ããã³ãã©å
ã®ãšã©ãŒããã£ããããŸãããã€ãã³ããã³ãã©ã¯Reactã®ã¬ã³ããŒããªãŒã®å€ã§å®è¡ãããŸããã€ãã³ããã³ãã©ã®ãšã©ãŒãåŠçããã«ã¯ãåŸæ¥ã®
try...catch
ãããã¯ã䜿çšããå¿ èŠããããŸãã - ã¯ã©ã¹ã³ã³ããŒãã³ãã䜿çšããïŒ ãšã©ãŒããŠã³ããªãŒã¯ã¯ã©ã¹ã³ã³ããŒãã³ãã§ãªããã°ãªããŸããã颿°ã³ã³ããŒãã³ãã¯å¿ èŠãªã©ã€ããµã€ã¯ã«ã¡ãœãããæããªãããããšã©ãŒããŠã³ããªãŒã«ã¯ãªããŸããã
ãšã©ãŒããŠã³ããªãŒã*䜿çšãã¹ãã§ãªã*å Žå
ãšã©ãŒããŠã³ããªãŒã¯éåžžã«äŸ¿å©ã§ããããã®éçãçè§£ããããšãéèŠã§ãã以äžã®åŠçãç®çãšããŠèšèšãããŠããŸããïŒ
- ã€ãã³ããã³ãã©ïŒ åè¿°ã®éããã€ãã³ããã³ãã©ã®ãšã©ãŒã«ã¯
try...catch
ãããã¯ãå¿ èŠã§ãã - éåæã³ãŒãïŒ éåæåŠçïŒäŸïŒ
setTimeout
ãrequestAnimationFrame
ïŒã®ãšã©ãŒã¯ãšã©ãŒããŠã³ããªãŒã§ã¯ãã£ãããããŸãããtry...catch
ãããã¯ãŸãã¯Promiseã®.catch()
ã䜿çšããŠãã ããã - ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒ ãšã©ãŒããŠã³ããªãŒã¯ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ç°å¢ã§ã¯åäœãç°ãªããŸãã
- ãšã©ãŒããŠã³ããªãŒèªäœã®ãšã©ãŒïŒ ãšã©ãŒããŠã³ããªãŒã³ã³ããŒãã³ãèªäœã®ãšã©ãŒã¯ãåããšã©ãŒããŠã³ããªãŒã§ã¯ãã£ãããããŸãããããã«ããç¡éã«ãŒãã鲿¢ãããŸãã
ãšã©ãŒããŠã³ããªãŒãšã°ããŒãã«ãªå©çšè
ã°ããŒãã«ãªå©çšè ã察象ãšããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåãå ç¢ãªãšã©ãŒãã³ããªã³ã°ã®éèŠæ§ã¯ããã«é«ãŸããŸãããšã©ãŒããŠã³ããªãŒãã©ã®ããã«è²¢ç®ãããã以äžã«ç€ºããŸãïŒ
- ããŒã«ãªãŒãŒã·ã§ã³ã®åé¡ïŒ ãã±ãŒã«ãç°ãªãã°ãããŒã¿åœ¢åŒãæåã»ãããç°ãªãå ŽåããããŸãããšã©ãŒããŠã³ããªãŒã¯ãäºæãã¬ããŒã«ãªãŒãŒã·ã§ã³ããŒã¿ã«ãã£ãŠåŒãèµ·ãããããšã©ãŒãé©åã«åŠçã§ããŸããäŸãã°ãæ¥ä»ãã©ãŒãããã©ã€ãã©ãªãç¹å®ã®ãã±ãŒã«ã®ç¡å¹ãªæ¥ä»æååã«ééããå Žåããšã©ãŒããŠã³ããªãŒã¯ãŠãŒã¶ãŒãã¬ã³ããªãŒãªã¡ãã»ãŒãžã衚瀺ã§ããŸãã
- APIã®å·®ç°ïŒ ã¢ããªã±ãŒã·ã§ã³ããããŒã¿æ§é ããšã©ãŒã¬ã¹ãã³ã¹ã«åŸ®åŠãªéããããè€æ°ã®APIãšçµ±åãããŠããå Žåããšã©ãŒããŠã³ããªãŒã¯äºæãã¬APIã®æ¯ãèãã«ããã¯ã©ãã·ã¥ãé²ãã®ã«åœ¹ç«ã¡ãŸãã
- ãããã¯ãŒã¯ã®äžå®å®æ§ïŒ äžçã®ããŸããŸãªå°åã®ãŠãŒã¶ãŒã¯ããããã¯ãŒã¯æ¥ç¶ã®ã¬ãã«ãç°ãªãå ŽåããããŸãããšã©ãŒããŠã³ããªãŒã¯ããããã¯ãŒã¯ã®ã¿ã€ã ã¢ãŠããæ¥ç¶ãšã©ãŒã«ãã£ãŠåŒãèµ·ãããããšã©ãŒãé©åã«åŠçã§ããŸãã
- äºæãã¬ãŠãŒã¶ãŒå ¥åïŒ ã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ã¯ãæåçãªéããèšèªã®å£ã«ãããäºæãã¬ãŸãã¯ç¡å¹ãªãŠãŒã¶ãŒå ¥åãåãåãå¯èœæ§ãé«ããªããŸãããšã©ãŒããŠã³ããªãŒã¯ãç¡å¹ãªå ¥åã«ããã¯ã©ãã·ã¥ãé²ãã®ã«åœ¹ç«ã¡ãŸããæ¥æ¬ã®ãŠãŒã¶ãŒã¯ç±³åœã®ãŠãŒã¶ãŒãšã¯ç°ãªã圢åŒã§é»è©±çªå·ãå ¥åããå¯èœæ§ããããã¢ããªã±ãŒã·ã§ã³ã¯äž¡æ¹ãé©åã«åŠçããå¿ èŠããããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒ ãšã©ãŒã¡ãã»ãŒãžã®è¡šç€ºæ¹æ³ã§ããããã¢ã¯ã»ã·ããªãã£ãèæ ®ããå¿ èŠããããŸãããšã©ãŒã¡ãã»ãŒãžãæç¢ºã§ç°¡æœã§ãããé害ãæã€ãŠãŒã¶ãŒã«ãã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŠãã ãããããã«ã¯ãARIA屿§ã®äœ¿çšããšã©ãŒã¡ãã»ãŒãžã®ä»£æ¿ããã¹ãã®æäŸãªã©ãå«ãŸããå ŽåããããŸãã
äŸïŒãšã©ãŒããŠã³ããªãŒã«ããAPIãšã©ãŒã®åŠç
ã°ããŒãã«APIããããŒã¿ãååŸããã³ã³ããŒãã³ãããããšããŸãããšã©ãŒããŠã³ããªãŒã䜿çšããŠæœåšçãªAPIãšã©ãŒãåŠçããæ¹æ³ã¯æ¬¡ã®ãšããã§ãïŒ
import React, { useState, useEffect } from 'react';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (e) {
setError(e);
} finally {
setLoading(false);
}
};
fetchData();
}, [userId]);
if (loading) {
return Loading user profile...
;
}
if (error) {
throw error; // ãšã©ãŒããŠã³ããªãŒã«ãšã©ãŒãã¹ããŒãã
}
if (!user) {
return User not found.
;
}
return (
{user.name}
Email: {user.email}
Location: {user.location}
);
}
function App() {
return (
);
}
export default App;
ãã®äŸã§ã¯ãUserProfile
ã³ã³ããŒãã³ããAPIãããŠãŒã¶ãŒããŒã¿ãååŸããŸããAPIããšã©ãŒïŒäŸïŒ404 Not Found, 500 Internal Server ErrorïŒãè¿ããå Žåãã³ã³ããŒãã³ãã¯ãšã©ãŒãã¹ããŒããŸããErrorBoundary
ã³ã³ããŒãã³ãããã®ãšã©ãŒããã£ãããããã©ãŒã«ããã¯UIãã¬ã³ããªã³ã°ããŸãã
ãšã©ãŒããŠã³ããªãŒã®ä»£æ¿ææ®µ
ãšã©ãŒããŠã³ããªãŒã¯äºæãã¬ãšã©ãŒã®åŠçã«åªããŠããŸããããããããšã©ãŒãé²ãããã«èæ ®ãã¹ãä»ã®ã¢ãããŒãããããŸãïŒ
- åãã§ãã¯ïŒTypeScript, FlowïŒïŒ åãã§ãã¯ã䜿çšãããšãæ¬çªç°å¢ã«æå ¥ãããåã«ãéçºäžã«åé¢é£ã®ãšã©ãŒããã£ããããã®ã«åœ¹ç«ã¡ãŸããTypeScriptãšFlowã¯JavaScriptã«éçåä»ãã远å ãã倿°ã颿°ãã©ã¡ãŒã¿ãæ»ãå€ã®åãå®çŸ©ã§ããŸãã
- ãªã³ãã£ã³ã°ïŒESLintïŒïŒ ESLintã®ãããªãªã³ã¿ãŒã¯ãæœåšçãªã³ãŒãå質ã®åé¡ãç¹å®ããã³ãŒãã£ã³ã°æšæºã匷å¶ããã®ã«åœ¹ç«ã¡ãŸããESLintã¯ãæªäœ¿çšã®å€æ°ãã»ãã³ãã³ã®æ¬ èœãæœåšçãªã»ãã¥ãªãã£è匱æ§ãªã©ã®äžè¬çãªãšã©ãŒããã£ããã§ããŸãã
- åäœãã¹ãïŒ ã³ã³ããŒãã³ãã®åäœãã¹ããäœæããããšã§ãããããæ£ããæ©èœããŠããããšã確èªãããããã€åã«ãšã©ãŒããã£ããããã®ã«åœ¹ç«ã¡ãŸããJestãReact Testing Libraryã®ãããªããŒã«ã䜿çšãããšãReactã³ã³ããŒãã³ãã®åäœãã¹ããç°¡åã«äœæã§ããŸãã
- ã³ãŒãã¬ãã¥ãŒïŒ ä»ã®éçºè ã«ã³ãŒããã¬ãã¥ãŒããŠãããããšã§ãæœåšçãªãšã©ãŒãç¹å®ããã³ãŒãå šäœã®å質ãåäžãããããšãã§ããŸãã
- é²åŸ¡çããã°ã©ãã³ã°ïŒ ããã¯ãæœåšçãªãšã©ãŒãäºæž¬ããããããé©åã«åŠçããã³ãŒããæžãããšãå«ã¿ãŸããäŸãã°ãæ¡ä»¶æã䜿çšããŠnullå€ãç¡å¹ãªå ¥åããã§ãã¯ããããšãã§ããŸãã
çµè«
Reactãšã©ãŒããŠã³ããªãŒã¯ãç¹ã«ã°ããŒãã«ãªå©çšè ã察象ãšãããå ç¢ã§å埩åã®ããWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®äžå¯æ¬ ãªããŒã«ã§ãããšã©ãŒãé©åã«ãã£ãããããã©ãŒã«ããã¯UIãæäŸããããšã§ããŠãŒã¶ãŒäœéšãå€§å¹ ã«åäžãããã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ãé²ããŸãããã®ç®çãå®è£ ããã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã§ããšã©ãŒããŠã³ããªãŒã掻çšããŠãçŸä»£ã®Webã®è€éãã«å¯Ÿå¿ã§ãããããå®å®ããä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
å æ¬çãªãšã©ãŒãã³ããªã³ã°æŠç¥ãæ§ç¯ããããã«ããšã©ãŒããŠã³ããªãŒãåãã§ãã¯ããªã³ãã£ã³ã°ãåäœãã¹ããªã©ã®ä»ã®ãšã©ãŒé²æ¢æè¡ãšçµã¿åãããããšãå¿ããªãã§ãã ããã
ãããã®æè¡ãåãå ¥ããããšã§ãããå ç¢ã§ããããŠãŒã¶ãŒãã¬ã³ããªãŒã§ãã°ããŒãã«ãªå©çšè ã®èª²é¡ã«å¯Ÿå¿ã§ããReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã