srccomponents..ããããã»ãšãã©ã®Reactãããžã§ã¯ããå§ãŸãæ§é ã ãšæããŸãããã ããéåžžããããžã§ã¯ãã®äŸåé¢ä¿ã®æ°ãå¢ãããšãããã°ã©ããŒã¯ããã®æ§é ã«å«ãŸããã³ã³ããŒãã³ããã¬ãã¥ãŒãµãŒãããã³ãã®ä»ã®åå©çšå¯èœãªã¡ã«ããºã ã®æ°ã®å¢å ã«çŽé¢ããŸããæã«ã¯ããã¯ãã¹ãŠéåžžã«äžå¿«ã«ãªãã管çãå°é£ã«ãªããŸããããšãã°ãç¹å®ã®äŸåé¢ä¿ãå¿
èŠãªçç±ãšãããããã©ã®ããã«çµã¿åãããããæç¢ºã§ãªããªã£ãå Žåã¯ã©ãããã°ããã§ããïŒãŸãã¯ããããžã§ã¯ãã«éåžžã«å€ãã®ã³ã³ããŒãã³ããèç©ãããŠããããããããã®äžããé©åãªã³ã³ããŒãã³ããèŠã€ããããšãå°é£ã«ãªã£ãå Žåã¯ã©ããªããŸããïŒããã°ã©ããŒãååãå¿ããç¹å®ã®ã³ã³ããŒãã³ããèŠã€ããå¿
èŠãããå Žåã¯ã©ãããã°ããã§ããïŒ
ãããã¯ãKarifyã§ããã³ããšã³ããäœãçŽããŠãããšãã«çããèŠã€ããªããã°ãªããªãã£ã質åã®ã»ãã®äžäŸã§ããäŸåé¢ä¿ãšãããžã§ã¯ãã³ã³ããŒãã³ãã®æ°ããã€ãæã«è² ããªããªãå¯èœæ§ãããããšã¯ããã£ãŠããŸãããããã¯ããããžã§ã¯ããæé·ããã«ã€ããŠãèªä¿¡ãæã£ãŠäœæ¥ãç¶ç¶ã§ããããã«ããã¹ãŠãèšç»ããå¿ èŠãããããšãæå³ããŸããããã®èšç»ã«ã¯ããã¡ã€ã«ãšãã©ã«ããŒã®æ§é ããã³ã³ãŒãã®å質ã«é¢ããåæãå«ãŸããŠããŸãããããã«ã¯ããããžã§ã¯ãã®å šäœçãªã¢ãŒããã¯ãã£ã®èª¬æãå«ãŸããŠããŸããããããŠæãéèŠãªããšã¯ããããžã§ã¯ãã«åå ããæ°ããããã°ã©ããŒãããããã¹ãŠãç°¡åã«èªèã§ããããã«ããå¿ èŠããããŸãããããããããšã§ããããžã§ã¯ãã«åå ããããã«ããããžã§ã¯ããé·ãç ç©¶ããããããã¹ãŠã®äŸåé¢ä¿ãšã³ãŒãã®ã¹ã¿ã€ã«ãçè§£ããå¿ èŠããªããªããŸãã
ãã®èšäºã®å·çæç¹ã§ãç§ãã¡ã®ãããžã§ã¯ãã«ã¯çŽ1200ã®JavaScriptãã¡ã€ã«ããããŸãããããã®350ã¯ã³ã³ããŒãã³ãã§ããã³ãŒãã¯80ïŒ ãŠããããã¹ãæžã¿ã§ãã以åã«äœæãããããžã§ã¯ãã¢ãŒããã¯ãã£ã®ãã¬ãŒã ã¯ãŒã¯å ã§ç¢ºç«ããã³äœæ¥ããå¥çŽãåŒãç¶ãé å®ããŠãããããããããã¹ãŠãäžè¬ã®äººã ãšå ±æããããšããå§ãããŸãããã®ããã«ããŠãã®èšäºãçãŸããŸãããããã§ã¯ãå€§èŠæš¡ãªReactã¢ããªã±ãŒã·ã§ã³ã®éçºãæŽçããæ¹æ³ãšãããã«åãçµãã çµéšããåŠãã æèšã«ã€ããŠèª¬æããŸãã
ãã¡ã€ã«ããã©ã«ããæŽçããã«ã¯ã©ãããã°ããã§ããïŒ
ãããžã§ã¯ãã®ããã€ãã®æ®µéãçµãåŸãReactããã³ããšã³ãã®è³æã䟿å©ã«æŽçããæ¹æ³ãèŠã€ããŸãããæåã¯ãjQueryããŒã¹ã®ããã³ããšã³ãã³ãŒããä¿åãããŠããã®ãšåããªããžããªã§ãããžã§ã¯ãè³æããã¹ãããäºå®ã§ããããã ãã䜿çšããŠããããã¯ãšã³ããã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠãããžã§ã¯ãã«èª²ãããããã©ã«ããŒæ§é ã®èŠä»¶ã®ããããã®ãªãã·ã§ã³ã¯æ©èœããŸããã§ãããæ¬¡ã«ãããã³ããšã³ãã³ãŒããå¥ã®ãªããžããªã«ç§»åããããšãæ€èšããŸãããæåã¯ãã®ã¢ãããŒãã¯ããŸãæ©èœããŸããããæéã®çµéãšãšãã«ããããžã§ã¯ãã®ä»ã®ã¯ã©ã€ã¢ã³ãéšåãããšãã°ReactNativeã«åºã¥ãããã³ããšã³ãã®äœæã«ã€ããŠèãå§ããŸãããããã«ãããã³ã³ããŒãã³ãã©ã€ãã©ãªã«ã€ããŠèããããã«ãªããŸããããã®çµæãæ°ãããªããžããªã2ã€ã®å¥ã ã®ãªããžããªã«åå²ããŸããã 1ã€ã¯ã³ã³ããŒãã³ãã©ã€ãã©ãªçšã§ããã1ã€ã¯æ°ããReactããã³ããšã³ãçšã§ãããæåã¯ãã®ã¢ã€ãã¢ã¯æåããããã«èŠããŸãããããã®å®è£ ã«ãããã³ãŒãã¬ãã¥ãŒæé ãå€§å¹ ã«è€éã«ãªããŸããã 2ã€ã®ãªããžããªã®å€æŽã®é¢ä¿ãäžæç¢ºã«ãªããŸããããã®çµæãã³ãŒããåäžã®ãªããžããªã«ä¿åããããã«å床åãæ¿ããããšã«ããŸããããçŸåšã¯åäžã®ãªããžããªã«ãªã£ãŠããŸãã
ã³ã³ããŒãã³ãã®ã©ã€ãã©ãªãšãããžã§ã¯ãã®ããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ãåé¢ãããã£ãã®ã§ãã¢ããªããžããªã«æ±ºããŸãããã¢ããªããžããªãšä»ã®åæ§ã®ãªããžããªã®éãã¯ããªããžããªå ã§ããã±ãŒãžãå ¬éããå¿ èŠããªãã£ãããšã§ããç§ãã¡ã®å Žåãããã±ãŒãžã¯éçºã®ã¢ãžã¥ãŒã«æ§ã確ä¿ããææ®µã§ãããæžå¿µãåé¢ããããã®ããŒã«ã§ãããã¢ããªã±ãŒã·ã§ã³ã®ããªã¢ã³ãããšã«ç°ãªãããã±ãŒãžãçšæãããšãããããã«ç°ãªãäŸåé¢ä¿ãå®çŸ©ããããããã«ç°ãªãã¹ã¯ãªãããé©çšã§ãããããç¹ã«äŸ¿å©ã§ããã«ãŒããã¡ã€ã«ã§æ¬¡ã®æ§æã䜿çšããŠãyarnã¯ãŒã¯ã¹ããŒã¹ã
䜿çšããŠã¢ããªããžããªãèšå®ããŸãã
package.json
"workspaces": [
"app/*",
"lib/*",
"tool/*"
]
ä»ã®ã¢ããªããžããªãšåãããã«ããªãããã±ãŒãžãã©ã«ãã䜿çšããªãã£ãã®ãçåã«æãããæ¹ãããã£ããããããããŸãããããã¯äž»ã«ãã¢ããªã±ãŒã·ã§ã³ãšã³ã³ããŒãã³ãã©ã€ãã©ãªãåé¢ãããã£ãããã§ããããã«ãç¬èªã®ããŒã«ãããã€ãäœæããå¿ èŠãããããšãããã£ãŠããŸããããã®çµæãäžèšã®ãã©ã«ãæ§é ã«å°éããŸããããããã®ãã©ã«ãããããžã§ã¯ãã§ã©ã®ããã«åçãããããæ¬¡ã«ç€ºããŸãã
appïŒãã®ãã©ã«ãå ã®ãã¹ãŠã®ããã±ãŒãžã¯ãKarifyããã³ããšã³ãããã®ä»ã®å éšããã³ããšã³ããªã©ã®ããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ã«é¢é£ããŠããŸããã¹ããŒãªãŒããã¯ã®è³æãããã«ä¿åãããŠããŸããlib: -, , . , , . , ,typography,mediaprimitive.tool: , , Node.js. , , , . , , webpack, , ( « »).
ãã¹ãŠã®ããã±ãŒãžã«ã¯ãä¿åãããŠãããã©ã«ããŒã«é¢ä¿ãªãããµããã©ã«ããŒ
srcãšããªãã·ã§ã³ã§ãã©ã«ããŒããããŸãbinãsrcãã£ã¬ã¯ããªappãšã«ä¿åãããŠããããã±ãŒãžãã©ã«ãã«libã¯ã次ã®ãµããã©ã«ããå«ãŸããŠããå ŽåããããŸãã
actionsïŒreduxãŸãã¯ãã颿°ããã£ã¹ãããããããã«æ»ãå€ãæž¡ãããšãã§ããã¢ã¯ã·ã§ã³ãäœæããããã®é¢æ°ãå«ãŸããŠããŸãuseReducerãcomponentsïŒã³ã³ããŒãã³ãã®ãã©ã«ããŒãšãã®ã³ãŒãã翻蚳ããŠããããã¹ããã¹ãããã·ã§ãããå±¥æŽïŒç¹å®ã®ã³ã³ããŒãã³ãã«è©²åœããå ŽåïŒãå«ãŸããŸããconstantsïŒãã®ãã©ã«ãã«ã¯ãããŸããŸãªç°å¢ã§å€æŽãããŠããªãå€ãæ ŒçŽãããŸãããŠãŒãã£ãªãã£ãããã«ä¿åãããŸããfetchïŒããã¯ãAPIããåä¿¡ããããŒã¿ãåŠçããããã®ã¿ã€ãå®çŸ©ãšããã®ãããªããŒã¿ãåä¿¡ããããã«äœ¿çšããã察å¿ããéåæã¢ã¯ã·ã§ã³ãæ ŒçŽãããå Žæã§ããhelpers: , .reducers: ,reduxuseReducer.routes: ,react-routerhistory.selectors: , redux-, , API.
ãã®ãã©ã«ãæ§é ã«ãããäŸåé¢ä¿ã«ãã£ãŠå®çŸ©ãããããŸããŸãªæŠå¿µéã§è²¬ä»»ãåå²ããããã®æç¢ºãªã·ã¹ãã ãäœæããããããçã«ã¢ãžã¥ãŒã«åŒã®ã³ãŒããèšè¿°ã§ããŸããããã«ããããªããžããªã§å€æ°ã颿°ãã³ã³ããŒãã³ããæ€çŽ¢ã§ããŸããããã«ãããããæ¢ããŠãã人ããããã®ååšãç¥ã£ãŠãããã©ããã«é¢ä¿ãªããæ€çŽ¢ã§ããŸããããã«ãæå°éã®ã³ã³ãã³ããå¥ã ã®ãã©ã«ããŒã«ä¿æããã®ã«åœ¹ç«ã¡ãŸããããã«ãããã³ã³ãã³ãã®æäœãç°¡åã«ãªããŸãã
ãã®ãã©ã«ãæ§é ãé©çšãå§ãããšãããã®ãããªæ§é ã®äžè²«ããé©çšãä¿èšŒãããšãã課é¡ã«çŽé¢ããŸãããããŸããŸãªããã±ãŒãžãæäœããå Žåãéçºè ã¯ãããã®ããã±ãŒãžã®ãã©ã«ããŒã«ããŸããŸãªãã©ã«ããŒãäœæãããããã®ãã©ã«ããŒå ã®ãã¡ã€ã«ãããŸããŸãªæ¹æ³ã§æŽçããããšãã§ããŸããå¿ ãããæªãããšã§ã¯ãããŸãããããã®ãããªãŸãšãŸãã®ãªãã¢ãããŒãã¯æ··ä¹±ãæããŸããäžèšã®æ§é ãäœç³»çã«é©çšã§ããããã«ãããã¡ã€ã«ã·ã¹ãã ãªã³ã¿ãŒããšåŒã°ãããã®ãäœæããŸãããããã«ã€ããŠã¯ä»ãã話ããŸãã
ã¹ã¿ã€ã«ã¬ã€ããé©çšãããŠããããšãã©ã®ããã«ç¢ºèªããŸããïŒ
ãããžã§ã¯ãã§ã¯ããã¡ã€ã«ãšãã©ã«ããŒã®æ§é ã®çµ±äžã«åªããŸãããã³ãŒãã«ã€ããŠãåãããšãå®çŸãããã£ãã®ã§ãããã®æãŸã§ã«ããããžã§ã¯ãã®jQueryããŒãžã§ã³ã§åæ§ã®åé¡ã解決ããããšã«æåããçµéšããããŸããããç¹ã«CSSã«é¢ããŠã¯ãæ¹åãã¹ãç¹ããããããããŸããããã®çµæãã¹ã¿ã€ã«ã¬ã€ããäžããäœæãããªã³ã¿ãŒãšäžç·ã«äœ¿çšããããšã«ããŸããããªã³ã¿ãŒã§æœè¡ã§ããªãã£ãã«ãŒã«ã¯ãã³ãŒãã¬ãã¥ãŒäžã«ç®¡çãããŸããã
ã¢ããªããžããªã§ã®ãªã³ã¿ãŒã®èšå®ã¯ãä»ã®ãªããžããªãšåãæ¹æ³ã§è¡ãããŸããããã¯ã1åã®ãªã³ã¿ãŒå®è¡ã§ãªããžããªå šäœããã§ãã¯ã¢ãŠãã§ããã®ã§äŸ¿å©ã§ãããªã³ã¿ãŒã«æ £ããŠããªãå Žåã¯ãESLintãšStylelintãã芧ã«ãªãããšããå§ãããŸããç§ãã¡ã¯ããããæ£ç¢ºã«äœ¿çšããŸãã
JavaScriptãªã³ã¿ãŒã®äœ¿çšã¯ã次ã®ç¶æ³ã§ç¹ã«åœ¹ç«ã€ããšã蚌æãããŠããŸãã
- ã³ã³ãã³ãã®ã¢ã¯ã»ã·ããªãã£ã念é ã«çœ®ããŠæ§ç¯ãããã³ã³ããŒãã³ããã察å¿ããHTMLã®ä»£ããã«äœ¿çšãããããã«ããŸããã¹ã¿ã€ã«ã¬ã€ããäœæããéã«ããªã³ã¯ããã¿ã³ãç»åãã¢ã€ã³ã³ã®ã¢ã¯ã»ã¹å¯èœæ§ã«é¢ããããã€ãã®ã«ãŒã«ãå°å ¥ããŸãããæ¬¡ã«ãã³ãŒãã§ãããã®ã«ãŒã«ãé©çšããå°æ¥ãããããå¿ããªãããã«ããå¿ èŠããããŸãããããã¯ãeslint-plugin-reactã®react / forbid- elementsã«ãŒã«ã䜿çšããŠè¡ããŸããã
ãããã©ã®ããã«èŠãããã®äŸã§ãïŒ
'react/forbid-elements': [
'error',
{
forbid: [
{
element: 'img',
message: 'Use "<Image>" instead. This is important for accessibility reasons.',
},
],
},
],
- . , , , , . import/no-restricted-paths eslint-plugin-import.
JavaScriptãšCSSã®ãªã³ãã£ã³ã°ã«å ããŠãç¬èªã®ããã¡ã€ã«ã·ã¹ãã ãªã³ã¿ãŒãããããŸããç§ãã¡ãéžãã ãã©ã«ãæ§é ã®åäžãªäœ¿çšãä¿èšŒããã®ã¯åœŒã§ããããã¯èªåã§äœæããããŒã«ãªã®ã§ãå¥ã®ãã©ã«ãæ§é ã«åãæ¿ããããšã«ããå Žåã¯ããã€ã§ãããã«å¿ããŠå€æŽã§ããŸãããã¡ã€ã«ããã©ã«ããæäœãããšãã«å¶åŸ¡ããã«ãŒã«ã®äŸã次ã«ç€ºããŸãã
- ã³ã³ããŒãã³ãã®ãã©ã«ãæ§é ã確èªããŸãããã©ã«ããšåãååã®ãã¡ã€ã«
index.tsãš.tsx.fileãåžžã«ååšããããšã確èªããŸãã - ãã¡ã€ã«ã®æ€èšŒ
package.jsonïŒããã±ãŒãžããšã«ãã®ãããªãã¡ã€ã«ã1ã€ãããããã±ãŒãžã誀ã£ãŠå ¬éprivateãtrueããªãããã«ããããã£ãèšå®ãããŠããããšã確èªããŸãã
ã©ã®ã¿ã€ãã®ã·ã¹ãã ãéžæããå¿ èŠããããŸããïŒ
仿¥ããã®ã»ã¯ã·ã§ã³ã®ã¿ã€ãã«ã«ãã質åãžã®çãã¯ãããããå€ãã®äººã«ãšã£ãŠéåžžã«ç°¡åã§ããTypeScriptã䜿çšããå¿ èŠããããŸããå Žåã«ãã£ãŠã¯ããããžã§ã¯ãã®ãµã€ãºã«é¢ä¿ãªããTypeScriptãå®è£ ãããšéçºãé ããªãããšããããŸããããããããã¯ã³ãŒãã®å質ãšå³å¯ããæ¹åããããã«æ¯æã劥åœãªäŸ¡æ Œã§ãããšç§ãã¡ã¯ä¿¡ããŠããŸãã
æ®å¿µãªãããç§ãã¡ããããžã§ã¯ãã«åãçµã¿å§ãããšããprop-typesã·ã¹ãã ã¯ãŸã éåžžã«åºã䜿çšãããŠããŸããã..ãäœæ¥ã®éå§æã«ã¯ããã§ååã§ãããããããžã§ã¯ããæé·ããã«ã€ããŠãã³ã³ããŒãã³ãã§ã¯ãªããšã³ãã£ãã£ã®åã宣èšããæ©èœã倱ãå§ããŸãããããã«ãããããšãã°ãã¬ãã¥ãŒãµãŒãã»ã¬ã¯ã¿ãŒã®æ¹åã«åœ¹ç«ã€ããšãããããŸããããã ãããããžã§ã¯ãã«å¥ã®ã¿ã€ãã³ã°ã·ã¹ãã ãå°å ¥ããã«ã¯ãã³ãŒãããŒã¹å šäœãã¿ã€ãã³ã°ããããã«å€ãã®ã³ãŒããªãã¡ã¯ã¿ãªã³ã°ãå¿ èŠã«ãªããŸãã
çµå±ãç§ãã¡ã¯ãããžã§ã¯ãã«ã¿ã€ããµããŒããè£ åããŸããããæåã«Flowã詊ããšããééããç¯ããŸããã..ãFlowã¯ãããžã§ã¯ãã«çµ±åããæ¹ãç°¡åã§ããããã«æãããŸãããããã¯äºå®ã§ããããç§ãã¡ã¯å®æçã«ãããŒã«é¢ããŠããããçš®é¡ã®åé¡ãæ±ããŠããŸããããã®ã·ã¹ãã ã¯IDEãšããŸãçµ±åã§ããŸããã§ãããäžæãªçç±ã§ãã°ãæ€åºãããªãã£ãå Žåããããæ±çšã¿ã€ãã®äœæã¯æ¬åœã«æªå€¢ã§ããããããã®çç±ããããã¹ãŠãTypeScriptã«ç§»è¡ããããšã«ãªããŸãããç§ãã¡ãä»ç¥ã£ãŠããããšãç¥ã£ãŠããã°ãããã«TypeScriptãéžæããŸãã
TypeScriptãè¿å¹Žéçºãããæ¹åæ§ã«ããããã®ç§»è¡ã¯ç§ãã¡ã«ãšã£ãŠéåžžã«ç°¡åã§ãããTSLintããESLintãžã®ç§»è¡ã¯ãç§ãã¡ã«ãšã£ãŠç¹ã«åœ¹ã«ç«ã¡ãŸããã
ã³ãŒãããã¹ãããã«ã¯ã©ãããã°ããã§ããïŒ
ç§ãã¡ããããžã§ã¯ãã«åãçµã¿å§ãããšããã©ã®ãã¹ãããŒã«ãéžæãããã¯ããŸãæç¢ºã§ã¯ãããŸããã§ãããä»èããŠã¿ããšããŠããããã¹ããšçµ±åãã¹ãã§ã¯ããããããžã§ã¹ããšãµã€ãã¬ã¹ã䜿çšããã®ãæåã ãšæããŸãããããã®ããŒã«ã¯ååã«ææžåãããŠããã䜿ããããã§ããå¯äžã®æ®å¿µãªç¹ã¯ããµã€ãã¬ã¹ãFetch APIããµããŒãããŠããªãããšã§ããæªãç¹ã¯ããã®ããŒã«ã®APIãasync / awaitæ§æã䜿çšããããã«èšèšãããŠããªãããšã§ãããããã䜿ãå§ããŠããã«ã¯ããããŸããã§ãããããããè¿ãå°æ¥ãç¶æ³ãæ¹åãããããšãé¡ã£ãŠããŸãã
æåã¯ããŠããããã¹ããæžãããã®æè¯ã®æ¹æ³ãèŠã€ããã®ã¯å°é£ã§ãããæéã®çµéãšãšãã«ãã¹ãããã·ã§ãããã¹ãããã¹ãã¬ã³ãã©ãŒãæµ ãã¬ã³ãã©ãŒãªã©ã®ã¢ãããŒãã詊ããŠããŸããããã¹ãã©ã€ãã©ãªã詊ããŠã¿ãŸãããæçµçã«ã¯æµ ãã¬ã³ããªã³ã°ã«ãªããã³ã³ããŒãã³ãã®åºåããã¹ãããããã«äœ¿çšããããã¹ãã¬ã³ããªã³ã°ã䜿çšããŠã³ã³ããŒãã³ãã®å éšããžãã¯ããã¹ãããŸããã
ãã¹ãã©ã€ãã©ãªã¯ãå°èŠæš¡ãªãããžã§ã¯ãã«é©ãããœãªã¥ãŒã·ã§ã³ã§ãããšç¢ºä¿¡ããŠããŸãããããããã®ã·ã¹ãã ãDOMã¬ã³ããªã³ã°ã«äŸåããŠãããšããäºå®ã¯ããã³ãããŒã¯ã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããŸãããŸãããã®æ¹å€ã¯éåžžã«ãæ·±ããã³ã³ããŒãã³ãã«é¢ããŠã¯ããµãŒãã§ã¹ã¬ã³ããªã³ã°ã䜿çšããã¹ãããã·ã§ãããã¹ãã¯é¢ä¿ãããŸãããç§ãã¡ã«ãšã£ãŠãã¹ãããã·ã§ããã¯ãã³ã³ããŒãã³ããåºåããããã®ãã¹ãŠã®å¯èœãªãªãã·ã§ã³ããã§ãã¯ããã®ã«éåžžã«åœ¹ç«ã€ããšãããããŸããããã ããã³ã³ããŒãã³ãã³ãŒãã¯é床ã«è€éã«ããªãã§ãã ãããèªã¿ãããããããã«åªããå¿ èŠããããŸããããã¯ãã³ã³ããŒãã³ããå°ãã
toJSONããã¹ãããã·ã§ããã«é¢ä¿ã®ãªãã³ã³ããŒãã³ãå
¥åã®ã¡ãœãããå®çŸ©ããããšã§å®çŸã§ããŸãã
ãŠããããã¹ããå¿ããªãããã«ããã¹ãã«ããã³ãŒãã«ãã¬ããžãããå€ãèšå®ããŸã..ãåè«ã§ãããã¯éåžžã«ç°¡åã§ãèããããšã¯ããŸããããŸããããã¹ãã«ãã£ãŠã°ããŒãã«ã³ãŒãã«ãã¬ããžã®ã€ã³ãžã±ãŒã¿ãèšå®ããã ãã§ååã§ãããã®ãããäœæ¥ã®éå§æã«ããã®æ°å€ã60ïŒ ã«èšå®ããŸãããæéã®çµéãšãšãã«ãã³ãŒãããŒã¹ã®ãã¹ãã«ãã¬ããžãæ¡å€§ããã«ã€ããŠã80ïŒ ã«å¢å ããŸããããã¹ãã§100ïŒ ã®ã³ãŒãã«ãã¬ããžãç®æããŠåªåããå¿ èŠã¯ãªããšèããŠããããããã®ææšã«ã¯æºè¶³ããŠããŸãããã¹ãã§ãã®ã¬ãã«ã®ã³ãŒãã«ãã¬ããžãéæããããšã¯ãç§ãã¡ã«ã¯çŸå®çã§ã¯ãªãããã§ãã
æ°ãããããžã§ã¯ãã®äœæãç°¡çŽ åããæ¹æ³ã¯ïŒ
éåžžãReactã¢ããªã±ãŒã·ã§ã³ã®äœæ¥ã®éå§ã¯éåžžã«ç°¡åã§ã
ReactDOM.render(<App />, document.getElementById(â#rootâ));ããã ããSSRïŒãµãŒããŒåŽã¬ã³ããªã³ã°ããµãŒããŒã¬ã³ããªã³ã°ïŒããµããŒãããå¿
èŠãããå Žåããã®ã¿ã¹ã¯ã¯ããè€éã«ãªããŸããããã«ãã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ã«React以å€ã®ãã®ãå«ãŸããŠããå Žåãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ã³ãŒãã§ç°ãªããã©ã¡ãŒã¿ãŒã䜿çšããå¿
èŠãããå ŽåããããŸããããšãã°ãåœéåã«ã¯react-intlãã°ããŒãã«ç¶æ
管çã«ã¯react- reduxãã«ãŒãã£ã³ã°ã«ã¯react-routerãéåæã¢ã¯ã·ã§ã³ã®ç®¡çã«ã¯redux-sagaã䜿çšããŸãããããã®äŸåé¢ä¿ã«ã¯ãããã€ãã®èª¿æŽãå¿
èŠã§ãããããã®äŸåé¢ä¿ãæ§æããããã»ã¹ã¯é£ããå ŽåããããŸãã
ãã®åé¡ã«å¯Ÿããç§ãã¡ã®è§£æ±ºçã¯ããæŠç¥ããšãæœè±¡ãã¡ã¯ããªãŒãã®èšèšãã¿ãŒã³ã«åºã¥ããŠããŸããã以åã¯ã2ã€ã®ç°ãªãã¯ã©ã¹ïŒ2ã€ã®ç°ãªãæŠç¥ïŒãäœæããŠããŸããã1ã€ã¯ã¯ã©ã€ã¢ã³ãæ§æçšã§ããã1ã€ã¯ãµãŒããŒæ§æçšã§ãããããã®ã¯ã©ã¹ã¯äž¡æ¹ãšããååãããŽãã¬ãã¥ãŒãµãŒãã«ãŒããããã©ã«ãèšèªãsagasïŒredux-sagaã®å ŽåïŒãªã©ãå«ããäœæãããã¢ããªã±ãŒã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒãåãåããŸãããã¬ãã¥ãŒãµãŒãã«ãŒãããµã¬ã¯ãã¢ããªããžããªã®ããŸããŸãªããã±ãŒãžããååŸã§ããŸããæ¬¡ã«ããã®æ§æã䜿çšããŠãreduxã¹ãã¢ãsagasããã«ãŠã§ã¢ãã«ãŒã¿ãŒå±¥æŽãªããžã§ã¯ããäœæããŸãããŸãã翻蚳ãããŒãããããã¢ããªã±ãŒã·ã§ã³ãã¬ã³ããªã³ã°ãããããããã«ã䜿çšãããŸããããšãã°ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®æŠç¥ã®çœ²åã¯æ¬¡ã®ãšããã§ãã
type BootstrapConfiguration = {
logo: string,
name: string,
reducers: ReducersMapObject,
routes: Route[],
sagas: Saga[],
};
class AbstractBootstrap {
configuration: BootstrapConfiguration;
intl: IntlShape;
store: Store;
rootSaga: Task;
abstract public run(): void;
abstract public render<T>(): T;
abstract protected createIntl(): IntlShape;
abstract protected createRootSaga(): Task;
abstract protected createStore(): Store;
}
//
class WebBootstrap extends AbstractBootstrap {
constructor(config: BootstrapConfiguration);
public render<ReactNode>(): ReactNode;
}
//
class ServerBootstrap extends AbstractBootstrap {
constructor(config: BootstrapConfiguration);
public render<string>(): string;
}
ã³ãŒããå®è¡ãããç°å¢ã«å¿ããŠãã¹ãã¬ãŒãžããµã¬ãåœéåãªããžã§ã¯ããããã³å±¥æŽã®èšå®ã«ããã€ãã®éããããããããã®æŠç¥ã®åé¢ã圹ç«ã€ããšãããããŸãããããšãã°ãã¯ã©ã€ã¢ã³ãäžã®reduxã¹ãã¢ã¯ããµãŒããŒããããªããŒããããããŒã¿ãšredux-devtools-extensionã䜿çšããŠäœæãããŸããããã¯ãµãŒããŒã§ã¯å¿ èŠãããŸããããã1ã€ã®äŸã¯ãã¯ã©ã€ã¢ã³ãã§ã¯navigator.languagesããããµãŒããŒã§ã¯Accept-LanguageHTTPããããŒããçŸåšã®èšèªãååŸããåœéåãªããžã§ã¯ãã§ãã
ç§ãã¡ããã®æ±ºå®ã«è³ã£ãã®ã¯ãã£ãšåã®ããšã§ããããšã«æ³šæããããšãéèŠã§ããã¯ã©ã¹ã¯ãŸã Reactã¢ããªã±ãŒã·ã§ã³ã§åºã䜿çšãããŠããŸããããã¢ããªã±ãŒã·ã§ã³ã®ãµãŒããŒåŽã¬ã³ããªã³ã°ãå®è¡ããããã®ç°¡åãªããŒã«ã¯ãããŸããã§ãããæéã®çµéãšãšãã«ãReactã©ã€ãã©ãªã¯æ©èœçãªã¹ã¿ã€ã«ã«åããŠäžæ©ãèžã¿åºããNext.jsã®ãããªãããžã§ã¯ããç»å ŽããŸããããã®ããšã念é ã«çœ®ããŠãåæ§ã®åé¡ã®è§£æ±ºçãæ¢ããŠããå Žåã¯ãçŸåšã®æè¡ã調æ»ããããšããå§ãããŸããããã«ãããããããã䜿çšããŠãããã®ãããåçŽã§æ©èœçãªãã®ãèŠã€ããããšãã§ããŸãã
ã³ãŒãã®å質ãé«ã¬ãã«ã«ä¿ã€ã«ã¯ã©ãããã°ããã§ããïŒ
ãªã³ã¿ãŒããã¹ããã¿ã€ããã§ãã¯-ãããã¯ãã¹ãŠãã³ãŒãã®åè³ªã«æçãªå¹æããããããŸããããããããã°ã©ããŒã¯ããã©ã³ãã«ã³ãŒããå«ããåã«ãé©åãªãã§ãã¯ãå®è¡ããããšãç°¡åã«å¿ããããšãã§ããŸã
masterãæåã®æ¹æ³ã¯ããã®ãããªãã§ãã¯ãèªåçã«å®è¡ããããšã§ããäžéšã®äººã
ã¯ãGitããã¯ã䜿çšããŠãã¹ãŠã®ã³ãããã§ãããè¡ãããšã奜ã¿ãŸãããã³ãŒãããã¹ãŠã®ãã§ãã¯ã«åæ ŒãããŸã§ã³ãããã§ããŸããããããããã®ã¢ãããŒãã§ã¯ãã·ã¹ãã ãããã°ã©ããŒã®äœæ¥ã«å¹²æžãããããšèããŠããŸããçµå±ã®ãšãããããšãã°ãç¹å®ã®ãã©ã³ãã§ã®äœæ¥ã«ã¯æ°æ¥ãããå Žåããããããããã¹ãŠã®æ¥ã¯ããªããžããªãžã®éä¿¡ã«é©ããŠãããšã¯èªèãããŸããããããã£ãŠãç¶ç¶çãªçµ±åã·ã¹ãã ã䜿çšããŠã³ãããããã§ãã¯ããŸããããŒãžèŠæ±ã«é¢é£ä»ããããŠãããã©ã³ãã®ã³ãŒãã®ã¿ããã§ãã¯ãããŸããããã«ããã倱æããããšãä¿èšŒãããŠãããã§ãã¯ã®å®è¡ãåé¿ã§ããŸããããã¯ããããã®çµæããã¹ãŠã®ãã§ãã¯ã«åæ Œã§ããããšã確å®ãªå Žåã«ããããžã§ã¯ãã®ã¡ã€ã³ã³ãŒãã«äœæ¥ã®çµæãå«ããããã«èŠæ±ããããšãã»ãšãã©ã ããã§ãã
èªåã³ãŒãæ€èšŒã®ãããŒã¯ãäŸåé¢ä¿ã®ã€ã³ã¹ããŒã«ããå§ãŸããŸããç¶ããŠãã¿ã€ããã§ãã¯ããªã³ã¿ãŒã®å®è¡ããŠããããã¹ãã®å®è¡ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ãããã³ããããã¹ãã®å®è¡ãè¡ãããŸãããããã®ã¿ã¹ã¯ã®ã»ãšãã©ãã¹ãŠã䞊è¡ããŠå®è¡ãããŸãããããã®ã¹ãããã®ããããã§ãšã©ãŒãçºçãããšããã§ãã¯ã¢ãŠãããã»ã¹å šäœã倱æãã察å¿ãããã©ã³ããã¡ã€ã³ãããžã§ã¯ãã³ãŒãã«å«ããããšãã§ããªããªããŸããããã¯ãæ©èœããã³ãŒãã¬ãã¥ãŒã·ã¹ãã ã®äŸã§ãã

èªåã³ãŒãæ€èšŒ
ãã®ã·ã¹ãã ã®ã»ããã¢ããäžã«ééããäž»ãªåé¡ã¯ããã§ãã¯ã®å®è¡ãé«éåããããšã§ããããã®ã¿ã¹ã¯ã¯ãŸã é¢é£ããŠããŸããå€ãã®æé©åãå®è¡ããŸãããããããã®ãã§ãã¯ã¯ãã¹ãŠçŽ20åã§å®å®ããŠããŸããããããããã®ææšã¯ãããã€ãã®ããããã¹ãã®å®è¡ã䞊ååããããšã§æ¹åã§ããŸãããä»ã®ãšããç§ãã¡ã«é©ããŠããŸãã
çµæ
å€§èŠæš¡ãªReactã¢ããªã±ãŒã·ã§ã³ã®éçºãæŽçããã®ã¯ç°¡åãªäœæ¥ã§ã¯ãããŸãããããã解決ããã«ã¯ãããã°ã©ããŒã¯å€ãã®æ±ºå®ãäžãå¿ èŠããããå€ãã®ããŒã«ãæ§æããå¿ èŠããããŸããåæã«ããã®ãããªã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«éçºããããšãã質åã«å¯Ÿããåäžã®æ£ããçãã¯ãããŸããã
ç§ãã¡ã®ã·ã¹ãã ã¯ãããŸã§ã®ãšããç§ãã¡ã«åã£ãŠããŸããããã«ã€ããŠè©±ãããšããç§ãã¡ãçŽé¢ããã®ãšåãã¿ã¹ã¯ã«çŽé¢ããŠããä»ã®ããã°ã©ããŒã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸããç§ãã¡ã®äŸã«åŸãããšã«ããå Žåã¯ãæåã«ãããã§èª¬æããããšãããªããšããªãã®äŒç€Ÿã«ãšã£ãŠæ£ããããšã確èªããŠãã ãããæãéèŠãªããšã¯ãããããªãºã ã«åªããããšã§ããã¢ããªãããŒã«ãããã®äœæã«äœ¿çšãããã®ãé床ã«è€éã«ããªãã§ãã ããã
å€§èŠæš¡ãªReactãããžã§ã¯ãã®éçºãçµç¹åããã¿ã¹ã¯ã«ã©ã®ããã«ã¢ãããŒãããŸããïŒ
