ã«ãŒãããŒã¹ã®ãã³ãã«åå²ãçšããReactã®ã³ãŒãåå²ã«é¢ããå æ¬çã¬ã€ããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒäœéšãåäžããããã¯ããã¯ããã¹ããã©ã¯ãã£ã¹ãå®è·µçãªå®è£ æŠç¥ã解説ããŸãã
Reactã³ãŒãåå²ïŒããã©ãŒãã³ã¹ãæé©åããã«ãŒãããŒã¹ã®ãã³ãã«åå²
仿¥ã®ãŠã§ãéçºã®äžçã§ã¯ãé«éã§å¿çæ§ã®é«ããŠãŒã¶ãŒäœéšãæäŸããããšãæãéèŠã§ãããŠãŒã¶ãŒã¯å³æã®æºè¶³ãæåŸ ããŠãããèªã¿èŸŒã¿ã®é ãã¢ããªã±ãŒã·ã§ã³ã¯äžæºãé¢è±ã«ã€ãªããå¯èœæ§ããããŸããReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããããã®åŒ·åãªãã¯ããã¯ã®äžã€ãã³ãŒãåå²ã§ãããã®èšäºã§ã¯ãã«ãŒãããŒã¹ã®ã³ãŒãåå²ã®è©³çްãæãäžããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ãããå°ãã管çãããããã³ãã«ã«åå²ããçŸåšã®ã«ãŒãã«å¿ èŠãªã³ãŒãã®ã¿ãèªã¿èŸŒãæŠç¥ã§ãã
ã³ãŒãåå²ãçè§£ãã
ã³ãŒãåå²ãšã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããè€æ°ã®ãã³ãã«ã«åå²ãããªã³ããã³ããŸãã¯äžŠè¡ããŠèªã¿èŸŒããããã«ããææ³ã§ããã³ãŒããåå²ããããšã§ããã©ãŠã¶ã¯åæãã¥ãŒã®ã¬ã³ããªã³ã°ã«å¿ èŠãªã³ãŒãã®ã¿ãããŠã³ããŒãããã°ãããããã¢ããªã±ãŒã·ã§ã³ã®åæèªã¿èŸŒã¿æéãå€§å¹ ã«ççž®ã§ããŸãã
巚倧ãªåäžã®JavaScriptãã¡ã€ã«ãæäŸãã代ããã«ãã³ãŒãåå²ã«ãã£ãŠãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®æ©èœãã«ãŒãã«åãããŠããããããå°ããªãã£ã³ã¯ã«åå²ããããšãã§ããŸãããã®ã¢ãããŒãã«ã¯ãããã€ãã®éèŠãªå©ç¹ããããŸãïŒ
- åæèªã¿èŸŒã¿æéã®ççž®ïŒ ãã©ãŠã¶ãããŠã³ããŒãããåæãã³ãã«ãå°ãããªããååæç»ãé«éåããããŠãŒã¶ãŒã®äœæé床ãåäžããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒ ãã³ãã«ãå°ããã»ã©ãè§£æã»å®è¡ããã³ãŒããå°ãªããªããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãåäžããŸãã
- ãŠãŒã¶ãŒäœéšã®åäžïŒ éèŠãªã³ãŒããè¿ éã«èªã¿èŸŒãŸããããããŠãŒã¶ãŒã¯ããæ©ãã¢ããªã±ãŒã·ã§ã³ãæäœãå§ããããšãã§ããŸãã
- å¹ççãªãªãœãŒã¹å©çšïŒ åã«ãŒãã«å¿ èŠãªã³ãŒãã®ã¿ãèªã¿èŸŒãŸããããã垯åå¹ ã®æ¶è²»ãåæžããããªãœãŒã¹å©çšãæ¹åãããŸãã
ã«ãŒãããŒã¹ã®ã³ãŒãåå²ïŒæŠç¥çã¢ãããŒã
ã«ãŒãããŒã¹ã®ã³ãŒãåå²ã¯ãã¢ããªã±ãŒã·ã§ã³ãç°ãªãã«ãŒããããŒãžã«åºã¥ããŠåå²ããããšã«çŠç¹ãåœãŠãŠããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³å šäœãæåã«èªã¿èŸŒãŸãããã®ã®ãç¹å®ã®æç¹ã§ã¯ãã®äžéšãã衚瀺ãããªãã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒã«ãšã£ãŠç¹ã«å¹æçãªæŠç¥ã§ãã
ã«ãŒãããŒã¹ã®ã³ãŒãåå²ã§ã¯ãåã«ãŒããŸãã¯é¢é£ããã«ãŒãã®ã°ã«ãŒããå¥ã ã®ãã³ãã«ã«ãªããŸãããŠãŒã¶ãŒãç¹å®ã®ã«ãŒãã«ç§»åãããšã察å¿ãããã³ãã«ããªã³ããã³ãã§èªã¿èŸŒãŸããŸããããã«ããããŠãŒã¶ãŒã¯çŸåšã®ãã¥ãŒã«å¿ èŠãªã³ãŒãã®ã¿ãããŠã³ããŒãããããšãä¿èšŒãããåæèªã¿èŸŒã¿æéãæå°éã«æããããå šäœçãªããã©ãŒãã³ã¹ãåäžããŸãã
å®è£ ãã¯ããã¯ïŒåçã€ã³ããŒããšReact.lazy
Reactã¯ãäž»ã«åçã€ã³ããŒããšReact.lazyã³ã³ããŒãã³ããéããŠãã«ãŒãããŒã¹ã®ã³ãŒãåå²ãå®è£ ããããã®åªããããŒã«ãšAPIãæäŸããŠããŸãã
åçã€ã³ããŒã
åçã€ã³ããŒãã¯ãã¢ãžã¥ãŒã«ãéåæã«èªã¿èŸŒãããšãã§ããJavaScriptã®æ©èœã§ããéçã€ã³ããŒãïŒäŸïŒimport Component from './Component'
ïŒãšã¯ç°ãªããåçã€ã³ããŒãã¯ãããã¹ãè¿ãimport()
颿°ã䜿çšããŸãããã®ãããã¹ã¯ãã¢ãžã¥ãŒã«ãèªã¿èŸŒãŸãããšãã«ãã®ã¢ãžã¥ãŒã«ã®ãšã¯ã¹ããŒãã§è§£æ±ºãããŸãã
ããã«ãããã³ã³ããŒãã³ãã®ãªã³ããã³ãèªã¿èŸŒã¿ãå¯èœã«ãªããŸãã
äŸïŒ
const MyComponent = React.lazy(() => import('./MyComponent'));
ãã®äŸã§ã¯ãMyComponent
ã¯ãç¹å®ã®ã«ãŒãå
ã§ã¬ã³ããªã³ã°ããããšããªã©ãå¿
èŠãªå Žåã«ã®ã¿èªã¿èŸŒãŸããŸãã
React.lazy
React.lazy
ã¯ãä»ã®ã³ã³ããŒãã³ããé
å»¶èªã¿èŸŒã¿ããããããããã®Reactã®çµã¿èŸŒã¿ã³ã³ããŒãã³ãã§ããReactã³ã³ããŒãã³ãã«è§£æ±ºããããããã¹ãè¿ã颿°ãåŒæ°ã«åããŸããããã¯éåžžãåçã€ã³ããŒããšçµã¿åãããŠäœ¿çšãããŸãã
React.lazy
ã䜿çšããã«ã¯ãé
å»¶èªã¿èŸŒã¿ãããã³ã³ããŒãã³ãã<Suspense>
ã³ã³ããŒãã³ãã§ã©ããããå¿
èŠããããŸãã<Suspense>
ã³ã³ããŒãã³ãã䜿çšãããšãã³ã³ããŒãã³ãã®èªã¿èŸŒã¿äžã«ãã©ãŒã«ããã¯UIïŒäŸïŒããŒãã£ã³ã°ã¹ãããŒïŒã衚瀺ã§ããŸãã
äŸïŒ
import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
const Home = lazy(() => import('./routes/Home'));
const About = lazy(() => import('./routes/About'));
const Contact = lazy(() => import('./routes/Contact'));
function App() {
return (
Loading...
ãã®äŸã§ã¯ãHome
ãAbout
ãContact
ã³ã³ããŒãã³ãã¯ãããããã®ã«ãŒããã¢ã¯ã»ã¹ããããšãã«é
å»¶èªã¿èŸŒã¿ãããŸãã<Suspense>
ã³ã³ããŒãã³ãã¯ãã³ã³ããŒãã³ãã®èªã¿èŸŒã¿äžã«ãLoading...ããšè¡šç€ºããŸãã
å®è·µçãªå®è£ æé
Reactã¢ããªã±ãŒã·ã§ã³ã«ã«ãŒãããŒã¹ã®ã³ãŒãåå²ãå®è£ ããããã®ã¹ããããã€ã¹ãããã¬ã€ãã§ãïŒ
- ã«ãŒãã®ç¹å®ïŒ ã¢ããªã±ãŒã·ã§ã³å ã§åå¥ã®ãã³ãã«ã«åå²ã§ããã«ãŒããæ±ºå®ããŸããå¹çãé«ããããã«ãé¢é£ããã«ãŒããåäžã®ãã³ãã«ã«ã°ã«ãŒãåããããšãæ€èšããŠãã ããã
- ã«ãŒãã³ã³ããŒãã³ãã®äœæïŒ åã«ãŒããŸãã¯ã«ãŒãã®ã°ã«ãŒãã«å¯Ÿå¿ããReactã³ã³ããŒãã³ããäœæããŸãããããã®ã³ã³ããŒãã³ãã¯ãåçã€ã³ããŒããš
React.lazy
ã䜿çšããŠé å»¶èªã¿èŸŒã¿ãããŸãã - é
å»¶èªã¿èŸŒã¿ã®å®è£
ïŒ
React.lazy
ãšåçã€ã³ããŒãã䜿çšããŠãã«ãŒãã³ã³ããŒãã³ããéåæã«èªã¿èŸŒã¿ãŸããåé å»¶èªã¿èŸŒã¿ã³ã³ããŒãã³ãã<Suspense>
ã³ã³ããŒãã³ãã§ã©ããããèªã¿èŸŒã¿äžã®ãã©ãŒã«ããã¯UIãæäŸããŸãã - ã«ãŒãã£ã³ã°ã®èšå®ïŒ
react-router-dom
ã®ãããªã«ãŒãã£ã³ã°ã©ã€ãã©ãªã䜿çšããŠã«ãŒããå®çŸ©ããããããé å»¶èªã¿èŸŒã¿ã³ã³ããŒãã³ãã«é¢é£ä»ããŸãã - 培åºçãªãã¹ãïŒ ã¢ããªã±ãŒã·ã§ã³ã培åºçã«ãã¹ãããã³ãŒãåå²ãæ£ããæ©èœããé å»¶èªã¿èŸŒã¿ã³ã³ããŒãã³ããæåŸ ã©ããã«èªã¿èŸŒãŸããããšã確èªããŸãã
- ãã³ãã«ãµã€ãºã®æé©åïŒ ãã³ãã«ã®ãµã€ãºãåæãããµã€ãºãåæžããæ©äŒãç¹å®ããŸããWebpack Bundle Analyzerã®ãããªããŒã«ã䜿çšããŠãã³ãã«ã®å 容ãèŠèŠåãã倧ããªäŸåé¢ä¿ãç¹å®ããããšãæ€èšããŠãã ããã
é«åºŠãªãã¯ããã¯ãšèæ ®äºé
ã«ãŒãããŒã¹ã®ã³ãŒãåå²ã®åºæ¬çãªå®è£ ã¯æ¯èŒçç°¡åã§ãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒäœéšãããã«åäžãããããšãã§ããããã€ãã®é«åºŠãªãã¯ããã¯ãšèæ ®äºé ããããŸãã
ããªãã§ãã
ããªãã§ãããšã¯ããªãœãŒã¹ïŒäŸïŒãã³ãã«ïŒãå®éã«å¿ èŠã«ãªãåã«èªã¿èŸŒãããšã§ããããã«ããããŠãŒã¶ãŒãæ°ããã«ãŒãã«ç§»åãããšãã«èªã¿èŸŒã¿ã®é å»¶ã«æ°ã¥ããªãå¯èœæ§ããããããã¢ããªã±ãŒã·ã§ã³ã®äœæããã©ãŒãã³ã¹ãåäžãããã®ã«åœ¹ç«ã¡ãŸãã
ããªãã§ããã¯ã次ã®ãããªããŸããŸãªãã¯ããã¯ã䜿çšããŠå®è£ ã§ããŸãïŒ
<link rel="prefetch">
: ãã®HTMLã¿ã°ã¯ãæå®ããããªãœãŒã¹ãããã¯ã°ã©ãŠã³ãã§ããŠã³ããŒãããããã«ãã©ãŠã¶ã«æç€ºããŸããreact-router-dom
ã®<Link>
ã³ã³ããŒãã³ãïŒprefetch
ããããã£ã䜿çšããŠãç¹å®ã®ãªã³ã¯ã«é¢é£ä»ãããããªãœãŒã¹ãããªãã§ããã§ããŸãã- ã«ã¹ã¿ã ããªãã§ããããžãã¯ïŒ JavaScriptãš
import()
颿°ã䜿çšããŠãç¬èªã®ããªãã§ããããžãã¯ãå®è£ ã§ããŸãã
react-router-dom
ã®<Link>
ã䜿çšããäŸïŒ
import { Link } from 'react-router-dom';
function Nav() {
return (
);
}
ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãšã³ãŒãåå²
ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãšã³ãŒãåå²ãçµã¿åãããããšã§ãç¹ã«åæèªã¿èŸŒã¿æéã«ãããŠãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãããã«åäžãããããšãã§ããŸããSSRã䜿çšãããšããµãŒããŒäžã§åæHTMLãã¬ã³ããªã³ã°ãããããã¯ã©ã€ã¢ã³ãã«éä¿¡ã§ããŸããããã«ãããã¯ã©ã€ã¢ã³ãã§ããŠã³ããŒãããã³å®è¡ããå¿ èŠãããJavaScriptã®éãæžããååæç»ãé«éåãããŸãã
SSRãšã³ãŒãåå²ã䜵çšããå ŽåããµãŒããŒãåçã€ã³ããŒããšReact.lazy
ãåŠçã§ããããšã確èªããããšãéèŠã§ããNext.jsãGatsbyã®ãããªãã¬ãŒã ã¯ãŒã¯ã¯ãSSRãšã³ãŒãåå²ã®çµã¿èŸŒã¿ãµããŒããæäŸããŠããããããã®ãã¯ããã¯ãç°¡åã«å®è£
ã§ããŸãã
ãšã©ãŒãã³ããªã³ã°
é å»¶èªã¿èŸŒã¿ã䜿çšããå Žåãèªã¿èŸŒã¿ããã»ã¹äžã«çºçããå¯èœæ§ã®ããæœåšçãªãšã©ãŒãåŠçããããšãéèŠã§ããããšãã°ããããã¯ãŒã¯æ¥ç¶ãäžæããããããµãŒããŒãå©çšã§ããªããªã£ããããå¯èœæ§ããããŸãã
<ErrorBoundary>
ã³ã³ããŒãã³ãã䜿çšããŠãé
å»¶èªã¿èŸŒã¿ã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°äžã«çºçãããšã©ãŒããã£ããã§ããŸãã<ErrorBoundary>
ã³ã³ããŒãã³ãã䜿çšãããšããšã©ãŒãçºçããå Žåã«ãã©ãŒã«ããã¯UIã衚瀺ã§ããŸãã
äŸïŒ
import React, { Suspense, lazy } from 'react';
const MyComponent = lazy(() => import('./MyComponent'));
function ErrorFallback() {
return (
Oops! Something went wrong.
);
}
function MyErrorBoundary(props) {
return (
}>
{props.children}
);
}
function App() {
return (
Loading...