æ©èœããªã¯ãšã¹ãããŸããããããšããã°ãå ±åããŸããïŒ
匷å
çŸåšã®åäœã¯äœã§ããïŒ
誀ã£ãŠReactã®ã€ã³ã¹ã¿ã³ã¹ãè€æ°ãããŸããã
ããã¯ã䜿ãããšãããšã次ã®ãšã©ãŒãçºçããŸãã
hooks can only be called inside the body of a function component
é¢æ°ã³ã³ããŒãã³ãã䜿çšããŠããã®ã§ãããã¯æ£ãããããŸããã åé¡ã®æ¬åœã®åå ãèŠã€ããã®ã«ãã°ããæéãããããŸããã
æåŸ ãããåäœã¯äœã§ããïŒ
æ£ãããšã©ãŒã¡ãã»ãŒãžã衚瀺ããŸãã ã¢ããªã«Reactã®ã€ã³ã¹ã¿ã³ã¹ãè€æ°ããããšãæ€åºããããããã°ã®åå ã§ããå¯èœæ§ããããšèšã£ãŠããå¯èœæ§ããããŸãã
æ確ã«ããããã«ãã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ã«äœ¿çšããããã®ãšã¯ç°ãªãreact
ã¢ãžã¥ãŒã«ããããã¯ïŒããšãã°useState
ïŒãã€ã³ããŒãããŠããŸãããïŒ
ãããæ··ä¹±ãæãããšã«åæããŸãã ä»ã®Reactã¢ãžã¥ãŒã«ãã¬ã³ããªã³ã°ãããŠãããã©ãããç¥ãæ¹æ³ããããã©ããã¯ããããŸããã AFAIKã¯ãè€æ°ã®Reactã€ã³ã¹ã¿ã³ã¹ãåãã°ããŒãã«ã³ã³ããã¹ãã§åé¡ãªãåäœã§ããããã«ãReactãå¯èœãªéãåé¢ããŠå®è¡ããããã«ããŠããŸãã
ãã以å€ã®å Žåã¯ããããããšã©ãŒã¡ãã»ãŒãžãæŽæ°ããæ··ä¹±ããããªãéãããã®ã±ãŒã¹ã«ã€ããŠãèšåããããšãã§ããŸãã
ã¯ãã React1 === React2
ãæ¯èŒããŸãããã false
ïŒReact1ã¯index.jsããã®ãã®ã§ãReact2ã¯ããã¯ã䜿çšãããã¡ã€ã«ããã®ãã®ã§ãïŒã ãããçºçãããšãããã¯ã¯äžèšã®äžè¬çãªãšã©ãŒã¡ãã»ãŒãžã§å€±æããŸãã
ãã®åé¡ã¯ããã®ã±ãŒã¹ã®èªèãé«ããããããããã«çŽé¢ããŠãã人ã ãå©ããããã«äœããã®æ¹æ³ã§ãšã©ãŒã¡ãã»ãŒãžãæ¹åããããšã§ãã ããããããã¯ããããéåžžã«ãšããžã§ãã
ãããç§ã¯èªåãäœæããŠããããã±ãŒãžãnpmãªã³ã¯ããããšããŸããã ä»ã®ããã±ãŒãžãããã¯ã䜿çšããŠããããç¬èªã®Reactã䜿çšããŠãããããåããšã©ãŒãã¹ããŒãããŸãã ããã±ãŒãžãNPMã«å ¬éããŠãããNPMããçŽæ¥ã€ã³ããŒãããå¿ èŠããããŸããã ããããã°ãšã©ãŒã¯ãªããªããŸãããããã¹ãããã«ããã±ãŒãžãå ¬éããã®ã¯æªãããšãªã®ã§ããããä¿®æ£ãããããšãé¡ã£ãŠããŸãã
Lerna monoreposã¯ãã«ã¹ã¿ã ããã¯ã1ã€ã®ããã±ãŒãžã§å®çŸ©ãããã·ã³ããªãã¯ãªã³ã¯ãããäŸåé¢ä¿ãreactã®ç¬èªã®ã³ããŒã䜿çšãããããå¥ã®ããã±ãŒãžã§äœ¿çšãããå Žåã«ãããã®åé¡ã«æ©ãŸãããŸãã
çŸåšã npm-link-shared
ãšprestart
npmã¹ã¯ãªããã䜿çšããŠãäžæ¹ã®ããã±ãŒãžã®react
äŸåé¢ä¿ãããäžæ¹ã®ããã±ãŒãžãžã®ã·ã³ããªãã¯ãªã³ã¯ã«çœ®ãæããïŒããããŒãªïŒåé¿çããããŸããåãã€ã³ã¹ã¿ã³ã¹ã
"prestart": "npm-link-shared ./node_modules/<other package>/node_modules . react"
åãåé¡ãçºçãã次ã®ããã«è¿œå ããŠè§£æ±ºããŸããã
alias: {
react: path.resolve('./node_modules/react')
}
ã¡ã€ã³ã¢ããªã®webpackæ§æã®resolve
ããããã£ã«ã
Reactã2ã€äœ¿çšããã®ã¯æããã«ç§ã®ééãã§ãããããšã©ãŒã¡ãã»ãŒãžããã£ãšè¯ããã°çŽ æŽããããšæããŸãã ããã¯ãããã次ã®ãããªãã®ã ãšæããŸãïŒ https ïŒ//github.com/facebook/react/issues/2402
@mpeyperåäœããŸãã ããããšã
@apieceofbartããã¯ç§ã®ããã«åããã ææ¡ãããããšãã ð
ç§ãç解ããŠããããã«ããã®åé¡ã¯ãåããã³ãã«ã«Reactã®è€æ°ã®ã³ããŒãããå Žåã«çºçããŸãã
https://medium.jonasbandi.net/hosting-multiple-react-applications-on-ã§èª¬æãããŠããããã«ãReactã®ç¬èªã®ã³ããŒãæã€2ã€ã®å¥ã ã®ãã³ãã«ããå¥ã ã®domèŠçŽ ã§ç¬èªã®Reactã¢ããªã±ãŒã·ã§ã³ãããŒãã¹ãã©ããããŠããå Žåãåé¡ã«ãªããŸããïŒ
åŸè ã¯ãããšãã°ã·ã³ã°ã«ã¹ãã¡ã¿ãã¬ãŒã ã¯ãŒã¯ïŒhttps://github.com/CanopyTax/single-spaïŒã§äœ¿çšãããäžè¬çãªãçµ±åããã¿ãŒã³ã ãšæããŸãã
ãŸã£ããåãreactããŒãžã§ã³ã§ããã®åé¡ãçºçãã npm-link
ã䜿çšãããšãç¬èªã«å
¬éãããããã¯ã®éçºãå£ããŸãã åã圹ã«ç«ããªãhooks can only be called inside the body of a function component
ã¡ãã»ãŒãžãååŸããŸãã @apieceofbartã®ãšã€ãªã¢ã¹ãœãªã¥ãŒã·ã§ã³ã¯ç§ã®ããã«ããã解決ããŸããã æ¬åœã«ããããšãïŒ
ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã«ããã±ãŒãžãnpm link
ããå Žåããåãåé¡ãçºçããŸãã babel-plugin-module-resolver
ãåäœãããããšãã§ããŸããã§ããã
ããã¯èšãïŒ
Could not find module './node_module/react'
ããã¯ãã³ã³ããŒãã³ããå
¬éããåã«ããŒã«ã«ã§ãã¹ãããããšãã§ããªããããç
©ããããã®ã§ãã
"react": "^16.7.0-alpha.2"
ã®ãã£ã¬ãããåé€ããŠåé¡ãä¿®æ£ããŸãã
ã³ã¡ã³ãã®å
šæã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ//github.com/facebook/react/issues/14454#issuecomment -449585005
ç§ã¯Yarnã䜿çšããŠããŸããã package.json
ã§è§£æ±ºã匷å¶ããããšã§ãããä¿®æ£ããŸããïŒ
"resolutions": {
"**/react": "16.7.0-alpha.2",
"**/react-dom": "16.7.0-alpha.2"
},
ãã£ã¡ãäžç·ïŒïŒ
ç§ãšåãããã«ãã®åé¡ãæ±ããŠãããããããªã人ã®ããã«ãããã«ã¡ã¢ãæ®ãããã£ãã ãã§ãã
react-rails
gemã䜿çšããŠReactãšRailsãå®è¡ããã³ã³ããŒãã³ããRailsãã¥ãŒã«çŽæ¥ã¬ã³ããªã³ã°ããŠããŸãã TurbolinksãReactã®è¿œå ã€ã³ã¹ã¿ã³ã¹ãããŒããã<head>
ããæ°ããJSãã³ãã«ãååŸããŠãããããã¢ããªã®æ°ããããŒãžã§ã³ãããã·ã¥ããããã³ã«ãã®ãšã©ãŒãçºçããŠããŸããã 解決çã¯ããã³ãã«ãå€æŽãããããšãæ€åºãããšãã«Turbolinksã«ããŒãžå
šäœã®ãªããŒããå®è¡ãããããšã§ããïŒ https ïŒ//github.com/turbolinks/turbolinks#reloading -when-assets-change
ããã§è§£æ±ºããããã§ãã
ã€ãã«ããã¯ãæ¬çªç°å¢ã«å°å ¥ã§ããããšã«ãšãŠãè奮ããŠããŸãããããå¯èœã«ããŠããããã¹ãŠã®äººã«å¿ããæè¬ããŸãã ãããã¯ãäœæ¥ããã®ã_ãã³_楜ãããã®ã§ãããç§ã®ã³ãŒããããçãããã宣èšçã«ããŸããã
ãããã¢ãããšåæ§ã«ããã®åé¡ã¯ãªãªãŒã¹ãããããŒãžã§ã³ã«ãé¢é£ããŠããããããã¯ã¯é¢æ°ã³ã³ããŒãã³ãã®æ¬äœå ã§ã®ã¿åŒã³åºãããšãã§ããŸãããšããåã圹ã«ç«ããªããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã
ããã¯ä¿®æ£ã§ãããã®ã§ããïŒ ããå€ãã®éçºè ãæ°æ©èœã®å®è£ ãéå§ããã«ã€ããŠãããã¯ãŸããŸãæ®åããå¯èœæ§ããããå®å šãªãä¿®æ£ãã®ä»£ããã«ãããæ確ãªãšã©ãŒã¡ãã»ãŒãžã倧ãã«åœ¹ç«ã€ãšæããŸãã
倧å€ãªäœæ¥ãããããšãããããŸããããªãªãŒã¹ããã§ãšãããããŸãïŒ ããã¯æ¬åœã«çŽ æŽãããæ©èœã®ã»ããã§ãã
ç·šéïŒãªãŒãã³PRã詳ãã調ã¹ãå¿ èŠããããŸããããããã«å¯ŸåŠããïŒ14690ãèŠã€ãããŸããã ããããšã@threepointoneïŒ
@taylorhamã³ãããå
ã®ãªã³ã¯ã¯ãŸã äœãæããŠããŸããã ç§ã¯ãããåŸ
ã¡ãŸãããããã¯ãªã³ã¯ããã_ïŒ npm link
çŸåšïŒ_ããã±ãŒãžã§ããã¯ã䜿çšããŠä»¥æ¥ç§ãæ±ããŠããåé¡ã§ãããå
¬éããã«ããŒã«ã«ã§äœæ¥ããããšã¯äžå¯èœã§ãã
ããã€ãã®åé¡ã調ã¹ãåŸãããã¯ã³ã³ããŒãã³ããã¯ã©ã¹ã«ã³ã³ãã€ã«ããreact-hot-loaderã®åé¡ã ãšæããŸããããããã¯ããµããŒãããããŒãžã§ã³ããªãªãŒã¹ããåŸã§ããåãããã«å€±æããŸãã
ç§ã¯ããŸããŸãªããã¯ãè©ŠããŸããããéããããŸããã§ããã ãªã誰ãããã®åé¡ã«ãŸã æ©ãŸãããŠããªãã®ãããããŸããð§
@dotlouisããããããŸã§ã®ãšããæŽæ°ããããšã©ãŒã¡ãã»ãŒãžã§ãããåââé¡èªäœã¯ãŸã èŠçã§ãã
ç§ã«ãšã£ãŠããŸããã£ãã®ã¯ã "react": "link:../my-library/node_modules/react"
ã䜿çšããŠãéçºäžã®ã¢ããªãã©ã€ãã©ãªã®Reactã®ã€ã³ã¹ã¿ã³ã¹ã«äŸåãããããšã ãã§ãã
[ok]ç§ã«ãšã£ãŠãä¿®æ£ã¯package.jsonãŸãã¯ä»ã®äºéåå¿ã®åå ã«é¢ãããã®ã§ã¯ãããŸããã§ããïŒã³ã³ããã¹ãããæ¥ããã¢ããªã®äžã«ã°ããŒãã«ãªthemeProviderããããŸããã ããããuseContextããã¯ãã«çœ®ãæããïŒæ©èœçãªcompãšããŠæžãçŽããŠããéïŒããšãå¯äžã®è§£æ±ºçã®ããã§ãã
å€åãã€åé¡ããããŸã
<GoodOldContext iam={a class component}>
<BrandNewHook>
errors : Hooks can only be called inside the body of a function component #35
</BrandnewHook>
</GooOldContext>
export withGoodOldContext.consumer(here component)
create-react-app
ã䜿çšããexample
ãã©ã«ããŒãããã³ã³ããŒãã³ããéçºããŠããŸãã
package.json
ã§ãããè¡ããšããã®åé¡ã解決ããŸããã
{
...
"dependencies": {
"my-component": "link:..",
"react": "link:../node_modules/react",
"react-dom": "link:../node_modules/react-dom",
"react-scripts": "2.1.3"
},
...
}
@ taylorham @ DylanVannå
¥åããŠãããŠããããšãã æ®å¿µãªãããããã§ãç§ã«ã¯æ©èœããŸããã
ãããŠãããªãã䜿çšãããã®link:
ãããã³ã«ã«é¢ããããã¥ã¡ã³ãã¯èŠã€ãããŸããã§ããã
åºæ¬çã«ããreact-springãïŒreactãäŸåé¢ä¿ãšããŠäœ¿çšããå¥ã®depïŒã¯react-dom
ãèŠã€ããããšãã§ããªããšèšã£ãŠããŸãã "react": "link:../some/path"
ã«é¢ããããã¥ã¡ã³ããæããŠããã ããŸããïŒ
ãªã³ã¯ãããUIããã±ãŒãžã䜿çšããŠããŸããããã®åé¡ãä¿®æ£ããããšãã§ããŸããã
UIïŒãªã³ã¯ãããããã±ãŒãžïŒããreactrenderToStringããšã¯ã¹ããŒãããå¿
èŠããããŸãã
ãªã³ã¯ãããããã±ãŒãžã«ã¬ã³ããªã³ã°é¢æ°ãäœæããŸããã
ããè¯ãã³ã³ããã¹ãã®ããã«-httpsïŒ//github.com/facebook/react/issues/14257
@theKasheyã«æè¬ããŸãã @gaearonã¯ããããæ£åžžãªåäœã§ãããšèããŠããããã§ãã Reactã2åããŒãããã¹ãã§ã¯ãªãããã§ããããªã³ã¯ãããããŒã«ã«ããã±ãŒãžãæäœããããã®æšå¥šãããæ¹æ³ã¯äœã§ããïŒ
ãŸããLernaã¯ãŒã¯ã¹ããŒã¹ãé©åã«ã·ã³ããªãã¯ãªã³ã¯ããããšããåé¡ããããŸããã ããã¯ç§ããããæ©èœãããããã«äœ¿çšããããªãã¯ã§ããã åŸã§å¿
ãnpm install
ãå®è¡ããŠãã ããã
"dependencies": {
"react-dom": "file:../common/node_modules/react-dom",
"react": "file:../common/node_modules/react"
}
ããã解決ããæ¹æ³ã¯ãããããããŸããã糞ã®è§£å床ã¯éåžžã¯åœ¹ã«ç«ã¡ãŸãã-ããã¯ãæ§ç¯ããŒã«ãã«ãã£ãšé¢é£ããŠããŸã
aliases
ã䜿çšããŸã- react
ã®ãããªãã¹ãŠã®ã¢ãã«ãåäžã®ãã¡ã€ã«ã«ãããŒãããšã€ãªã¢ã¹ããŸã resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx'],
alias: {
react: path.resolve(path.join(__dirname, './node_modules/react')),
}
import {setAliases} from 'require-control';
setAliases({
'react': path.resolve(path.join(__dirname, './node_modules/react'))
});
moduleNameMapper
ã䜿çšããŸã"jest": {
"moduleNameMapper": {
"^react$": "<rootDir>/node_modules/$1",
},
@theKasheyã®æŽå¯ã«æè¬ããŸããããã¯ãã¢ãžã¥ãŒã«ã®è§£æ±ºãã©ã®ããã«è¡ããããïŒããªãŒã®äžã次ã«äžïŒãèãããšçã«ããªã£ãŠããŸããããŠãŒã¶ãŒã®èŠ³ç¹ããã¯ãããã¯ããŸãå®çšçã§ã¯ãããŸããã ããã±ãŒãžãnpm link
ãããšãäŸåé¢ä¿ãæ瀺çã«åé
ç·ããªããŠãæ©èœããããšãæåŸ
ãããŸãã ããã«ãããããã±ãŒãžãããŒã«ã«ã§éçºããã®ã¯éåžžã«å°é£ã«ãªããŸãã
ããã¯åºç€ã§ããããããnode_modules
ãæ©èœããããã«èšèšãããŠããæ¹æ³ã§ãããããã2ã€ã®ç°ãªãã¡ãžã£ãŒããŒãžã§ã³ã«2ã€ã®ããŒãžã§ã³ã®Button
ããããäŸåã¢ãžã¥ãŒã«ããæ£ããããã®ãç°¡åã«èŠã€ããããçç±ã§ããããã±ãŒãžã®ããŒãžã§ã³ã
ãããåžžã«æ©èœããæ¹æ³ã§ãã
Node.js
å
éšã¯éåžžã«ç°¡åã§ã-æ¢ç¥ã®ãã¹ãŠã®ãã¬ãã£ãã¯ã¹ïŒ node_modules
ãªã©ïŒãŸãã¯æ¡åŒµåïŒ js
ã ts
ã json
ãªã©ïŒãè¿œå ããŠãã¡ã€ã«ãéããŠã¿ãŠãã ãã
yarn pnp
ã¯ãããè¡ããåé¡ã解決ããå¯èœæ§ããããŸãã yarn workspaces
ã¯ãå
±æããã±ãŒãžãæäžäœã«_ãã€ã¹ã_ããå¯èœæ§ããããŸã-ãéæ³ãã䌎ããã«åé¡ã解決ããããšãã§ããŸãã
npm workspaces
ïŒ çŸåšã¯ååšããŸããã
å®éãã¯ãŒã¯ã¹ããŒã¹ã䜿çšããããã«ãããžã§ã¯ããåãæ¿ããããšã«ãªããŸããã 解å床ã䜿çšããã«ããã解決ããå·»ãäžã/æ§é ã¯ãšã«ããæçã§ãã
ããã¯ãããã¹ã¯ã©ããã£ãŒã§ããã webpack resolve.aliasèšå®ãè©ŠããŸããããæ©èœããŸããã§ãããå€ãã®èšå®ãè©ŠããŸããããæ®å¿µãªããå®éã«ã¯æ©èœããŸããã§ããããæçµçã«æ©èœãããããšãã§ããŸããã
ãããç§ã®ãã©ã«ãæ§é ã§ãïŒ
èšç»
|
+ -node_modules
|
+-ãã«ã
| |
| + -index.js
|
+-äŸïŒcreate-react-appïŒ
| |
| + -package.json
ãµã³ãã«ãã©ã«ãå ã®package.jsonãå€æŽããå¿ èŠããããŸãããåºæ¬çã«ã @ jmlivingstonã®ææ¡ã«åºã¥ããŠããããžã§ã¯ãã®ãã¡ã€ã³ãnode_modulesããreactããã«ããŸããæçµçã«ã¯æ¬¡ã®ããã«ãªããŸãã
"dependencies": {
"react": "file:../node_modules/react",
"react-dom": "file:../node_modules/react-dom",
"react-scripts": "2.1.5"
},
ãã®åŸã npm install
ãå®è¡ãã次ã«npm link
ãå®è¡ããŸãããããã§ãããŸããããŸããã
ããŸãããã°ãããã¯ä»ã®èª°ããå©ããæéãç¯çŽããããšãã§ããŸãã
ã§ã¯ããã®åé¡ã®ä¿®æ£ã¯ãããŸããïŒ ç§ã¯ããã§ã§ããã ãå€ãã®æšå¥šäºé ãè©ŠããŸããããéããããŸããã create-react-appãštypescriptã䜿çšããŠããŸãã React / React-domã®äœ¿çš16.8.3ã ããã¯ç§ã2æ¥åã«äœæããæ°ãããããžã§ã¯ãã§ãã useSpringïŒïŒãšanimated.divã䜿çšããŠããŸãã ããããšã
@ guru-floridaããŸããŸreact-routerã䜿ã£ãŠããŸããïŒ
ç§ã¯ããªããšåãã¹ã¿ãã¯ïŒtypescriptïŒcreate-react-appïŒã䜿çšããŠããã render
å±æ§ã«é¢ããåé¡ããããŸãã component
ã«å€æŽãããšããŸããããŸããã
åïŒ
<Route path="/signup" render={SignUp} />
åŸïŒ
<Route path="/signup" component={SignUp} />
ããã圹ã«ç«ãŠã°å¹žã..ïŒ
@mikeyyyyyyããããããã§ã¯ReactRouterã䜿çšããŠããŸããã ååã®ãããžã§ã¯ãã§æ¥ã䜿ã£ãŠã¿ãŸããããåãåé¡ãçºçããŸãããããã³ããããããšãããããŸãã
ïŒããŒã»ã«ã¢ããªã®ïŒnpmãªã³ã¯ã§ãã®åé¡ãçºçããŸãããã npm link .../whatever/node_modules/react
ã¯è§£æ±ºãããŠããªãããã§ãããããã¯ä»¥å€ã®ã³ã³ããŒãã³ãã§ã¯æ£åžžã«æ©èœããŸã
@tjssrã«åé¡ããããšæããŸãã è¿ éãªåé¿çã¯ããªã³ã¯ãããããã±ãŒãžããåå¿é¢æ°ãŸãã¯åå¿å šäœããšã¯ã¹ããŒãããŠããµãŒããŒããã±ãŒãžã«ã€ã³ããŒãããããšã§ãã
@seedenããç§ã¯SSRã䜿çšããŠããããããŒã»ã«ä»ãã®SPAã ãã䜿çšããŠããŸãã ç§ã¯èªåã®ãã®ã®ããã«å
éšã«ui
pkgãæã£ãŠãããç§ãåãçµãã§ããã¢ããªã¯äž¡æ¹ãšãåãreact
ããŒãžã§ã³ãæã£ãŠãããéè€ããŠããã®ã¯å¥åŠã«æããŸãããããããããã¯ããŒã»ã«ã®æžå¿µã§ã
@tjããããªãã»ã©ã 次ã«ããã®éåžžã«å¥åŠãªåé¡ã§é 匵ã£ãŠãã ããã ããã§äžé±ééãããŸãã
ã§ã¯ããã®åé¡ã®ä¿®æ£ã¯ãããŸããïŒ
ããèªäœã¯åé¡ãããŸããã ãã®ããŒãžã§èª¬æãããŠããããã«ãReactã¯$ react-dom
ã®å
éšãããèŠãã react
ãªããžã§ã¯ããšåãreact
ãªããžã§ã¯ãäžã«useState()
åŒã³åºããè¡ãå¿
èŠããããŸãã ãããããªãã«èµ·ãããªãå Žåã¯ãããŒãžäžã«Reactã®2ã€ã®ã³ããŒããã³ãã«ããŠããããšãæå³ããŸããããã¯ããèªäœãæªãããšã§ãããããã¯ã®åã«ä»ã®ããã€ãã®æ©èœãå£ããŸãã ãšã«ãããããä¿®æ£ããããšæãã§ãããã ãã®ããŒãžã«ã¯ããããä¿®æ£ããããã«èšºæããäžè¬çãªæ¹æ³ãå«ãŸããŠããŸãã
人ã ããã®åé¡ã«ééãããšãã®ç¹å®ã®åé¿çãå ±æããããã«ããã®è°è«ãéãããŸãŸã«ããŠãããŸãã ããããããèªäœã¯ãããªã以å€ã®èª°ãããä¿®æ£ãã§ããåé¡ã§ã¯ãããŸããã
ç§ã¯npmãªã³ã¯ïŒããŒã»ã«ã¢ããªå ïŒã§ãã®åé¡ãæ±ããŠããŸããããnpmãªã³ã¯... / whatever / node_modules / reactã¯ããã解決ããŠããªãããã§ãããããã¯ä»¥å€ã®ã³ã³ããŒãã³ãã§ã¯æ£åžžã«åäœããŸã
å°ããªåçŸã±ãŒã¹ãäœæããŠãããããã§ããïŒ
@gaearonã¯ããããã§ããããæ¥é±ããå°ãæãäžããæéãããã¯ãã§ã
幞ãã require-control
ã¯ã yarn link
+ SSR + styled-components4ã®éçã³ã³ããã¹ãã«é¢ããåé¡ãä¿®æ£ããŸããã ããããšã@theKasheyð
ç§ã¯ããã§ãã¹ãŠãè©ŠããŸããã倱æããŸããã å®éã«ã¯ãããã«èšèŒãããŠããªãå¥ã®äœãã§ããã ããã¯ãreactã€ã³ããŒãã®å€§æåãšå°æåã®åºå¥ã«é¢ä¿ããŠããŸããã å Žåã«ãã£ãŠã¯ã次ã®ããã«ãªããŸããã
import React from 'react'
ãããŠä»ã®äººã§ã¯ïŒ
import React from 'React'
äžéšã®ãã¡ã€ã«ã·ã¹ãã ïŒunixãosxïŒã§ã¯ãããã«ããWebpackãReactã®2ã€ã®ã³ããŒãã€ã³ã¹ã¿ã³ã¹åããŸãã
Reactã®ã³ããŒã1ã€ãããªãããšãã¯ã£ãããšãããã®ã§ãããã¯æ¥µç«¯ãªæ··ä¹±ãåŒãèµ·ãããŸããã ããããããã¯ä»£ããã«ç§ãã¡ããããã€ã³ããŒãããŠããæ¹æ³ã§ããã
æããã«å°æåã®ã¿ã䜿çšããŠãããããreactããã¥ã¡ã³ãã®ãã¹ããåé¡ãªãå®è¡ãããŸãã
ããã¯ãããã¥ã¡ã³ãã§èšåãã䟡å€ãããããã«æããŸããïŒ
ç§ã«ãšã£ãŠãReactã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã®çç±ã¯WebpackDllPluginã§ããã ãã³ããŒDLLã®å Žåããšã³ããªãªã¹ãã«react
ãšreact-dom
ãå«ããŸããã§ãããã react
ãŸãã¯react-dom
ãå¿
èŠãšããä»ã®ã©ã€ãã©ãªããããŸãããç§ã®DLLã«ã¯react
ãšreact-dom
ãå«ãŸããŠããŸããïŒãããã§ã¹ãjsonãã¡ã€ã«ããã°ãããã§ãã¯ãããšãããæããã«ãªããŸãïŒã ãããã£ãŠãã³ãŒããå®è¡ããŠReactãã¢ããªã±ãŒã·ã§ã³ã«ã€ã³ããŒããããšã node_modules
ããããŒããããŠããŸãããããã³ããŒã®ã³ãŒãã§ã¯ãDLLãã¡ã€ã«ããReactãå¿
èŠã§ããã
å šäœïŒDLLãã¡ã€ã«ã«æ³šæããå«ãŸããŠããã¢ãžã¥ãŒã«ã«äžèŠãªè¿œå ã®äŸåé¢ä¿ãå«ãŸããŠããªãããšã確èªããŠãã ãããå«ãŸããŠããªãå Žåã¯ãããããäºéã«ã€ã³ããŒãããŸãã
react-hot-loader
ã4.6.0
ã«æŽæ°ããããšã§ããããä¿®æ£ã§ããŸããã
ããã¯ãParcelã®npm link
ã®ãã®ã®ããªãã¯ãè¡ããŸããã
"alias": {
"react": "../ui/node_modules/react",
"react-dom": "../ui/node_modules/react-dom"
}
ãããæ¬çªãã«ãã«äœ¿çšããããšãããã®ãã©ããã¯ããããŸããããã¡ãã£ãšããããŒãªããã§ãããå°ãªããšãéçºã«ã¯æ©èœããŸã
@theKashey OMGç·ãããã¯åäœããŸãïŒ ç§ã¯ããã®åé¡ã«é¢é£ããŠäººã
ãææ¡ããããŸããŸãªè§£æ±ºçãè©ŠããŸããpackage.json
ã®æ·±ãã§ãã³ã°ãªã³ã°ãããããžã§ã¯ãå
šäœã§ã2ã€ã®åå¿ãã远跡ãã*ããã¯ã®ã«ãŒã«ãç Žã£ãŠãããã©ããã確èªããŸããã§ã¯ãããŸããïŒããç§ã¯ããªãã®ãªãã·ã§ã³ã次ã®ããã«ãªã£ãŠãããšæããŸãïŒ
alias: {
react: path.resolve(path.join(__dirname, './node_modules/react')),
'react-dom': path.resolve(path.join(__dirname, './node_modules/react-dom'))
}
app-as-a-libã®ããã¯ã䜿çšããŠããããžã§ã¯ãã次ã®ã¬ãã«ã«ç§»åã§ããŸãã
ããã¯çµæã®webpack.config.jsã§ã
npm ls react
æ»ãå€
[email protected] D:\code\project
`-- (empty)
ç§ã®ãã
console.log(window.React1 === window.React2)
ã¯trueãè¿ããŸã
ãã®æç¹ã§ãåé¡ã®åå ã¯SSRã ãšæããŸã
ã¢ããããŒãã ããã¯ç¢ºãã«React-apolloã®SSRåäœã«ãã£ãŠåŒãèµ·ããããŸããïŒhttps://github.com/apollographql/react-apollo/issues/2541ïŒ
2.3.1ã«ã¢ããã°ã¬ãŒããããšä¿®æ£ãããŸãã
ããã«ã¡ã¯ã¿ããªãç§ãã¡ã®ããŒã ã¯ãã®åé¡ã«çŽé¢ããããã解決ããã®ã«æ°æ¥ããããŸããã
解決çAïŒäžèšã®ããã«ãæ€çŽ¢ããããã±ãŒãžã®äœçœ®ãæå®ããŸã
alias: {
react: path.resolve(path.join(__dirname, './node_modules/react')),
'react-dom': path.resolve(path.join(__dirname, './node_modules/react-dom'))
}
解決çBïŒwebpack resolve.modulesã䜿çšããŠãã¢ãžã¥ãŒã«ãæ¢ãããã«é©åãªnode_modulesãã©ã«ããŒã«åªå é äœãä»ããŸã
ãŸã第äžã«ãããã¯reactã®ããã§ã¯ãªããlernaã®ããã§ããããŸããããreactãwebpackãnpm-linkãäœããã®è²¬ä»»ãè² ãå¿ èŠããããããããŸããã
-éã¢ãã¬ãïŒ
æ§é
- mono repo root
- packages
- ComponentWithHooks (peerDependency: react@^16.8.1)
- ProductA (dependency: ComponentWithHooks, dependency: react@^16.8.4)
- ProductB (dependency: react@^16.8.1)
ã¯ãŒã¯ã¹ããŒã¹ã§ããŒãã¹ãã©ãããããšã次ã®ããã«è§£æ±ºãããŸãã
- mono repo root
- node_modules
- react(16.8.1)
- packages
- ComponentWithHooks
- node_modules (empty)
- ProductA
- node_modules
- react(16.8.4)
- ProductB
- node_modules (empty)
ãããŠãwebpackãŸãã¯äœãä»ã®ãã®ã§ProductA
ãæäŸãããšã2ã€ã®reactã€ã³ã¹ã¿ã³ã¹ãå«ãŸããŸãã
ProductAã®ã³ãŒãã¯ã ProductA/node_modules/react
ãæ€çŽ¢ããŸãã
ãã ããã€ã³ããŒããããComponentWithHooksã¯mono repo root/node_modules/react
ãæ€çŽ¢ããŸãã
ãªãã§ïŒ npmã®ã«ãã¯ã¢ããã«ãŒã«ãèŠããŠããŸããïŒ èªèº«ã®node_modulesãã©ã«ããŒã§ã¢ãžã¥ãŒã«ãèŠã€ãããªãå Žåã¯ã芪ã®node_modulesãæ€çŽ¢ããŸã...
ãã®ãããwebpackãªã©ã®ããŒã«ã¯ããã©ã«ãã§ãã®ã«ãŒã«ãå®å
šã«é©çšããŸããã
util monorepoãœãªã¥ãŒã·ã§ã³ãæ®åããã®ã¯ééããããŸããã
ãããŠãéåžžã®ããã±ãŒãžã¯ããã«æ°ã¥ããŸããããããã®ã»ãšãã©ã¯ãreactãreduxãšããŠåäžã®ã€ã³ã¹ã¿ã³ã¹ãå¿
èŠãšããªãããã§ãã
ã€ãŒã³ã¯ãŒã¯ã¹ããŒã¹ã®äŸã䜿çšããéåžžã«åºæ¬çãªè€è£œã䜿çšããŠããããšåãåé¡ãçºçããŠããŸã-httpsïŒ//github.com/mwarger/yarn-workspace-hooks-repro
ã¿ã€ãã¹ã¯ãªããã§æžãããå°å
ã«ãã³ãã«ãããŠããcomponent-library
ããããŸãã example-demo
ã¯ããã®component-library
ã玹ä»ãããã®ã§ãããæ°ããäœæãããCRAã¢ããªã§ãã ãã¹ãŠã®äžè¬çãªããã±ãŒãžã¯ç³žã§åãäžããããŠãããããçè«çã«ã¯1ã€ã®ããŒãžã§ã³ã®reactããå©çšã§ããªãã¯ãã§ãã ãã ããindex.tsxã§è¡ã£ãŠããReact.useEffect
åŒã³åºãã«ããããã®GitHubã®åé¡ã«ã€ãªãããšã©ãŒãçºçããŸãã
ããã¯ãè¿œå ããããŸã§ããã¹ãŠãæ©èœããŸãã ãšã©ãŒãåçŸããã«ã¯ã component-library/src/index.tsx
ã®7ã9è¡ç®ã®ã³ã¡ã³ãã解é€ããŸãã
ããŸãããã°ãç§ã¯ç§ãèŠèœãšããŠããæããªããšãããŠããã ãããæ¹åããããã«ç§ã䜿çšããå¯èœæ§ã®ããæé ã«ã€ããŠã¢ããã€ã¹ããŠãã ããã ããããšãïŒ
ãã©ããŒã¢ããç·šéïŒä»¥äžã®æšå¥šãããã°ã¹ã¯ãªããåºåã¯ã true
ãåºåããŸãã Reactsã2ã€ãªãããã§ãã
// Add this in node_modules/react-dom/index.js
window.React1 = require('react');
// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);
æ°æéããã£ãã®ã§ãããã§ã¡ã¢ãåã䟡å€ããããããããŸããã
ç§ã®å ŽåãHTMLãã³ãã¬ãŒãã®å
é ã«<script defer src="./dist/bundle.js" />
ã®è¡ãé
眮ããŸãããããã¯ãReactããã¯ã䜿çšããªãå Žåã¯éåžžã©ããæ©èœããŸãã ãã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ãæ©èœããããã§ã¯ãªãããã®å Žåã window.React1 == window.React2
ãã§ãã¯ã¯true
ãè¿ããŸãã
webpackã¯åŸã§ã¹ã¯ãªããã¿ã°ãæ¿å ¥ããããããã³ãã¬ãŒãèªäœã«ã¹ã¯ãªããã¿ã°ãå«ããããšã¯ã§ããŸããã ãã³ãã¬ãŒãããã¹ã¯ãªããã¿ã°ãåé€ããŠãReactãããã¯ïŒããããæå³ãããã®ïŒã§åã³æ©èœãããŸãã
ç§ã®å Žåãäœæ¥äžã®äŸåé¢ä¿ã«npmãªã³ã¯ãããReactã¢ããªããããŸãã ããã¯ã react
ãšreact-dom
ãéçºéšéãšãã¢éšéã«ç§»åããå¿
èŠãããããã€ãã®äŸåé¢ä¿ãä¿®æ£ã§ãããŸã§ããŸããããŸãã
cd node_modules/react && npm link
cd node_modules/react-dom && npm link react
npm link react
ãªããããæ©èœããã®ã§ããïŒ ãšã©ãŒèŠåããŒãžã«ã¯ããããã¯ãæ©èœããããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãããã®reactã€ã³ããŒãããreact-domããã±ãŒãžå ããã®reactã€ã³ããŒããšåãã¢ãžã¥ãŒã«ã«è§£æ±ºãããå¿ èŠãããããšèšèŒãããŠããŸãã
äžèšã®ãã¹ãŠãè©Šããã«ãããããããç§ã¯ãŸã ãã®åé¡ãæ±ããŠããŸãã preset-env
ããã³preset-react
ãã©ã°ã€ã³ã䜿çšããæšæºã®webpack4 / babelæ§æã ç§ã®react / react-domããŒãžã§ã³ã¯ã糞ã®è§£å床ã䜿çšããŠ16.8.4
ã«åºå®ãããŠããŸãïŒäžèšã®window.React1 === window.React2
ãã§ãã¯ã§ãtrue
ãè¿ãããŸãïŒã
ããã¯ãæãåºæ¬çãªäœ¿çšæ³ã§ãã
import React, { useState } from "react";
function MyComp() {
const [hello] = useState(0);
return <div>HELLO {hello}</div>;
}
export default MyComp;
ä»ã«äœãã¢ã€ãã¢ã¯ãããŸããïŒ
ç·šéïŒæ確ã«ããããã«ããšã©ãŒã¯OPã«åŸã£ãŠreact.development.js:88 Uncaught Invariant Violation: Hooks can only be called inside the body of a function component.
ãšããŠè¡šç€ºãããŸã
ç§ã®å Žåãäœæ¥äžã®äŸåé¢ä¿ã«npmãªã³ã¯ãããReactã¢ããªããããŸãã ããã¯ã
react
ãšreact-dom
ãéçºéšéãšãã¢éšéã«ç§»åããå¿ èŠãããããã€ãã®äŸåé¢ä¿ãä¿®æ£ã§ãããŸã§ããŸããããŸãã
- ã¢ããªããïŒ
cd node_modules/react && npm link
- ã¢ããªããïŒ
cd node_modules/react-dom && npm link react
- ãªã³ã¯ãããããã±ãŒãžããïŒ
npm link react
ãªããããæ©èœããã®ã§ããïŒ ãšã©ãŒèŠåããŒãžã«ã¯ããããã¯ãæ©èœããããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãããã®reactã€ã³ããŒãããreact-domããã±ãŒãžå ããã®reactã€ã³ããŒããšåãã¢ãžã¥ãŒã«ã«è§£æ±ºãããå¿ èŠãããããšèšèŒãããŠããŸãã
ããããšãïŒ ããã¯ç§ã«ãšã£ãŠçŽ æŽãããåããããŸãã ïŒnpmãªã³ã¯ãšã·ã³ããªãã¯ãªã³ã¯ãæ··åšããç¶æ³ã䜿çšããŠããå Žåã§ãïŒ
äžèšã®ææ¡ããã¹ãŠè©ŠããŸãããããŸã ãšã©ãŒãçºçããŠããŸããã
@inverheriveã®å°ãã®å©ããåããŠã enzyme-adapter-react-16
ããŸã åé¡ãåŒãèµ·ãããŠããããšãããããŸããã
react-test-renderer
ãææ°ããŒãžã§ã³ïŒ16.8.4ïŒã«æŽæ°ããã®ã¯ãããã¯ã®ãµããŒããæè¿è¿œå ãããã°ããã§ããããã§ããã npm ls react-test-renderer
ãä»ããŠãææ°ããŒãžã§ã³ã®enzyme-adapter-react-16
ïŒ1.11.2 ïŒã¯[email protected]
ã®å
éšäŸåé¢ä¿ãæã£ãŠããŸããããããã¯ããã¯ããµããŒãããŠããŸããã
ââ⬠[email protected]
â âââ [email protected]
âââ [email protected]
ãã®åé¡ãä¿®æ£ãããããããã³@chulanovskyiã®ä¿®æ£ã«åŸãããã«ãyarnã䜿çšããŠãããããpackage.jsonã«react-test-renderer
ã®è§£å床ãè¿œå ããŸããã ããã«ããã react-test-renderer
ã®ãã¹ãŠã®åç
§ã§ã16.8.4ãã䜿çšãããŸãã
"resolutions": {
"react-test-renderer": "16.8.4"
},
ããã¯éåžžã«èç«ãããããšã§ããããããä»ã®èª°ããå©ããããšãã§ããããšãé¡ã£ãŠããŸãã @chulanovskyiãš@theKasheyã®ææ¡ã«ãæè¬ããŸãã
ããã¯ãreactãšreact-domãéçºè ãšãã¢éšéã«ç§»åããå¿ èŠãããããã€ãã®äŸåé¢ä¿ãä¿®æ£ã§ãããŸã§ããŸããããŸãã
@ajcrews ïŒç§ã¯äœããéãããããããŸãããïŒç§ã¯npm link
ã®å
éšã©ã€ãã©ãªãæã£ãŠããããã®ã©ã€ãã©ãªã«ã¯react
peerDependencies
ãšdevDependencies
ã«$ïŒ$ 1 $ïŒ$ããããŸãããããã§ãããªããå¿
èŠã§ãããšã©ãŒã解決ãããã©ããã«é¢ä¿ãªãä¿®æ£ããŸãã çŽ æµãªçºèŠïŒ
æçš¿ããããšããŸãããã解決çãèŠã€ããŸãã
ã³ã³ããŒãã³ãã©ã€ãã©ãªããããéçºçšã®CRAã¢ããªã®äŸãå«ãŸããŠããŸã
CRAã¢ããªã®package.jsonã§ãreactãšreact-domãå€æŽããŠãã«ãŒãã³ã³ããŒãã³ãã®package.jsonãããåçšãããå¿ èŠããããŸããã
"dependencies": {
"react": "link:../node_modules/react",
"react-dom": "link:../node_modules/reac-dom",
}
ããã¯éåžžã«èç«ãããããšã§ããããããä»ã®èª°ããå©ããããšãã§ããããšãé¡ã£ãŠããŸãã @chulanovskyiãš@theKasheyã®ææ¡ã«ãæè¬ããŸãã
@ Paddy-Hamiltonã€ã³ã¹ããŒã«åŸã¯ãåžžã«ããã¯ãã¡ã€ã«ã確èªããŠãã ããã yarn
ãreact-test-renderer
ãè€è£œããŠãããšããåãåé¡ãçºçããŸããã ããªãã®ããã¯ãã¡ã€ã«ã«å°ãã®æè¡ãããããšã§ãããªãã¯ããããä¿®æ£ããããšãã§ããŸãïŒ
yarn add -D react-test-renderer
-react-test-renderer@^16.0.0-0, react-test-renderer@^16.1.1:
+react-test-renderer@^16.0.0-0:
version "16.8.4"
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.4.tgz#abee4c2c3bf967a8892a7b37f77370c5570d5329"
integrity sha512-jQ9Tf/ilIGSr55Cz23AZ/7H3ABEdo9oy2zF9nDHZyhLHDSLKuoILxw2ifpBfuuwQvj4LCoqdru9iZf7gwFH28A==
dependencies:
object-assign "^4.1.1"
prop-types "^15.6.2"
react-is "^16.8.4"
scheduler "^0.13.4"
+react-test-renderer@^16.8.5:
+ version "16.8.5"
+ resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.5.tgz#4cba7a8aad73f7e8a0bc4379a0fe21632886a563"
+ integrity sha512-/pFpHYQH4f35OqOae/DgOCXJDxBqD3K3akVfDhLgR0qYHoHjnICI/XS9QDwIhbrOFHWL7okVW9kKMaHuKvt2ng==
+ dependencies:
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+ react-is "^16.8.5"
+ scheduler "^0.13.5"
yarn check
ã¯ãã§ã«èŠåããŸã
$ yarn check
warning "enzyme-adapter-react-16#react-test-renderer@^16.0.0-0" could be deduped from "16.8.5" to "[email protected]"
次ã«ã次ã®ããããé©çšããŠæåã§éè€æé€ããŸãã
-react-test-renderer@^16.0.0-0:
- version "16.8.4"
- resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.4.tgz#abee4c2c3bf967a8892a7b37f77370c5570d5329"
- integrity sha512-jQ9Tf/ilIGSr55Cz23AZ/7H3ABEdo9oy2zF9nDHZyhLHDSLKuoILxw2ifpBfuuwQvj4LCoqdru9iZf7gwFH28A==
- dependencies:
- object-assign "^4.1.1"
- prop-types "^15.6.2"
- react-is "^16.8.4"
- scheduler "^0.13.4"
-
-react-test-renderer@^16.8.5:
+react-test-renderer@^16.0.0-0, react-test-renderer@^16.8.5:
ããã§ã resolutions
ãŸãã¯webpack
ãšã€ãªã¢ã¹ã·ã§ããã¬ã³ã®ãªãåäžããŒãžã§ã³ã®react-test-renderer
ãã§ããŸããã
ãªã³ã¯ãããããã±ãŒãžãšcreate-react-app
ã«é¢é£ããåé¡ã«ã€ããŠã¯ãfacebook / create-react-appïŒ6207ããã©ããŒããŠãã ããã
ããã解決ããæ¹æ³ã¯ãããããããŸããã糞ã®è§£å床ã¯éåžžã¯åœ¹ã«ç«ã¡ãŸãã-ããã¯ãæ§ç¯ããŒã«ãã«ãã£ãšé¢é£ããŠããŸã
- webpackã®å Žåã¯
aliases
ã䜿çšããŸã-react
ã®ãããªãã¹ãŠã®ã¢ãã«ãåäžã®ãã¡ã€ã«ã«ãããŒãããšã€ãªã¢ã¹ããŸãresolve: { extensions: ['.ts', '.tsx', '.js', '.jsx'], alias: { react: path.resolve(path.join(__dirname, './node_modules/react')), }
- ããŒã»ã«ã®å Žåã¯åããšã€ãªã¢ã¹ã䜿çšããŸãããpackage.jsonã§å®çŸ©ããŸã-httpsïŒ //parceljs.org/module_resolution.html#aliases
- nodejsïŒjest以å€ïŒã®å Žåã¯ãrequirecontrolã䜿çšã§ããŸã
import {setAliases} from 'require-control'; setAliases({ 'react': path.resolve(path.join(__dirname, './node_modules/react')) });
- åè«ã®å Žåã¯
moduleNameMapper
ã䜿çšããŸã"jest": { "moduleNameMapper": { "^react$": "<rootDir>/node_modules/$1", },
ããã¯ç§ã®ããã«ãããããŸããã
@ajcrews
ããããšãïŒ ç§ã«ã¯èŠäºã«æ©èœããŸãïŒ
ç§ã¯react16.8.6ãelectron-webpackãRHLã䜿çšããŠãæå°éã®ã»ããã¢ããã§å°ããªãã¹ãã±ãŒã¹ãäœæããŸããã ç¹ã«ããã®ãšã©ãŒãçºçãããšããã©ãŠã¶å šäœïŒãã®ã»ããã¢ããã§ã¯ãelectronïŒãCPUæéãæ¶è²»ãå§ããŸãïŒ
https://github.com/PerfectionCSGO/reeee
ç§ã¯ãã®åé¡ã«ã€ããŠ3æ¥éé ãæ©ãŸããŠããŸããã ããšããšRHLãåé¡ã ãšæã£ãŠããŸãããããã®ãããžã§ã¯ãããå®å šã«åé€ããŠãåé¡ã¯è§£æ±ºããŸããã
npm lsreactã¯1ã€ã®çµæã®ã¿ãè¿ããŸãã äžèšã®ä¿®æ£ãææ°ããŒãžã§ã³ãšwebpackãšã€ãªã¢ã¹ã«é©çšãããŠããããšã確èªããŸããã
ã³ãŒãã¯ãµã³ãããã¯ã¹ã§æ©èœããŸãã
åçŽãªwebpack / websiteã§ã¯ãã³ãŒãã¯åé¡ãªãæ©èœããŸãã ãã ããelectron-webpackã䜿çšãããšããã®åé¡ã¯è§£æ±ºããŸããã
"dependencies": {
"i18next": "^15.0.9",
"i18next-browser-languagedetector": "^3.0.1",
"react": "^16.8.6",
"react-dom": "npm:@hot-loader/react-dom",
"react-hot-loader": "^4.8.2",
"react-i18next": "^10.6.1",
"source-map-support": "^0.5.11",
"tslint": "^5.15.0"
},
"devDependencies": {
"@babel/core": "^7.4.3",
"@babel/preset-react": "^7.0.0",
"@babel/preset-typescript": "^7.3.3",
"@types/react": "^16.8.12",
"@types/react-dom": "^16.8.3",
"electron": "^4.1.3",
"electron-builder": "20.39.0",
"electron-webpack": "^2.6.2",
"electron-webpack-ts": "^3.1.1",
"typescript": "^3.4.1",
"webpack": "^4.29.6"
}
誰ããç§ã«ãã€ã³ã¿ãŒããããããšãé¡ã£ãŠããŸã...
react-l18nextãmobx-react-liteã«çœ®ãæããŠobserverã䜿çšãããšãåãå¹æãçºçããŸãã
ç§ã®åé¡ã«é¢ããŠã¯ãelectron-webpackãæ²ããããšã§åé¡ã解決ãããããçŽç²ãªãé»åãœãªã¥ãŒã·ã§ã³ãæ¡çšããŸããã ç§ã®æšæž¬ã§ã¯ãäºææ§ã®ãªãã®ã¯webpackãŸãã¯babelã§äœ¿çšãããããŒã«ãã§ãŒã³ã ãšæããŸãã
ãã®åé¡ã¯æ¬çªç°å¢ã§ã®ã¿çºçããŸããã ããã§ææ¡ããã解決çã®ã©ãã圹ã«ç«ã¡ãŸããã§ããã
ç§ã®ãŠãŒã¹ã±ãŒã¹ã¯ãå¥ã®Webãµã€ãã«ãŠã£ãžã§ãããšããŠèªã¿èŸŒãŸãããµãŒãããŒãã£ã®ã¢ããªã§ããã
ãµã€ãã«ãŠã£ãžã§ãããæåã«èªã¿èŸŒãŸãããšãã¯ãã¹ãŠæ£åžžã«æ©èœããŸãããããŠãŒã¶ãŒãå¥ã®ããŒãžã«ç§»åããŠãŠã£ãžã§ããã®ããããŒãžã«æ»ã£ããšãã«ãããã¯ãšã©ãŒãçºçããŸããã
ãã®ãšã©ãŒã¯ãããã²ãŒã·ã§ã³ã«ãã£ãŠããŒãžããªããŒããããªãå Žåã«ã®ã¿çºçããããšã«æ³šæããŠãã ããã
ç§ã¯äœãåé¡ãªã®ããç解ããããšäœæéãè²»ãããŸããã æåŸã«ãåé¡ã¯ã¢ããªãã³ãã«ãããŒãããã³ãŒãã¹ããããã«ãããŸããã ããŒãžã®å€æŽæã«ããã³ãã«ãè€æ°åèªã¿èŸŒãŸããå¯èœæ§ããããåãåå空éã«è€æ°ã®Reactã€ã³ã¹ã¿ã³ã¹ããããšæšæž¬ãããŸãã
ã¹ã¯ãªããããã§ã«ããŒããããŠãããã©ããã確èªããŠä¿®æ£ããŸããã
ãŸããWebpackã®ãlibraryãæ§æã䜿çšããŠã©ã€ãã©ãªãã°ããŒãã«åå空éã«ãšã¯ã¹ããŒãããŸããã
output: {
library: 'myLib',
...
}
次ã«ãèªã¿èŸŒã¿ã¹ã¯ãªããã§ãã©ã€ãã©ãªãååšãããã©ããã確èªããŸããã
if(!window.myLib){
var bz = document.createElement('script');
bz.type = 'text/javascript';
bz.async = true;
bz.src = 'https://path/to/bundle.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(bz, s);
}
ããã¯éåžžã«ç¹æ®ãªãŠãŒã¹ã±ãŒã¹ãããããŸãããããããä»ã®èª°ãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
ã€ãŸããWebpackã掻çšããã¡ã€ã³ã®Reactã¢ããªã±ãŒã·ã§ã³ããããŸãã
ããã¯ã䜿çšããå°ããªReactã©ã€ãã©ãªãäœæããããšããŠããŸãããã³ãã©ãŒïŒããŒã»ã«ãçŽç²ãªbabelãwebpackïŒã亀æããŠã¿ãŸããã
webpackã®å®è£
ãè©Šããšããreactãšreact-domãå€éšãšããŠããŒã¯ããã®ã§ããã³ãã«ã«ã¯å«ããŸããã
npmãªã³ã¯ã䜿çšãããšãåãããã¯äŸå€ãçºçããŸãã
ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®reactãžã®ã·ã³ããªãã¯ãªã³ã¯ãäœæããããšã¯æ©èœããŸãããããã¯åªããéçºã¯ãŒã¯ãããŒã§ã¯ãããŸããã
åé¡ã®æ ¹æ¬çãªåå ãçªãæ¢ããã®ã«èŠåŽããŠããŸãã éè€ããReactã€ã³ã¹ã¿ã³ã¹ãçæããŠããã®ã¯äœã§ããïŒ
ããã«ã¡ã¯@ adriene-orangeã詳现ã«ã€ããŠã¯ç§ã®æçš¿https://github.com/facebook/react/issues/13991#issuecomment-472740798ãèŠã€ããããšãã§ããŸãã
npmãªã³ã¯ã«ãã£ãŠåŒãèµ·ãããããã«ãã€ã³ã¹ã¿ã³ã¹ã¯ãããŒããããã±ãŒãžå ã§èŠã€ãããªãå Žåãããã©ã«ãã§èŠªãã©ã«ããŒã®node_modulesã§ã¢ãžã¥ãŒã«ãæ€çŽ¢ããããã§ãã
ãã®ããã«ç§ãã¡ãèŠã€ããæãç°¡åã§æè¯ã®è§£æ±ºçã¯ããšã³ãã©ã³ã¹ããã±ãŒãžã®webpackïŒãŸãã¯ä»ã®ããŒã«ïŒæ§æã«ãããŸãresolve.modules
ã®ãããªãã®ã䜿çšããŠããã¹ãæåã§èšå®ããwebpackãã¢ãžã¥ãŒã«ãæ€çŽ¢ãããã¹ã䞊ã¹æ¿ããŸãã Expãã resolve: { modules: [path.resolve(PACKAGE_ROOT, 'node_modules'), 'node_modules'] }
ã¯ãwebpackãæåã«ãšã³ãã©ã³ã¹ããã±ãŒãžã«ãŒãã®node_moduleå
ã®ã¢ãžã¥ãŒã«ãæ€çŽ¢ããããã«åŒ·å¶ããŸãã ã«ãŒãã§ã¢ãžã¥ãŒã«ãèŠã€ãããªãå Žåã¯ãçžå¯Ÿçãªnode_modulesãã©ã«ããŒã§èŠã€ããŠãã ãã...
ã€ãŸããWebpackã掻çšããã¡ã€ã³ã®Reactã¢ããªã±ãŒã·ã§ã³ããããŸãã
ããã¯ã䜿çšããå°ããªReactã©ã€ãã©ãªãäœæããããšããŠããŸãããã³ãã©ãŒïŒããŒã»ã«ãçŽç²ãªbabelãwebpackïŒã亀æããŠã¿ãŸããã
webpackã®å®è£ ãè©Šããšããreactãšreact-domãå€éšãšããŠããŒã¯ããã®ã§ããã³ãã«ã«ã¯å«ããŸããã
npmãªã³ã¯ã䜿çšãããšãåãããã¯äŸå€ãçºçããŸããã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®reactãžã®ã·ã³ããªãã¯ãªã³ã¯ãäœæããããšã¯æ©èœããŸãããããã¯åªããéçºã¯ãŒã¯ãããŒã§ã¯ãããŸããã
åé¡ã®æ ¹æ¬çãªåå ãçªãæ¢ããã®ã«èŠåŽããŠããŸãã éè€ããReactã€ã³ã¹ã¿ã³ã¹ãçæããŠããã®ã¯äœã§ããïŒ
ããã«ã¡ã¯ããã®ãšã©ãŒãçºçããŸã
äžå€ã®éåïŒç¡å¹ãªããã¯åŒã³åºãã ããã¯ã¯ãé¢æ°ã³ã³ããŒãã³ãã®æ¬äœã®å
éšã§ã®ã¿åŒã³åºãããšãã§ããŸãã ããã¯ã次ã®ããããã®çç±ã§çºçããå¯èœæ§ããããŸãã
1. Reactãšã¬ã³ãã©ãŒïŒReact DOMãªã©ïŒã®ããŒãžã§ã³ãäžèŽããŠããªãå¯èœæ§ããããŸã
2.ããã¯ã®ã«ãŒã«ã«éåããŠããå¯èœæ§ããããŸã
3.åãã¢ããªã«Reactã®ã³ããŒãè€æ°ããå¯èœæ§ããããŸã
ãã®åé¡ããããã°ããŠä¿®æ£ããæ¹æ³ã®ãã³ãã«ã€ããŠã¯ã httpsïŒ//fb.me/react-invalid-hook-callãåç
§ããŠãã ããã
5 |
6 | const useApiHelper = (url, reducer) => {
> 7 | const [state, dispatch] = useReducer(reducer, {});
| ^
8 |
9 | useEffect(() => {
10 | fetch(url).then(res => res.json())
ãµã³ãã«ã³ãŒãhttps://stackblitz.com/edit/react-mbze9q
ãã¹ãã±ãŒã¹å ã§ãã®é¢æ°ã«ã¢ã¯ã»ã¹ããããšãããšãäžèšã®ãšã©ãŒãçºçããŸã
@abhishekguruãã¹ãã§ã¯ãã³ã³ããŒãã³ãã®å€åŽã§ããã¯ãåŒã³åºããŠããŸãã
test('API test', async () => {
const newState = useAPIHelper( // <- Called outside of a component
'https://jsonplaceholder.typicode.com/posts',
reducer
)
console.log(newState, 'new');
// expect(newState[samUrl].loading).toEqual(true);
});
ãšã©ãŒã瀺ãããã«ãããã¯ã¯å¥ã®ããã¯ããããŸãã¯ã³ã³ããŒãã³ãå ããã®ã¿åŒã³åºãããšãã§ããŸãã ããªãã®å Žåããã¹ãçšã®ã³ã³ããŒãã³ããäœæããå¿ èŠã«å¿ããŠããã¯ã䜿çšãããã®ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããããšãã§ããŸãã
æ¥ç¥ãããªãã©ã°
@abhishekguruè€æ°ã®ã³ã³ããŒãã³ãéã§æ±çšããã¯ã䜿çšããŠããŠãç¹å®ã®ã³ã³ããŒãã³ããšã¯å¥ã«ããããã¹ããããå Žåã¯ã react-hooks-testing-library
ã®äœ¿çšãæ€èšããŠãã ããã
import { renderHook } from 'react-hooks-testing-library'
test('API test', async () => {
const { result } = renderHook(() => useAPIHelper( // <- now called within a component
'https://jsonplaceholder.typicode.com/posts',
reducer
))
console.log(result.current, 'new');
// expect(result.current[samUrl].loading).toEqual(true);
});
SSRã ãã«åé¡ããã£ãã®ã§ãããã§ãã£ã€ã ã鳎ããããã£ãã®ã§ãã ãã¡ã€ã«ã®å€æŽæã«ããŒãã®require.cache
ãã¯ãªã¢ããŸãã ããã«ããããµãŒããŒã§ã®ããããªããŒããå¹æçã«è¡ãããŸãã ããŒãã®require.cache
ãã¯ãªã¢ãããšãåäžã®ã³ããŒãå¿
èŠãªã©ã€ãã©ãªã§åé¡ãçºçããŸãã ãããç§ãã¡ã®è§£æ±ºçã§ãïŒ
Object.keys(require.cache)
.filter(key => !isSingleton(key)) // This is needed here because react cannot be deleted without causing errors
.forEach(key => {
delete require.cache[key]
})
isSingleton
é¢æ°ã«ã¯ãåäžã®ã³ããŒãå¿
èŠãªã©ã€ãã©ãªã®ãªã¹ããå«ãŸããŠããŸãã çµéšåãšããŠã peerDependencies
ã§å®çŸ©ããå¿
èŠã®ããã©ã€ãã©ãªã䜿çšããŸãã
https://yarnpkg.com/lang/en/docs/dependency-types/#toc -peerdependencies
ç§ã«ãšã£ãŠãåãåé¡ããããŸãã
window.React1 = require('react');
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2); // true
ãŸãã true
ãè¿ããäžãããããã¹ãŠã®ææ¡ãè©ŠããŸããããäœãæ©èœããŸããã§ããã æåŸã«ã次ã®ããšãå€æããŸããã
Webpackã¯ã bundle.js
ã®ã¹ã¯ãªããã¿ã°ãindex.html
ã«èªåçã«è¿œå ããŸãã ç§ã®åé¡ã¯ã bundle.js
ãindex.html
ã«æ瀺çã«è¿œå ããŠããããã§ãããããã¯ãããã¯ã®åã¯æ£åžžã«æ©èœããŠããŸããã
ç§ã«ãšã£ãŠã®åé¡ã¯ãbabel 7ã®ã¢ããã°ã¬ãŒãåŸãnpm lsreactã䜿çšããåå¥ã®ããŒãžã§ã³ã¯ãããŸããã§ããã åé€
.babelrcã®ãreact-hot-loader / babelãã§äžæçã«åé¡ãä¿®æ£ãããŸããã
äžèšã®ãã¹ãŠã®è§£æ±ºçãè©ŠããŸããããããã§ããšã©ãŒãçºçããŸããã
æçµçã«ãããã±ãŒãžwhy-did-you-update
ãåå ã§ããããšãããããããã«é¢é£ããåé¡ããããŸãã 誰ã«ãšã£ãŠãæãããã¯ãReactãå€æŽããåæ§ã®ããã±ãŒãžã䜿çšããŠããŸãã
react-native
+ Yarn Workspaces
ã·ããªãªã§ãããä¿®æ£ããããšãã§ããŸããã
ã«ãŒãå
package.json
{
"private": true,
"workspaces": {
"packages": [
"packages/*"
],
"nohoist": [
"**/react-native",
"**/react-native/!(react)/**"
]
}
}
ããã«ããã react-native
ã³ãŒããïŒReact Nativeã«å¿
èŠãªããã«ïŒåŒãäžããããã®ãé²ããªããã react
ãåŒãäžãããã¹ãŠã®å
±æã¢ãžã¥ãŒã«ãåãReactã䜿çšããããã«ããŸãã
metro.config.js
module.exports = {
watchFolders: [
path.resolve(__dirname, '../', 'shared-module'),
// ...more modules
path.resolve(__dirname, '../', '../') // to make sure the root `react` is also part of the haste module map
]
}
ã¡ããæ§æã«ããããã³ãã©ãŒã¯ãã¹ãŠãã©ãã«ããããç¥ãããšãã§ããŸãã
ããšãã°ãnpmããã±ãŒãžãããŒã«ã«ã§éçºããŠãã人ã ãåé¡ã解決ããæ¹æ³ãèŠã€ããŸããã圌ãã¯ãããçš®ã®ãµã³ãã«ã¢ããªã§npmãªã³ã¯ã䜿çšããŠããã±ãŒãžãããŒãããããšã«ãããããŒã«ã«ã§ãã¹ãããããšããŠããŸãã
ãµã³ãã«ã¢ããªïŒã³ã³ããŒãã³ãããã¹ãããå ã®æ¹æ³ïŒããStorybookã«åãæ¿ããŸããã ãããžã§ã¯ãã§ã¹ããŒãªãŒããã¯ã䜿çšããå Žåãã³ã³ããŒãã³ãã䜿çšããŠãããã®ãšåããã®ã䜿çšãããããReactã2åããŒããããããšã¯ãããŸããã npm linkã䜿çšããŠãããšãã«ãããã¯ãšReactã2åèªã¿èŸŒãŸãããšããåé¡ãçºçããŸããããŸããäžèšã®ãœãªã¥ãŒã·ã§ã³ãæ©èœãããããšãã§ããŸããã§ããã Storybookã§åé¡ã解決ããè€æ°ã®ã·ããªãªã§ã³ã³ããŒãã³ãããã¹ããããšåæã«ãã€ã³ã¿ã©ã¯ãã£ããªããã¥ã¡ã³ããäœæããæ¹æ³ãã§ããŸããã
ããã«é¢ããç§ã®çµéšãå
±æããã³ã³ããŒãã³ãã©ã€ãã©ãªã«webpackã®å€éšã䜿çšããŠããã«ãããreact
ãšreact-dom
ãé€å€ããããšã§ããããžã§ã¯ãã®åé¡ã解決ããŸããã
Reactããå§ããã°ããã§ãã ç§ã®å ŽåãNeutrinoã³ã³ããŒãã³ãã©ã€ãã©ãªããã±ãŒãžãšNeutrinowebappã¯ã©ã€ã¢ã³ãããã±ãŒãžãåããLernamonorepoããå§ããŠããŸãã Webã¢ããªã¯ããªã³ã¯ãããã³ã³ããŒãã³ãã©ã€ãã©ãªã®ãã«ã補åã䜿çšããŸãã åãReactã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠããã€ãã®å®éšãštrue
ãååŸããåŸãã³ã³ããŒãã³ãã©ã€ãã©ãªã®ãã«ãããreact
ãšreact-dom
ãå®å
šã«é€å€ããæ¹æ³ãæ€èšããŸããã
ããã¯ãwebpackã³ã³ããŒãã³ãã©ã€ãã©ãªã®äžè¬çãªãã¶ã€ã³ãã¿ãŒã³ãœãªã¥ãŒã·ã§ã³ã®ããã§ãããã®ãããã³ã³ããŒãã³ãã©ã€ãã©ãªã§webpackæ§æã«è¿œå ããŸããã
"externals": {
"react": "react",
"react-dom": "react-dom"
}
react
ãšreact-dom
ã®ã°ããŒãã«ã¹ã¯ãªããã¿ã°ãwebappããã±ãŒãžã«å
¥ããå¿
èŠã¯ãããŸããã§ããã Webpackã¯ãWebã¢ããªã±ãŒã·ã§ã³ã«æäŸããã®ãšåãããã«ã require
å®è£
ã§ã³ã³ããŒãã³ãã©ã€ãã©ãªã«ããããæäŸããŠãããšæããŸãã
ãã®ãšã©ãŒã®ãã1ã€ã®åå ã¯ãReactã«ãŒã¿ãŒã®Route
ã®èšå®ãã¹ã§ãã
ããã¯å€±æããŸãïŒ
<Route render={MyHookedComponent}/>
ããããããã¯æåããŸãïŒ
<Route component={MyHookedComponent}/>
äŸãã°ã render
component
ã䜿çšããå¿
èŠããããŸãã render
éåžžãã¯ã©ã¹ããŒã¹ã®ã³ã³ããŒãã³ãã§æ£åžžã«æ©èœãããããããã¯ç°¡åãªééãã§ãã
ç§ã¯biolerplateã«åãçµãã§ããŠããããnpmã«å
¬éããããšæã£ãŠããã npm linkã䜿çšããŠéçºããŠããŸããæ£åžžã«æ©èœããŠããŸãããããã°ãããããšãšã©ãŒInvalid Hook call warning
ãçºçãå§ããŸããã
npm link ../myapp/node_modules/reactã䜿çšããŠã¿ãŸããããåé¡ã解決ããŸããã
ãããŠã React1 === React2
ãšæ¯èŒãããšãããã¯çå®ã§ããã npm ls react
ãå®è¡ããã1ã€ã®ããã±ãŒãžã®ã¿ã衚瀺ãããŸãã
ãŸããwebpackã䜿çšããŠããŸãããcreate-react-appã®å€éšã«ã¬ã€ã€ãŒãè¿œå ããŠããã ããªã®ã§ãã¢ããªã«ããŒã«ã«ã«ã€ã³ã¹ããŒã«ãããreactã¢ãžã¥ãŒã«ã䜿çšãããããšã¯ã§ããŸããã
éå»3æ¥éããç«ã¡åŸçããŠããŸãã_
@hnagarkotiãšåãã§ãã
å€ãããŒãžã§ã³ã®react-apollo
ã䜿çšããŠããããããµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒäžã«ãã®èŠåãçºçããŸããããã®åé¡ã«ééãã次ã®è²§ãã人ã
ãå©ããããã«ããã®ãªã³ã¯ãããã«æ®ãããã£ãã ãã§ãã
https://github.com/apollographql/react-apollo/issues/2541
ã€ãŸãã getDataFromTree
ã¯ãããŒãžã§ã³[email protected]
ãŸã§reactããã¯ããµããŒãããŠããŸããã
åãåé¡ãçºçãã次ã®ããã«è¿œå ããŠè§£æ±ºããŸããã
alias: { react: path.resolve('./node_modules/react') }
ã¡ã€ã³ã¢ããªã®webpackæ§æã®
resolve
ããããã£ã«ãReactã2ã€äœ¿çšããã®ã¯æããã«ç§ã®ééãã§ãããããšã©ãŒã¡ãã»ãŒãžããã£ãšè¯ããã°çŽ æŽããããšæããŸãã ããã¯ãããã䌌ãŠãããšæããŸãïŒïŒ2402
create-react-appã§ãããè¡ãããã®ææ¡ã¯ãããŸããïŒ
^ããããŸãããcreate-react-appã§ããã解決ããããã«ç§ãè¡ã£ã解決çã¯ã react-app-rewiredãšcustomize-craã䜿çšããããšã§ãã
ãããç§ã®config-overrides.jsã§ãïŒ
const {
override,
addWebpackAlias,
} = require("customize-cra");
const path = require('path');
module.exports = override(
addWebpackAlias({
react: path.resolve('./node_modules/react')
})
)
ãããžã§ã¯ãã®äŸïŒ https ïŒ//github.com/dwjohnston/material-ui-hooks-issue/tree/master
ç§ãã¡ã®ããŒã ã§ã¯ãæ°åã®ã¢ããªã«ãŸããããŠãããŒãµã«ããã²ãŒã·ã§ã³ã³ã³ããŒãã³ãã䜿çšããŠããŸãããããã®ã¢ããªã¯ãã¹ãŠãreact 15.0.0ããreact 16.8.0ã«ç±æ¥ããŸããããã¯ã®äžã«å®è£ ãããããã²ãŒã·ã§ã³ãæå¹ã«ããã«ã¯ãææ°ã®reactãšãã³ãã«ããå¿ èŠããããŸãã
ãã®å Žåãreactã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãæã€ããšãç§ãã¡ã®åºæ¬çãªèŠä»¶ã§ãããreactã®å ¬åŒããŒã ãå°æ¥ãã®åé¡ã解決ããææããããã©ãããç¥ãããã§ããïŒ
@dwjohnston create-react-app
ã®åé¿çã¯ãéçºçšã®webpackæ§æãäœæããããšã§ããã create-react-app
å
éšã§webpackãwebpack-dev-serverãããã³babel-loaderã䜿çšãããããäŸåé¢ä¿ã¯ãã§ã«æé»çã«ååšããŸãããååŸããããã®ããªãã®ãªãŒããŒãããããããããéçºå°çšã®webpackæ§æãäœæããããšã¯ããã»ã©æªããããŸããã§ããæ£ããåäœããŠããŸãã
create-react-app
ã«åé¡ããããŸãïŒ https ïŒ//github.com/facebook/create-react-app/issues/6953 Webpack alias
ãµããŒããªã©ãè¿œå ããŸãã
ð誰ããcreate-react-app
ã䜿çšããŠããŠããã®åé¡ç¹ãçµéšããŠããå Žåã¯ããã®åé¡ã«èŠªæãç«ãŠãŠãã ããã
@ ricokahler-ææããŠãããŠããããšãã ãã®åé¡ãæ±ããŠããã®ã¯ç§ã ãã§ã¯ãªãããšãç¥ã£ãŠããããæããŸããç§ãç¶æ³ã«å¿ããŠåé¡ã«ééããŸããã
ãã®åé¡ã«ã€ããŠããã«è°è«ããŠããããšãç¥ã£ãŠãããªãœãŒã¹ã¯ãããŸããïŒ
ç§ã®ããŒãã«ããå Žåã¯ãããŒã«ã«ãã£ã¬ã¯ããªããreactã³ã³ããŒãã³ãããã±ãŒãžãè¿œå ããŸãããããã«ãããnode_modulesã®ç¬èªã®ã³ããŒïŒnpmãªã³ã¯ã䜿çšããŠãããè¡ãããïŒãšãšãã«ãèªåçã«ãã«ãããã³ã€ã³ã¹ããŒã«ãããŸããã¢ããª2ã³ããŒãŸãã¯ä»ããåå¿ããŸãã
node_modules /ãåé€ããŠåé¿ããŸãã
"prestart": "rimraf ./node_modules/<my_package>/node_modules"
ç§ãSSRãããŠãããšãã«ããã«çŽé¢ããŸããã
Lernaã䜿çšããŠReactã©ã€ãã©ãªãããŒã«ã«ã§ãã¹ãããå Žåã¯ãã©ã€ãã©ãªã®peerDependenciesãšããŠãreact / react-dom / react-routerããè¿œå ã§ããŸãããdevDependenciesãšããŠè¿œå ããªãã§ãã ããã ïŒããã«ããéè€ããŸãïŒ
node --preserve-symlinks
ã䜿çšãããšãpeerDependenciesãã€ã³ã¹ããŒã«ãã芪ãªããžããªãæ€çŽ¢ã§ããŸãã
jestã®å Žåã芪ãªããžããªãã¹ããjest.moduleDirectoriesããªãã·ã§ã³ã«è¿œå ããŠãJestããããã解決ã§ããããã«ããå¿
èŠããããŸãã
@apieceofbartããã¯ç§ã®ããã«åããthxïŒ
JSã¢ãžã¥ãŒã«ãªã©ã®å€éšReactã³ã³ããŒãã³ããããŒããããšãã«ããã®ãšã©ãŒãçºçããŸããã ãããã¯å®å šã«ãããžã§ã¯ãã®å€ã«ãããåçãªimportïŒïŒãããŒããããŠããŸãïŒããå€ãã®ãµããŒãã®ããã«jsonpãïŒã ãã®åé¡ãåé¿ããããã«ãReactãããããã£ãšããŠåã¢ãžã¥ãŒã«ã«æž¡ã/æ³šå ¥ããŸãã ããã¯æ©èœããŸãããåã¢ãžã¥ãŒã«ã¯å«ãŸããŠããReactã¢ããªã«äŸåããŸãã äŸåé¢ä¿ãåé€ããããšããŠããŸãã
ä»ã®äººãè¿°ã¹ãŠããããã«ããã®ããããã£ã¯ãããããã¿ã€ãã®ãã€ã¯ãããã³ããšã³ãã«äœ¿çšã§ããReactãæé€ããŸãã åé¡ã¯ãã©ã€ãã©ãªãšããŠäœ¿çšããããã«Reactãã€ã³ããŒããããšãã«ãJSã©ã³ã¿ã€ã ã§ã°ããŒãã«ç¶æ ãäœæãããšãããã®å¯äœçšãããããšã§ãã
åçŽãªãŠãŒã¹ã±ãŒã¹ã®å Žåããã®å¯äœçšããããšããããšã¯ãReactãã䜿ãããããããšãæå³ããããšãç解ããŠããŸãã ãã ããWebããŒãžãè€æ°ã®ãã³ãã«ã¹ãããããã®è€æ°ã®ã¹ã¯ãªããã§æ§æãããŠããå Žåããã®ãã¡ã®1ã€ã¯Reactãèšå®ã§ãïŒãã®å¯äœçšãæ瀺çã«å®è¡ã§ããŸãïŒãä»ã®ã¹ã¯ãªããã¯åã«ã©ã€ãã©ãªé¢æ°ãåŒã³åºãããšãã§ããŸãã
ç§ã¯ãŸã react-bootstrapã«åé¡ããããŸãïŒ ïŒhttps ïŒ//github.com/react-bootstrap/react-bootstrap/issues/3965
Reactã®ã©ã€ãã©ãªãäœæããããšããŠç«ã¡åŸçããŠããä»ã®äººã¯ã httpsïŒ//github.com/whitecolor/yalcãè©ŠããŠãã ãããã·ã³ããªãã¯ãªã³ã¯ãããã¯ããã«ããŸãæ©èœããŸãã
@mpeyperã¯ããŸãæ©èœããŸãã ã©ãã
@apieceofbartããã¯ç§ã®ããã«åããã ææ¡ãããããšãã ð
ç§ã®å Žåããã®åé¡ã¯ãPowerShellã§ãããžã§ã¯ããã£ã¬ã¯ããªã«ç§»åãããã¹ã§ãã£ã¬ã¯ããªåã倧æåã«ããªããšãã«çºçããŸããã ãŠãŒã¶ãŒ/âŠ/âŠã§ã¯ãªããusers /âŠ/âŠã§ãããžã§ã¯ããäœæããŸããã
ãã®åé¡ã¯ããã£ãã¿ã©ã€ãŒãŒã·ã§ã³ãšã©ãŒãä¿®æ£ããŠãããžã§ã¯ããåäœæãããšãã«è§£æ±ºãããŸããã
ç§ã«ãšã£ãŠã¯ã次ã®ããšãè¡ããŸãã
"react": "file:../my-library/node_modules/react",
"react-dom": "file:../my-library/node_modules/react-dom",
ãã®ã»ãšãã©ãä¿®æ£ããŸããããååã§ã¯ãããŸããã§ããããšã©ãŒhooks can only be called inside the body of a function component
ãçºçãç¶ããŸããã
ããã¯ãç§ã®ã©ã€ãã©ãªã®ã³ã³ããŒãã³ãã®äžéšã次ã®ããã«ãšã¯ã¹ããŒããããããã§ããããšãããããŸããã
export default Radium(withTranslation()(MyComponent))
ïŒããïŒ
ããã§ã withTranslation
ã¯react-i18nextããã®HOCã§ããã Radium
ã¯Radiumããã®HOCã§ãã
ãããŠããã®ããã«ãããããšã¯ã¹ããŒãããŸãïŒ
export default withTranslation()(Radium(MyComponent))
ïŒheavy_check_markïŒ
ãã¹ãŠãä¿®æ£ããŸããã
react-i18nextã¯Reactããã¯ã䜿çšããããŒãžã§ã³10ã«ãã£ãããšã«æ³šæããŠãã ãã
@mikeaustinåãåé¡ãçºçããŠããŸãã ãReactãããããã£ãšããŠåã¢ãžã¥ãŒã«ã«æž¡ã/æ³šå ¥ãããäŸã¯ãããŸããïŒ
ããã§ããã®åé¡ãçºçããå Žåã¯ããã¹ãŠã®æé ãè©ŠããŠãã ããã
圱é¿ãäžããå¯èœæ§ã®ããããã€ãã®äºæïŒ
$ npm ls react-dom
/xxx
âââ [email protected]
$ npm ls react
/xxx
âââ [email protected]
ã«ãŒãpackage.json
{
...
"workspaces": [
"packages/*",
],
"devDependencies": {
...
},
"dependencies": {
"react": "16.8.6",
"react-dom": "16.8.6"
},
"resolutions": {
"react": "16.8.6",
"react-dom": "16.8.6",
"**/react": "16.8.6",
"**/react-dom": "16.8.6"
}
}
@JeremyGrieshopç§ã¯åãåé¡ãæ±ããŠããŸããããããŠããã¯ç§ã®ããã«åããŸãããããããšãã
以äžã®ããã«ãpackage.jsonã«ãprestartããè¿œå ããŸãã
"scripts": {
"prestart": "rimraf ./node_modules/<my package>/node_modules",
"start": "react-scripts start",
"build": "react-scripts build",
},
ç§ã¯ãã®åé¡ãæ±ããŠããŸããããreact / react-domã®è€æ°ã®ããŒãžã§ã³ãåå ã§ã¯ãããŸããã§ãã
ç§ã䜿çšããŠããã«ã¹ã¿ã ããŒã«ã§ã¯ãrequireãã£ãã·ã¥ãïŒãã®èª¬æ以å€ã®ç®çã§ïŒã¯ãªã¢ãããŠããŸãããäŸïŒ
Object.keys(require.cache).forEach((key) => {
delete require.cache[key];
});
ã ãããããªãããã®ãããªããšãããŠãããªããããã«ãã人ã ã«fyi-ããã¯React Hooksã«åœ±é¿ãäžããã®ã§ãã§ããã°ãããé¿ããŠãã ãã
åãåé¡ãçºçãã次ã®ããã«è¿œå ããŠè§£æ±ºããŸããã
alias: { react: path.resolve('./node_modules/react') }
ã¡ã€ã³ã¢ããªã®webpackæ§æã®
resolve
ããããã£ã«ãReactã2ã€äœ¿çšããã®ã¯æããã«ç§ã®ééãã§ãããããšã©ãŒã¡ãã»ãŒãžããã£ãšè¯ããã°çŽ æŽããããšæããŸãã ããã¯ãããã䌌ãŠãããšæããŸãïŒïŒ2402
Parcelã䜿çšããŠãã人ã«ãšã£ãŠãã³ã³ãã€ã«ããããã¡ã€ã«ãdist
ã§ããå Žåã¯ã次ãè¿œå ããå¿
èŠããããŸãã
"alias": {
"react-mediator": "./dist"
},
ããªãã®package.json
ã«ããããŠããªãã¯ãŸã ããŒã«ã«éçº/ãã¹ãã®ããã«ã©ã€ãã©ãªãlink
ïŒnpmãŸãã¯yarnïŒããããšãã§ããŸãã
@mikeaustinåãåé¡ãçºçããŠããŸãã ãReactãããããã£ãšããŠåã¢ãžã¥ãŒã«ã«æž¡ã/æ³šå ¥ãããäŸã¯ãããŸããïŒ
React Contextã䜿çšããŠãReactãèªäœãæž¡ããHoCãäœæããŠããããã£ããã¹ãŠã®ã³ã³ããŒãã³ãã«æ¿å ¥ã§ããŸãã api.Reactã®ãããªAPIã§äœã§ãæž¡ãããšãã§ããŸããããããã®ã³ã³ããŒãã³ãã®åšãã«HoCãã©ããããã®ã¯å°ãããªãããŒã«ãªããŸãïŒçŸåšããããã¯ã³ã³ããŒãã³ãå ã§ã®ã¿äœ¿çšå¯èœã§ããããšã¯ã¹ããŒãã«ã¯äœ¿çšã§ããªãããã§ãã
const withReact = Component = props => (
<ReactContext.Provider value={api => <Component api={api} {...props} /> } />
)
ãœãŒã¹ã³ãŒããå€æŽããŠãšã©ãŒã¡ãã»ãŒãžãå€æŽããããã«æ å ±ãè¿œå ããã®ãç°¡åã§ã¯ãªããããã«æéãå¿ èŠãªå Žåã¯ãå°ãªããšããã®ã¡ã¢ãããã¥ã¡ã³ãã«è¿œå ããŠãã ããã
_p.sïŒreactã«ã¯ãã°ãããããã¥ã¡ã³ãããããŸãããããŒãžã確èªããå¿ èŠããããšæããŸãã_
@OliverRadini
react-hot-loader
ã^4.6.0
ã«æŽæ°ããããšã§ããããä¿®æ£ã§ããŸããã
ããŒã³ãããã¯ãããä¿®æ£ããŸããã
@gaearon @theKasheyãããhttps://reactjs.org/warnings/invalid-hook-call-warning.htmlã«è¿œå ããŠãå€ãããŒãžã§ã³ã®react-hot-loader
ãåå ã§æéãç¡é§ã«ããªãããã«ããŠã¯ã©ãã§ããããã
ç§ã¯ããããã§ã«åæ°ã®åé¡ã«ããã£ãŠææžåãããŠããã®ã¯ããªãè¯ããšæããŸããã
ããã«ã¡ã¯ãç§ã¯ã¢ããªãšã©ã€ãã©ãªã®äž¡æ¹ã§Reactã䜿çšããŠããŸãã ã¢ããªå ã®ã©ã€ãã©ãªã䜿çšããŠããŸãã ç§ã¯ä»¥äžã䜿çšããŠ2ã€ã®reactã€ã³ã¹ã¿ã³ã¹ã®åé¡ãä¿®æ£ããããšãã§ããŸããïŒ
ã¢ããªã®webpackæ§æïŒ
alias: { react: path.resolve( '__dirname', '..', 'node_modules', 'react' ) // Adapt this to match your file tree
ã©ã€ãã©ãªã®webpackæ§æ
externals: {
react: 'react', // Case matters here
'react-dom': 'react-dom' // Case matters here
}
ãã®ããããã©ã³ã¹ãã€ã«ãããŠããªããã¡ã€ã«ïŒ* .jsïŒããããã¯ãåŒã³åºãéã«åé¡ãçºçããŸãã
index.js
ïŒ
import ReactDOM from 'react-dom';
import './index.css';
import App from './app';
ReactDOM.render(App(), document.getElementById('root'));
app.jsx
import React from 'react';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
const BaseContext = React.createContext();
const initialState = {
woo: true
};
const reducer = (state, action) => {
switch (action.type) {
default:
return state;
}
};
const Home = () => <h1>You're at home.</h1>;
const App = () => {
// eslint-disable-next-line
const [state, dispatch] = React.useReducer(reducer, initialState);
return (
<Router>
<BaseContext.Provider value={initialState}>
<BaseContext.Consumer>
<div className="welcome">
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
</ul>
</nav>
<header className="header">
<h1>Welcome!</h1>
</header>
<Route path="/" exact component={Home} />
</div>
</BaseContext.Consumer>
</BaseContext.Provider>
</Router>
);
};
export default App;
ãJSXãã¡ã€ã«ã«ç§»åããŠãã©ã³ã¹ãã€ã«ãããã§ã¯ãªããšä»®å®ããŠãäœãã¢ããã€ã¹ã¯ãããŸããïŒ
åºæ¿ãšåå¿ãçµã¿åãããŠäœ¿çšââããŠããã®ã§ãäœãããŸããããªãããã§ãããã€ããªããã¢ããªããããããã¯ã䜿ãå§ããŸããããã¿ãŒããªã³ã¯ãè¿œå ãå§ãããšããã«å€±æããŸãã:(
ç·šéïŒä»ã®ãšãããç§ã䜿çšããŠããã¹ã¯ãªããã¿ã°ã«data-turbolinks-track="reload" data-turbolinks-eval="false"
ãè¿œå ããããšã§åé¡ã解決ããã®ã§ãä»ã®ãšãããããè¡ãå¿
èŠããããŸã
ç§ã¯åã質åãããŸãã4æéåŸãç§ã¯jenkinsutilããµãŒããŒãžã®å€æ.babelrcãã¡ã€ã«ã倱ã£ãŠããããšãããããŸããã
ãªãããããšã©ãŒãåŒãèµ·ããã®ã§ããããïŒ
$ npm ls react
[email protected] /mnt/g/development/javascript/pow-vehmain
âââ [email protected]`
Invalid hook call...
ServiceVisitMaintenance
src/components/ServiceVisit/ServiceVisitMaintenance.js:6
3 | import { ServiceVisitForm } from './ServiceVisitForm';
4 |
5 | const data = [{ id: 1, description: 'Ford' }, { id: 10, description: 'Edsel' }];
> 6 | const ServiceVisitMaintenance = () => {
7 | const [vehicleList, setVehicleList] = useState([]);
8 | return (
9 | <div>
ServiceVisitMaintenance.jsïŒ
import React, { useState } from 'react';
import { ServiceVisitForm } from './ServiceVisitForm';
const data = [{ id: 1, description: 'Ford' }, { id: 10, description: 'Edsel' }];
const ServiceVisitMaintenance = () => {
const [vehicleList, setVehicleList] = useState([]);
return (
<div>
<ServiceVisitForm vehicleList={data} />
</div>
);
};
export { ServiceVisitMaintenance };
ããªãã®react-domããŒãžã§ã³ã確èªããŠãã ããã
$ npm lsreact-dom
[email protected] / mnt / g / development / javascript / pow-vehmain
âââ[email protected]
ã©ã€ãã©ãªããconnectïŒmapStateToPropsïŒïŒMyComponentïŒããšã¯ã¹ããŒããããã®ã©ã€ãã©ãªãCRAã¢ããªã§äœ¿çšãããšããã®åé¡ã«çŽé¢ããŸããã
ããããããã¯ç§ã®æªããšã©ãŒã§ããã ãããåŒã³åºãã«ãŒãã³ã¯ãreact-router-domã䜿çšããã³ã³ããŒãã³ãã§ã¯ãªãã¬ã³ããŒããããã䜿çšããŸããã
åãåé¡ããããŸãããgatsbyã«åé¡ããã人ã¯ããŸããïŒ
'npm lsreact'ã®åŸã«æ¬¡ã®çµæãåŸãããŸãã
ããã³ãnpmlsreact-domã
æåã¯ã誀ã£ãŠã°ããŒãã«ã«reactãã€ã³ã¹ããŒã«ãããšæã£ãŠããŸããããã°ããŒãã«ã«ã¢ã³ã€ã³ã¹ããŒã«ããåŸã¯äœãå€ãããŸããã§ããã 次ã«ãå¥ã®ãã£ã¬ã¯ããªãgatsby new random-nameãã«ãŸã£ããæ°ãããããžã§ã¯ããäœæããŠã¿ãŠãå°ããªæ©èœãè¿œå ããŸããïŒhttps://www.youtube.com/watch?v=asrdFuAxPaU&feature=youtuã«ç¶ããŠã³ã¡ã³ããè¿œå ããŠãã ããïŒ .beïŒgatsby-starter-defaultã«å€æŽããŠããšã©ãŒãèªåçã«åçŸããããã©ããããã¹ãããŸãã ãŸããç§ã®æ®å¿µãªããšã«ãããã¯ããŸããïŒ
ãããšããããã¢ããã€ã¹ã¯ã欲æ±äžæºã®ãã¬ãã¹ã«å¥œè©ã§ãã
ç§ã¯ãŸã ã¹ããŒãªãŒããã¯ã§ãã®åé¡ã«çŽé¢ããŠããŸãã npm lsããã®ãã®åºåã¯æ£ããã§ããïŒ
ç§ã®å Žåãåé¡ã¯why-did-you-update
ã¢ãžã¥ãŒã«ãåå ã§çºçããŸããã
ã¯ãŒã¯ã¹ããŒã¹ãšlernamonorepoã®ããããã䜿çšããŠãããã±ãŒãžãæã¡äžããŸãã ããã¯åé¡ã解決ããŸãã
SSRã§ãåãåé¡ãçºçããŠããŸãã Webpackã®èšå®ã§externals: [âreactâ]
ãèšå®ããŠãããæåã§react/umd/react.development.js
ãããŒãããããšã§æ©èœããããã§ãã ãã ããããã¯èŠçã§ãããããç°¡åãªæ¹æ³ãèŠã€ããããšèããŠããŸãã
ããŸãããã°ãããã誰ãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã 誀ã£ãŠwebpackruntime.jsãè€æ°åããŒãããŠãããããReactã®è€æ°ã®ã³ããŒãååšããŠããŸããã runtimeChunkïŒruntime.jsïŒã1åã ãããŒãããããã«ããŠãã ããã
ç§ã®ãããªJestãã¹ãã§åé¡ãçºçããå Žåã¯ãããã§åé¡ã解決ããããã§ãã
ãããjest.config.js
ã«è¿œå ããŸã
moduleNameMapper: {
'^react$': '<rootDir>/node_modules/react/'
}
ãã®ãšã©ãŒãå°ãªããšããããçºçããŠãããã¡ã€ã«ãæããŠãããšããã§ãããã éåžžã®é¢æ°ã§èª€ã£ãŠããã¯ãåŒã³åºããããããããã°ãå°é£ã§ããã
åé¡ã®å¥ã®åå ãšãã®è§£æ±ºçãèŠã€ããŸããã
ç§ã®ç°å¢ã¯electron
ãšwebpack
ã§ãããããã¯é»å以å€ã®äººã
ã«ã圹ç«ã€ãããããŸããã React 16.9ïŒããã³React DOM 16.9ïŒã«ã¢ããã°ã¬ãŒãããåŸããã®ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããçç±ã解決ããããã«èŠåŽããŸããã
ç§ã®å Žåãã¢ããªã«2ã€ã®Reactãããããã«èŠããŸãããã npm ls react
ã䜿çšããŠããªããŠããnode_modulesã«2ã€ã®ç©çã©ã€ãã©ãªãèŠã€ãããŸããã§ããã webpack-bundle-analyzer
ã䜿çšããŠããã³ãã«å
ã®å
容ã確èªããŸããã
æçµçã«ããããžã§ã¯ãã«ç©ççã«2ã€ã®ReactããªãããšãçºèŠããŸãããã ReactãšReactDOMã¯HTMLãã¡ã€ã«ã§2ååç
§/ããŒããããŸããã ããã¯ãããšãã°console.log("React load")
ãReactã©ã€ãã©ãªã®index.jsã«è¿œå ããããšã§ç°¡åã«ç¢ºèªã§ããŸãã
å®éã®ãœãŒã¹ã¯electron-webpack
ã«æ¥ç¶ãããŠããŸããã reactãšreact-domã¯å€éšãšããŠããŒã¯ãããŠããªãã£ããããä»ã®ã¢ãžã¥ãŒã«ã§äœ¿çšããå¿
èŠãããããããã³ãã«ã«ããŒããããåŸã§node_modulesããããŒããããŸããã
解決çã¯ããããã®è¡ãwebpack.renderer.config.js
ã«è¿œå ããã®ãšåããããç°¡åã§ããã
module.exports = {
externals: [
"react",
"react-dom"
],
};
ããŠãããã§èª°ããparcel.jsã䜿çšããŠããå Žåãå¥åŠãªçç±ã§æ¬¡ã®ã€ã³ããŒããåé¿ããããšãã§ããŸããïŒ import React from 'React';
ãããŠreactããã¯ã䜿ãå§ãããšãäžå€ã®éåãšã©ãŒãçºçããŸããã from 'react'
from 'React'
ã䜿çšããŠäžé©åã«ã€ã³ããŒãããŠããããã§ãã ãã£ãšã
åãåé¡ããããŸãããgatsbyã«åé¡ããã人ã¯ããŸããïŒ
'npm lsreact'ã®åŸã«æ¬¡ã®çµæãåŸãããŸãã
ããã³ãnpmlsreact-domã
æåã¯ã誀ã£ãŠã°ããŒãã«ã«reactãã€ã³ã¹ããŒã«ãããšæã£ãŠããŸããããã°ããŒãã«ã«ã¢ã³ã€ã³ã¹ããŒã«ããåŸã¯äœãå€ãããŸããã§ããã 次ã«ãå¥ã®ãã£ã¬ã¯ããªãgatsby new random-nameãã«ãŸã£ããæ°ãããããžã§ã¯ããäœæããŠã¿ãŠãå°ããªæ©èœãè¿œå ããŸããïŒhttps://www.youtube.com/watch?v=asrdFuAxPaU&feature=youtuã«ç¶ããŠã³ã¡ã³ããè¿œå ããŠãã ããïŒ .beïŒgatsby-starter-defaultã«å€æŽããŠããšã©ãŒãèªåçã«åçŸããããã©ããããã¹ãããŸãã ãŸããç§ã®æ®å¿µãªããšã«ãããã¯ããŸããïŒ
ãããšããããã¢ããã€ã¹ã¯ã欲æ±äžæºã®ãã¬ãã¹ã«å¥œè©ã§ãã
ã¯ããç§ã¯ããªããšåãåé¡ã«ééããŸããã ç§ã¯ããã®ã¢ããã€ã¹ã«åŸããŸãã... ã
// Add this in node_modules/react-dom/index.js
window.React1 = require('react');
// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);
ããŒãžã®äžã®ã€ã³ããã¯ã¹ãã¡ã€ã«ã«React2ãè¿œå ããŸããã falseãè¿ããŸãã
Dedupedã¯ãnpmãäŸåé¢ä¿ãééè€åããå¿ èŠãããããšãæå³ããŸãããããåç §ããŠãã ãã...
åãããã±ãŒãžã2åã€ã³ã¹ããŒã«ããå¿ èŠã¯ãããŸããïŒ åç §ãããŠããã ãã§ãã
ãŸããããã±ãŒãžããããªãŒã®äžæ¹ãã«ç§»åããŸãïŒããªãŒãå¹³åŠåããŸãïŒã ããã¯å®å šã«çã«ããªã£ãŠããŸããããããªããšã1ã€ã®ããã±ãŒãžãä»ã®ããã±ãŒãžã®node_modulesã調ã¹ãªããã°ãªããïŒããã¯ã¡ãã£ãšé¢åã§ãïŒãäŸåé¢ä¿ãåçŽåããã®ã«åœ¹ç«ã¡ãŸãã
ãããæ€èšŒã§ããŸããäŸåé¢ä¿ã°ã©ãå ã®éè€æé€ã瀺ããã¹ãŠã®ããã±ãŒãžããã°ã©ãå ã§å°ãªããšããã1åãéåžžã¯ãããé«ãã¬ãã«ãã§èŠã€ããããã§ãã
æããã«ãããããã³ã°ã¯æ©èœããŠããŸããã
äœãè©ŠããŸãããïŒ
NextJSã§ãã«ãããããšãããšããã®ãšã©ãŒãçºçããŸãã äžéšã®ã³ã³ããŒãã³ãã¯material-uiã䜿çšããŠãããããããåé€ãããšåé¡ã¯è§£æ±ºããŸãã styled-componentsã¯äœ¿çšããŸããã éãæªãã£ãã®ã§node_modulesãªã©ãåé€ããŠã¿ãŸããã next.config.jsãã¡ã€ã«ãšpackage.jsonã«react
ã®ãšã€ãªã¢ã¹ãšè§£æ±ºçãè¿œå ããããšããŸããããéãæªãã£ãã§ãã ç§ã¯react16.8.6ãreact-dom 16.8.6ããããŠæ¬¡ã®9.0.4ã䜿çšããŠããŸãã npm ls
ã¯ãããããã1ã€ãããªãããšã瀺ããŠããŸãã npmãªã³ã¯ã䜿çšããŠããŸããã
ãªããžããªïŒ https ïŒ//github.com/dancancro/questions/tree/invalid-hook-call
Codesandboxã¯ããã«ãããŸãïŒ https ïŒ//codesandbox.io/s/github/dancancro/questions/tree/invalid-hook-call/ïŒfontsize = 14
StackoverflowïŒ https ïŒ//stackoverflow.com/questions/57647040/nextjs-invalid-hook-call-hooks-can-only-be-called-inside-of-the-body-of-a-fun
ãšã©ãŒã¯ããã«ãããŸãïŒhttpsïŒ//gist.github.com/dancancro/2dfafb053aaaedfade406fd4f67eb68a
... render-> renderToString-> ReactDOMServerRenderer.read-> ReactDOMServerRenderer.render-> Object.WithStyles [as render] .. ..
åé¡ã®ããããã¯ã¯ã$ withStyles
é¢æ°ã®æ¬¡ã®ãã¡ã€ã«ã®17428è¡ç®ã®useStyles()
åŒã³åºãã§ãã ãvarclasses = useStylesïŒpropsïŒããæ€çŽ¢ããŸãã åé¡ã¯nextjsã§çæãããã³ãŒãã«ãããŸãã ç§ãæžããã³ãŒãã¯ã withStyles
ãããuse *ãã§å§ãŸãããã¯ãé¢æ°ã䜿çšããŠããŸããã
æŽæ°ïŒãããnext.config.jsããåé€ãããšãåé¡ã解決ããŸããïŒ
webpack: config => {
config.externals = [
'/'
]
return config
},
ãªã³ã¯ãããããã±ãŒãžã®node_modules
ãã©ã«ããŒããreact
ãšreact-dom
ãåé€ããããšã§ãåé¿çãèŠã€ããŸããã
ç§ã¯ããªãæ¹ã®å€ããšåãè¹ã«ä¹ã£ãŠããŸãã ããŒã«ã«ã§äœæ¥ããŠããã©ã€ãã©ãªããã±ãŒãžããããã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžã®å€æŽã確èªããå¿ èŠããããã³ã«ãã©ã€ãã©ãªãå ¬éããæéããããããããŸããã ãªã³ã¯ããŠããã®ãšã©ãŒãçºçãå§ããŸããã
åé¿çã¯æ¬¡ã®ãšããã§ãã
npm link
'dã«ãªã£ãŠããŸãnode_modules
ãã©ã«ãã«ã·ã³ããªãã¯ãªã³ã¯ããããŸãdist/
ã«åºåããŸããããã«ã¯ã node_modules
ãå«ãŸããŸããnode_modules
ãã©ã«ããŒã§ã react
ãšreact-dom
ãåé€ããŸãäž¡æ¹ã®ããã±ãŒãžã«åãããŒãžã§ã³ã®Reactãã€ã³ã¹ããŒã«ããããšã«æ³šæããŠãã ããã å®è¡äžã®ããã»ã¹ãåèµ·åããå¿ èŠããããŸãã
äºææ§ã®ãªãwhy-did-you-update
ãåé€ãããšããŸããããŸãã ïŒhttps://github.com/maicki/why-did-you-update/issues/52ïŒ
äºææ§ã®ãªãwhy-did-you-update
@ bertho-ãŒã䜿çšã¯æ°ããdevtoolsãŸãã¯ç§ã®ããã¯useWhyDidYouUpdateã䜿çšã§ããŸã
@brunolemosçŽ æŽãããã§ãããåã³ã³ããŒãã³ãã«é 眮ããå¿ èŠããããããããå¶çŽããããŸãã
@ dmart914ã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ã«ãšã£ãŠåé¡ã解決ããŸããã ç§ãããã±ãŒãžããªã³ã¯ããŠãå€æŽãå ¬éããã«ã©ã€ãã©ãªããã¹ãã§ããããã«ããŠããŸã...誰ããããã®åé¿çãèŠã€ããŸãããïŒ ãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªãå ¬éããããã¯ãéæ³ã®ããã«æ©èœãå§ããããã«ç¹å®ã®NPMããã±ãŒãžãåé€ããããšãææžåããå¿ èŠãããã®ã¯çŽ æŽãããçµéšã§ã¯ãããŸãã...
ãªã³ã¯ãããããã±ãŒãžã®react
ã¢ãžã¥ãŒã«ãåé€ãããœãªã¥ãŒã·ã§ã³ã¯ããã®ããã±ãŒãžã«react
ãå¿
èŠãšãããã¹ãïŒäŸïŒ @testing-library/react
ãŸãã¯@testing-library/react-hooks
ïŒãããå Žåã¯æ©èœããªãããããããåŠçããããã®ããè¯ãæ¹æ³ããŸã å¿
èŠãªããã§ãã
ç§ã®ã¢ããªã±ãŒã·ã§ã³ã¯2ã€ã®éšåã§æ§æãããŠããŸãã ã¡ã€ã³ã®Webã¢ããªã±ãŒã·ã§ã³ãšWebã¢ããªã±ãŒã·ã§ã³ã«åçã«ããŒããããã¢ãžã¥ãŒã«ã Webã¢ããªã±ãŒã·ã§ã³ãšã¢ãžã¥ãŒã«ã®äž¡æ¹ãReact16.9.0ã䜿çšããŸãã
ã¢ãžã¥ãŒã«ã¯ãReact.lazyïŒïŒããã³åçimportïŒïŒã¹ããŒãã¡ã³ãã䜿çšããŠWebã¢ããªã±ãŒã·ã§ã³ã«ããŒããããŸãã
ã¢ãžã¥ãŒã«ãããŒãããããšããç¡å¹ãªããã¯åŒã³åºãããšã©ãŒãã¹ããŒãããŸãã
ç§ã®å Žåãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãšã¢ãžã¥ãŒã«ã¯å¥ã ã«æ§ç¯ãããŠããããããäºããèªèãããç¬èªã®åå¿ã³ããŒãæã¡ãŸãã ã¹ã¬ããã§èŠã€ãã£ã次ã®ææ¡ãè©ŠããŸããããåé¡ã¯è§£æ±ºããŸããã§ããã
ã¢ãžã¥ãŒã«ã®webpack.configã«ãšã€ãªã¢ã¹ãè¿œå ããŸããããã¯ãapieceofbartã«ãã£ãŠææ¡ãããã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®åå¿ãæããŸãã
ãšã€ãªã¢ã¹ïŒ{
åå¿ïŒpath.resolveïŒ '../../ node_modules / react'ïŒ
}
ã¢ãžã¥ãŒã«ã®package.jsonã®reactäŸåé¢ä¿ãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã«ãã€ã³ãããããšããŸããã
ãäŸåé¢ä¿ãïŒ{
"react-dom"ïŒ "ãã¡ã€ã«ïŒ../ common / node_modules / react-dom "ã
"react"ïŒ "ãã¡ã€ã«ïŒ../ common / node_modules / react "
}
åçã«ããŒããããã¢ãžã¥ãŒã«ã«é¢ããŠã¯ãreactã¯è€æ°ã®ã³ããŒã®å®è¡ããµããŒãããå¿ èŠããããšæããŸãã
äžèšã®åçã®ããã€ãã«åºã¥ããŠããããç§ã®ããã«åãããã®ã§ãïŒ
config/webpack.config.js
ã«ä»¥äžãè¿œå ããŸããexternals: {
react: {
root: 'React',
commonjs2: 'react',
commonjs: 'react',
amd: 'react'
},
'react-dom': {
root: 'ReactDOM',
commonjs2: 'react-dom',
commonjs: 'react-dom',
amd: 'react-dom'
}
}
package.json
"devDependencies" : {
...
"react": "^16.9.0",
"react-dom": "^16.9.0",
}
"peerDependencies": {
"react": "^16.9.0",
"react-dom": "^16.9.0"
}
public/index.html
<head>
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
...
ãã®åŸãJestãnode_modulesïŒdevDependenciesããã€ã³ã¹ããŒã«ãããïŒããreactã³ããŒãããŒãããŠããéã«ãCDNããããŒããããReactã䜿çšããŠã©ã€ãã©ãªã§ããã¯ãå®è¡ããããšãã§ããŸããã
ã圹ã«ç«ãŠã°å¹žã
ã³ã³ããŒãã³ããæ©èœã³ã³ããŒãã³ãããã¯ã©ã¹ãã«ã³ã³ããŒãã³ãã«å€æŽããããšãããšããã®åé¡ã«çŽé¢ããŸããããŸãããã®ãšã©ãŒãçºçããã®ã§ããã®ãšã©ãŒã«é¢ããç§ã®è§£æ±ºçã¯ãããªãã®å Žåã«ã圹ç«ã€ããšãé¡ã£ãŠããŸãã
ãã®å Žåãããé«æ¬¡ã®ã³ã³ããŒãã³ãã䜿çšããŠã¿ãŠãã ãã
'react'ããReactãã€ã³ããŒãããŸãã
'prop-types'ããPropTypesãã€ã³ããŒãããŸãã
import {withStyles} from '@ Material-ui / styles';
'@ Material-ui / core / Button'ãããã¿ã³ãã€ã³ããŒãããŸãã
const styles = theme =>ïŒ{
æ ¹ïŒ {
èæ¯ïŒ 'linear-gradientïŒ45degãïŒFE6B8B 30ïŒ
ãïŒFF8E53 90ïŒ
ïŒ'ã
ããŒããŒïŒ0ã
borderRadiusïŒ3ã
boxShadowïŒ '0 3px 5px 2px rgbaïŒ255ã105ã135ã.3ïŒ'ã
è²ïŒ 'çœ'ã
é«ãïŒ48ã
ããã£ã³ã°ïŒ '0 30px'ã
}ã
}ïŒ;
ã¯ã©ã¹HigherOrderComponentã¯React.Componentãæ¡åŒµããŸã{
äžããïŒïŒ{
const {ã¯ã©ã¹} = this.props;
æ»ã ïŒ
é«éæå
ïŒ;
}
}
HigherOrderComponent.propTypes = {
ã¯ã©ã¹ïŒPropTypes.object.isRequiredã
};
ããã©ã«ãã®withStylesïŒstylesïŒïŒHigherOrderComponentïŒ;ããšã¯ã¹ããŒãããŸãã
ç§ã¯Yarnã䜿çšããŠããŸããã
package.json
ã§è§£æ±ºã匷å¶ããããšã§ãããä¿®æ£ããŸããïŒ"resolutions": { "**/react": "16.7.0-alpha.2", "**/react-dom": "16.7.0-alpha.2" },
芪ãŸãã¯åããã±ãŒãžã«è¿œå ããŸãããïŒ
äžèšã®åçã®ããã€ãã«åºã¥ããŠããããç§ã®ããã«åãããã®ã§ãïŒ
config/webpack.config.js
ã«ä»¥äžãè¿œå ããŸããexternals: { react: { root: 'React', commonjs2: 'react', commonjs: 'react', amd: 'react' }, 'react-dom': { root: 'ReactDOM', commonjs2: 'react-dom', commonjs: 'react-dom', amd: 'react-dom' } }
- ç·šéæžã¿
package.json
"devDependencies" : { ... "react": "^16.9.0", "react-dom": "^16.9.0", }
"peerDependencies": { "react": "^16.9.0", "react-dom": "^16.9.0" }
- ç·šéæžã¿
public/index.html
<head> <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script> ...
ãã®åŸãJestãnode_modulesïŒdevDependenciesããã€ã³ã¹ããŒã«ãããïŒããreactã³ããŒãããŒãããŠããéã«ãCDNããããŒããããReactã䜿çšããŠã©ã€ãã©ãªã§ããã¯ãå®è¡ããããšãã§ããŸããã
ã圹ã«ç«ãŠã°å¹žã
éæ³ã§ã¯ãããŸãããããã®ãããªè§£æ±ºçã«åŸããªããã°ãªããªãã®ã¯æ°ãããã§ãã ç§ã¯ãã®æ°æ¥éããã®ãããªãããã³ã°ã«é Œãããšãªãããã®ãã°ã解決ããããšããŠããŸããã
ããã¯ã䜿çšããã³ã³ããŒãã³ããå«ãåå©çšå¯èœãªã©ã€ãã©ãªã«åãçµãã§ããŸãã å
¬éããåã«ãå®éã®ãããžã§ã¯ãã§ãã¹ãããå¿
èŠããããŸãã ããã«å¯Ÿããå¯äžã®è§£æ±ºçã¯ã yarn|npm link
ã䜿çšããããšã§ãã ããŒã«ã¢ããã䜿çšããŠã©ã€ãã©ãªããã³ãã«ãããã³ãã«ã«reactã®ããŒãžã§ã³ãå«ãŸããŠããªãããšã確èªã§ããŸãã ã©ã€ãã©ãªãå©çšããã¢ããªããã³ãã«ïŒwebpackïŒãããšããã°/åé¡ãçºçããŸãã ããã¯ã裞ã®create-react-app
ïŒ$ã¢ããªãšnext.js
ã¢ããªã§ãçºçããŸãã ã©ã¡ãã®ãã¬ãŒã ã¯ãŒã¯ãããã¯ã°ã©ãŠã³ãã§webpackã䜿çšããŠããŸãã
誰ããæç¶å¯èœãªè§£æ±ºçãããèŠã€ããŸãããïŒ
npm|yarn link
ãå®å
šã«æšãŠãããšã§ãåé¡ã解決ããããšãã§ããŸããã 代ããã«ããããžã§ã¯ãæ§é ã«ãšããããªããã®çŽ æµãªã©ã€ãã©ãªã䜿çšããŸãã ãŸãããã³ãã©ãŒãšããŠwebpackã䜿ãç¶ããããšãã§ããããã_react_ãš_react-dom_ãexternal
ãŸãã¯alias
ãšããŠå®£èšããå¿
èŠã¯ãããŸããã æ®å¿µãªããããããžã§ã¯ãã«ããã€ãã®æ°ãããã£ã¬ã¯ããªãšããã¯ãã¡ã€ã«ãå°å
¥ãããŠããŸãããããŒã«ã«ã§ãããã«ã¯Dockerã³ã³ããå
ã§ãæ©èœããŸãã
å€åããã¯ãªã¹ãã«å°ã圹ç«ã€ã§ãããïŒ
@GabrielBBããããšããããã¯ç§ã®ããã«åããŠããŸã
@ dmart914ããããšãïŒ ãããŸã§ã®ãšãããç§ã®ããã«åãå¯äžã®åé¿ç:)
çŸåšãæå°éã®ç°¡åãªèšå®ã䜿çšãããšãReact Invalid HookCallèŠåã衚瀺ãããŸãã
ãã®æ©èœã³ã³ããŒãã³ãïŒ
__äŸåé¢ä¿__
[email protected]
[email protected]
[email protected]
[email protected]
ãããŠããã«ãããããã«webpack test.js -o main.js
ãå®è¡ããŸãã
ç§ã¯ãã®ãã¡ã€ã«ã次ã®ããšãæåŸ ããŠããŸãïŒ
React.useState
ãåŒã³åºãåã«ããããã¬ãŒãäžæåæ¢ããŸããtest
ãäœæããã³ãŒã«ããã¯updateTest
ãæŽæ°ããŸããReact.useEffect
ã³ãŒã«ããã¯ãå®è¡ããŸããç§ã¯äœãééã£ãããšãããŠããŸããããããšãäœãä»ã®ããšãèµ·ãã£ãŠããŸããïŒ
// test.js
import React, { createElement as el } from 'react';
import ReactDOM from 'react-dom';
function Item() {
debugger;
const [test, updateTest] = React.useState(false); // Throws React error.
React.useEffect(function checkTest() { // Throws React error.
console.log("checking test", test);
}, [test]);
React.useEffect(function tester() { // Throws React error.
if (!test) {
setTimeout(() => {
console.log("changing value for test");
updateTest(true);
}, 1000);
}
}, [test]);
return el('div', {style: {width: '300px', height: '300px', 'background-color': 'green', border: '1px solid red'}});
}
function render() {
let root = document.querySelector('#primary');
if (!root) {
root = document.createElement('div');
document.body.appendChild(root);
}
ReactDOM.render(Item(), root);
}
render();
å®éã«èŠçŽ ãäœæããã®ãå¿ããŸããã ReactDOM.render
åŒã³åºãã«å°éããåã«ãåæçã«Item()
$ãåŒã³åºããŠããŸãã el(Item)
ãæž¡ãå¿
èŠããããŸãã
æ¬åœã§ãïŒ æ å ±ããããšãããããŸãã
ä»ã®ã³ã¡ã³ãæçš¿è
ã®äžéšãšåæ§ã®ç¶æ³ã«ãããŸãã ç§ã¯webpackã䜿çšããŠããã€ãã®reactã³ã³ããŒãã³ãïŒäžéšã¯ããã¯ã䜿çšïŒããã©ã³ã¹ãã€ã«ãããã©ã³ã¹ãã€ã«ãããã³ãŒããlib
ãã©ã«ããŒã«é
眮ããŠããŸãã webpackæ§æã®externals
ãã£ãŒã«ãã«åå¿ããããã«è¿œå ããã®ã§ãã³ã³ããŒãã³ãã³ãŒãã«ãã³ãã«ãããŸããã ãããã®ã³ã³ããŒãã³ãã2ã€ã®å¥ã
ã®ãããžã§ã¯ãã§äœ¿çšããããšæããŸãããããã®ã³ã³ããŒãã³ãã¯ã³ã³ããŒãã³ãéã§å
±éã§ããããã1ã€ã®å Žæã§éçºããæŽæ°ãäž¡æ¹ã®ã¢ããªã«åæ ãããããšèããŠããŸãã
package.jsonã§common-components: file:../../common-components/lib
ã䜿çšããŠäŸåé¢ä¿ãè¿œå ãããšãã³ã³ããŒãã³ãã¯å®å
šã«èªã¿èŸŒãŸããŸãããwebpackãå®è¡ããŠãã³ã³ããŒãã³ãã¯ããã«ã¯æŽæ°ãããŸããã代ããã«ã yarn upgrade common-components
ãå®è¡ããŠãããéçºãµãŒããŒãåèµ·åããå¿
èŠããããŸãã
common-components: link:../../common-components/lib
ã䜿çšããŠäŸåé¢ä¿ãè¿œå ããå Žåãwebpackãåå®è¡ãããšãã¡ã€ã³ã¢ããªã®node_modules
å
ã®ãã¡ã€ã«ãæŽæ°ãããŸãïŒçŸåšã¯ã·ã³ããªãã¯ãªã³ã¯ã䜿çšããŠããããïŒããåå¿ããŸãã common-components/node_modules
ãã©ã«ããŒã®reactããŒãžã§ã³ã䜿çšããŠãããšæããŸãã
ãªã³ã¯ãããã³ã³ããŒãã³ããã¡ã€ã³ã¢ããªã®node_modulesãã©ã«ããŒã«ããreactã䜿çšããŠããããšã確èªããªãããã·ã³ããªãã¯ãªã³ã¯ïŒã€ãŸãcommon-components: link:../../common-components/lib
ïŒã䜿çšããæ¹æ³ã¯ãããŸããïŒ ãããã®ã³ã³ããŒãã³ããäž¡æ¹ã®ã¢ããªã§äœ¿çšããããšãèšç»ããŠãããããã©ã¡ããäžæ¹ã®åå¿ããã±ãŒãžãå
±éã³ã³ããŒãã³ãã©ã€ãã©ãªã«ãªã³ã¯ã§ããŸããããŸããäž¡æ¹ã®ã¡ã€ã³ã¢ããªã®åå¿ãå
±éã³ã³ããŒãã³ãããã±ãŒãžã§äœ¿çšãããŠãããã®ã«ãªã³ã¯ããããšã¯é¿ããããšæããŸãã webpackã®resolve
ãã£ãŒã«ãã«ã€ããŠã®ã³ã¡ã³ããããã€ãèŠãŸããããããã¯ææã«èãããŸãããæ©èœãããããšãã§ããŸããã ã©ããªå©ãã§ã倧æè¿ã§ãïŒ
ç·šéïŒç§ãã¡ã®ãŠãŒã¹ã±ãŒã¹ã«èå³ããã人ã®ããã«ããã«ãã¹ããããå€æŽããŠããã¡ã€ã«ãå¿ èŠãª2ã€ã®ãããžã§ã¯ãã«ã³ããŒããã ãã§ããã©ã³ã¹ãã€ã«ãå®å šã«åé¿ããããšã«ãªããŸããã
ç°¡åãªåé¿çã®1ã€ã¯ãããã±ãŒãžãå
¬éããã®ã§ã¯ãªãããããgithubã«ããã·ã¥ãã yarn add <git-url>
ã䜿çšããŠãããžã§ã¯ãã«ã€ã³ããŒãããããšã§ãã
ç°¡åãªåé¿çã®1ã€ã¯ãããã±ãŒãžãå ¬éããã®ã§ã¯ãªãããããgithubã«ããã·ã¥ãã
yarn add <git-url>
ã䜿çšããŠãããžã§ã¯ãã«ã€ã³ããŒãããããšã§ãã
ç§ãã¡ã®å€ããnpmãªã³ã¯ãšnpmããã±ãŒãžã®çžå¯Ÿãã¹ã䜿çšããçç±ã¯ãã³ãŒããæ©èœããããšãç¥ãåã«ãå€æŽãNPMãŸãã¯GitHubã«å ¬éããããšãªããã³ãŒããéçºããã³ãã¹ãããããã§ãã
https://github.com/facebook/react/issues/13972#issuecomment -447599035ã«é¢é£ãããã®åé¡ã«ééããŸãããããã¯ãWebpackãããããŒããµãŒããŒãåå ã§ããå¯èœæ§ããããšæããŸãã ç§ãã¡ã®ãŠãŒã¹ã±ãŒã¹ã¯ããã¹ããå®è¡ããåã«ãµãŒããŒãæ§ç¯ããããã«ããã°ã©ã ã§webpack()
ãå®è¡ããJestå
ã§å®è¡ãããçµ±åãã¹ãã§ããã ãã®åé¡ã¯ãESMãšCJSãã©ã®ããã«åæã«ååšã§ãããã«é¢ä¿ããŠãããšæããŸãã
ããšãã°ã次ã®äŸãèŠãŠãã ããã
// node express server, doing server-rendering
import React from 'react';
import { ApolloProvider } from '@apollo/react-common';
import { renderToStringWithData } from '@apollo/react-ssr';
res.send(await renderToStringWithData(<ApolloProvider><App /></ApolloProvider>)
ãããã¬ãŒã»ãã·ã§ã³äžã«ç§ãèŠãŠããã®ã¯ããã®ãã¡ã€ã«ã®ã³ã³ãã€ã«æžã¿ããŒãžã§ã³ã§Reactã®2ã€ã®ç°ãªãã€ã³ã¹ã¿ã³ã¹ãååŸã§ããããšã§ãã
_react: {Children, ...}
_react2: {default: {Children, ...}
ã©ã
_react
ã¯ããã®ãã¡ã€ã«ã®ESM import React from 'react'
ããã®ãã®ã§ã
_react2
ã¯CJSããã®ãã®var _react = _interopRequireDefault(require("react"));
ã¯node_modules/@apollo/react-ssr/lib/react-ssr.cjs.js
å
ãã
ããã«ãããReactãžã®åç
§ã2ã€ã®å ŽæïŒãµãŒããŒã¬ã³ããªã³ã°ãã¡ã€ã«ãš@apollo/react-ssr
ã®ãã³ãã«å
ïŒã§çãããªããªãããšã©ãŒãã¹ããŒããããšæããŸãã
ããã¯ãããããã¹ãå
ããã®webpack()
ã®ããã°ã©ã ã«ãã䜿çšãåå ã§ããããšããããããããã®ãã¹ãããšã³ãããŒãšã³ãã®ãã¹ãã«ãªãã¡ã¯ã¿ãªã³ã°ããŸããã åé¡ããã¹ãã³ãŒãã§ã®ã¿çºçããŠããå Žåã¯ããã¹ããéåžžã«è€éã«ãªãå¯èœæ§ããããšããæèšããããŸãã
ç§ã¯ãªããšã糞ã§ããã解決ããããšãã§ããŸããïŒ
myApp/node_modules/react
ããã³yarn link
ã«CD
次ã«ãã©ã€ãã©ãªã§yarn link react
ãå®è¡ããŸã
ããã§ãã©ã€ãã©ãªã¯ã¡ã€ã³ã¢ããªãšãŸã£ããåãreactããŒãžã§ã³ã䜿çšããŠããŸã
libã§reactããã¢äŸåé¢ä¿ãšããŠèšå®ããããšããŸããããlibããã«ããããŸããã§ãã
$ïŒ$ yarn
$ïŒ$ãåãåºãããåãæ¿ãããããã«ã create-react-app
ã䜿çšããŠãããä¿®æ£ããã«ã¯ã©ãããã°ããã§ããïŒ
npmãªã³ã¯ã䜿çšããŠãŸã£ããåãææ³ã䜿çšã§ããŸãã æåºããå¿ èŠã¯ãããŸããã
ç°ãªãããŒãžã§ã³ã®è€æ°ã®ãããžã§ã¯ãã§äœæ¥ããå Žåã react
ããªã³ã¯ããããšã¯æåã®ã¢ã€ãã¢ã§ã¯ãããŸããã
@wolesããªãã¯å®å šã«æ£ããã§ãããç§ã®å Žåãããã¯ç§ã®ãããã¯ãã®åé¡ã解決ããŸãã åå¿éçºè ãããè¯ã解決çãèãåºãããšãé¡ã£ãŠããŸã
ããã
ç§ã¯ãreactã«ãŒã¿ãŒå
ã§èª€ã£ãŠã³ã³ããŒãã³ãã誀ã£ãŠäœ¿çšããããšã«æ°ã¥ããæ°æéåŸã«ãã®ãã°ãä¿®æ£ããŸããã
ç§ã®ã¢ããªã¯æ©èœããŠããŸãããã1ã€ã®ã³ã³ããŒãã³ãã§useStateããŸã£ããè¿œå ã§ããŸããã§ããã ãã®çç±ã¯ãreact routers renderã¡ãœããå
ã®ã³ã³ããŒãã³ããã次ã®ãããªé«éé¢æ°ãªãã§äœ¿çšããããã§ãã
<Route exact path="/path" render={ ComponentCausingTheErrorMesage }/>
ã«åãæ¿ãã<Route exact path="/path" component={ ComponentNowWorkingAgain }/>
ç§ã®ããã«ãããä¿®æ£ããŸãã
ã¢ããªãšã¢ã¯ãã£ãã«äœæ¥ããŠããã¢ãžã¥ãŒã«ã®éã§npm link
ã䜿çšããŠããã®ã§ãã¢ããªã®react
ãšreact-dom
ãã¢ãžã¥ãŒã«ã«ãªã³ã¯ããŠããããªã³ã¯ããããšã§ä¿®æ£ããå¿
èŠããããŸãããã¢ããªãžã®ã¢ãžã¥ãŒã«ïŒ
ã¢ããªå ïŒ
cd node_modules/react && npm link
react-dom
ã«ã€ããŠãåãã¢ãžã¥ãŒã«å ïŒ
npm link react && npm link react-dom
npm link
ã¢ããªå ïŒ
npm link [module-name]
ããã誰ãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸã
ã¯ã©ã€ã¢ã³ãåŽã§åäœããããã¯ããããŸããããSSRã§ãã®ãšã©ãŒãçºçããŠããŸããã ç§ã®ååã¯ããµãŒããŒåŽã®webpackæ§æã§æ¬¡ã®ããã«ããã解決ããŸããã
const nodeExternals = require('webpack-node-externals');
const serverConfig = () => {
// lots of config, then:
externals: [
nodeExternals({
modulesFromFile: true,
}),
],
}
ç§ã¯ãªããšã糞ã§ããã解決ããããšãã§ããŸããïŒ
myApp/node_modules/react
ããã³yarn link
ã«CD次ã«ãã©ã€ãã©ãªã§
yarn link react
ãå®è¡ããŸãããã§ãã©ã€ãã©ãªã¯ã¡ã€ã³ã¢ããªãšãŸã£ããåãreactããŒãžã§ã³ã䜿çšããŠããŸã
libã§reactããã¢äŸåé¢ä¿ãšããŠèšå®ããããšããŸããããlibããã«ããããŸããã§ãã
ããã¯ã¡ããã©çŸããåäœããŸã
ãã®åé¡ãçºçããã®ã¯ãelectron-webpackãreactãmaterial-uiãåæã«äœ¿çšããŠããå Žåã§ãã Material-uiããäœãã䜿ãããšãããšããã®ãšã©ãŒãçºçããŸãïŒããšãã°ãã³ã³ããŒãã³ãã䜿çšããããšãããã
ãšã©ãŒã¯ãmaterial-uiã®ã³ã³ããŒãã³ãã§çºçããŸãã
ç§ã®å Žåã®è§£æ±ºçã¯ãããŸããïŒ
ããã«ã¡ã¯ZVER3Dãç§ã®ä»¥åã®ã³ã¡ã³ããèªãã§ã¿ãŠãã ããã ããã圹ã«ç«ãŠã°å¹žãïŒ
ã¢ããªãšã¢ã¯ãã£ãã«äœæ¥ããŠããã¢ãžã¥ãŒã«ã®éã§
npm link
ã䜿çšããŠããã®ã§ãã¢ããªã®react
ãšreact-dom
ãã¢ãžã¥ãŒã«ã«ãªã³ã¯ããŠããããªã³ã¯ããããšã§ä¿®æ£ããå¿ èŠããããŸãããã¢ããªãžã®ã¢ãžã¥ãŒã«ïŒã¢ããªå ïŒ
1. `cd node_modules/react && npm link` 2. same for `react-dom`
ã¢ãžã¥ãŒã«å ïŒ
1. `npm link react && npm link react-dom` 2. `npm link`
ã¢ããªå ïŒ
1. `npm link [module-name]`
ããã誰ãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸã
çãèµ€ã¡ããã¢ãŒãŒãããã¯ç§ããšãŠãå©ããŸããã ç°ãªãããŒãžã§ã³ã®reactã§ãããšããåé¡ãèæ ®ããŠããŸããã§ãã!! NPMã«å ¬éããããã«ããŒã«ã«ã§ã³ã³ããŒãã³ããæ§ç¯ããŠããŸãããnpmãªã³ã¯ã䜿çšããŠããŒã«ã«ã§ãã¹ãããããã®å¥ã®ãããžã§ã¯ãããããŸãã æããã«ïŒçŸåšïŒåœŒãã¯äž¡æ¹ãšãç°ãªãããŒãžã§ã³ã®reactã䜿çšããŠããŸãã D'ohïŒ
ããã«ã¡ã¯ZVER3Dãç§ã®ä»¥åã®ã³ã¡ã³ããèªãã§ã¿ãŠãã ããã ããã圹ã«ç«ãŠã°å¹žãïŒ
ç§ãæ£ããæ¹åã«åããŠãããŠããããšãã ãã1ã€ã®è§£æ±ºçã¯ã䜿çšããŠããuiã©ã€ãã©ãªããwhiteListedModulesãã«è¿œå ããããšã§ããã å¯äžã®åé¡ã¯ãã³ã³ãã€ã«ããããã«åå¿ãå¿
èŠãšãããã¹ãŠã®ã¢ãžã¥ãŒã«ã«å¯ŸããŠãããè¡ããªããã°ãªããªããšããããšã§ãã
ã ãããpackage.jsonã§ç§ã¯ãããæžããïŒ
"electronWebpack": {
"whiteListedModules": [
"@material-ui/core",
"@material-ui/icons"
]
}
ç§ã¯monorepoã¢ãããŒãã䜿çšããŠReactã¢ããªã±ãŒã·ã§ã³ãéçºããŠããŸãã ã¡ã€ã³ã¢ããªïŒ brush
ïŒãšreactã©ã€ãã©ãªã³ã³ããŒãã³ãïŒ react-gbajs
ïŒããããŸãã
ãã®ããã react-gbajs
ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããããšãããšãReactã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã«ã€ããŠãã®ãšã©ãŒãçºçããŸãã åãã³ãŒããã³ããŒããŠbrush
ã«è²Œãä»ããŠããåé¡ã¯ãããŸããã
ç§ã¯ãããä¿®æ£ããããã«å€ãã®ã¢ãããŒãã«åŸããŸãããããããã®ã©ããããã解決ããŸããã§ããïŒWebpackãYarnã®ã¯ãŒã¯ã¹ããŒã¹ãnpmãªã³ã¯ã®ãã«ããå€æŽ...ïŒ
ãããã°ããŠãReactã«2ã€ã®ã³ããŒããããã©ããã確èªããããšããŸããïŒReactã®ããã¥ã¡ã³ãã®console.log(window.React1 === window.React2)
ã䜿çšïŒãã true
ãšè©äŸ¡ãããŸãïŒ
ïŒç§ãçŸåšäœ¿çšããŠããéåžžã«æªãåé¿çã¯ãããã¯ãå°éå
·ãšããŠæž¡ãããšã§ãïŒ <GBAEmulator useEffect={useEffect} />
...ããããç§ã¯æ¬åœã«ãããããŒãžããããããŸããïŒ
誰ãããããä¿®æ£ããããã®ã¢ã€ãã¢ãæã£ãŠããŸããïŒ
ç§ã®ãããžã§ã¯ãã¯ãªãŒãã³ãœãŒã¹ã§ããããã®ãã©ã³ãã«ãã®æ°ããåå¿ã©ã€ãã©ãªã³ã³ããŒãã³ããè¿œå ããŠããŸãïŒ https ïŒ//github.com/macabeus/klo-gba.js/blob/ac18f4d42b122c333622f502947135c2de217ce2/react-gbajs/src/index.js#L251 -L274
ããã«ã¡ã¯ãã¿ããªã
ã«ã¹ã¿ã ã©ã€ãã©ãªïŒmyDepPackageïŒãäŸåé¢ä¿ãšããŠäœ¿çšããã¢ããªïŒmyAppïŒããããŸãã ã©ã¡ãããã«ãããŒã«ãšããŠwebpackã䜿çšããŠããããã¡ããåããšã©ãŒãçºçããŠããŸããã äžèšã®è§£æ±ºçã¯ã©ããç§ã«ã¯ããŸããããŸããã§ããã ãããè¡ã£ãããšã¯ãã«ã¹ã¿ã ã©ã€ãã©ãªïŒmyDepPackageïŒã®æçµãã³ãã«ã«reactãå«ããªãããã«webpackã匷å¶ããããšã§ããã ïŒmyDepPackageã®ïŒwebpackæ§æã«è¿œå ããå¿ èŠãããå¯äžã®æ§æè¡ã¯æ¬¡ã®ãšããã§ãã
externals: {
react: "react",
},
ãexternalsããªãã·ã§ã³ã®è©³çŽ°ã«ã€ããŠã¯ã https ïŒ//webpack.js.org/configuration/externals/#externalsãã芧ãã ããã
@tsevdosVeeeeryããããšãããããŸã!!! â€ïž
åã®ã³ã¡ã³ãã§èšã£ãç§ã®åé¡ã¯è§£æ±ºããŸããã
ç§ãã¡ã«ãšã£ãŠã®åé¡ã¯ãWordPressã®ã·ã§ãŒãã³ãŒãããããŒãžã«èªã¿èŸŒãŸããã©ã³ãã ãªIDã§divã«ããŠã³ããããåã蟌ã¿å¯èœãªReactã¢ããªãããããšã§ããã äžéšã®ããŒãžã«ã¯è€æ°ã®åã蟌ã¿ã¢ããªããããããã¯ã䜿ãå§ãããŸã§ã¯åé¡ãªãæ©èœããŠããŸããã
è€æ°ã®ã¢ããªãåã蟌ãŸããŠããããŒãžã§ã®ã¿æå¥ãèšãã®ã§ã解決çã¯WPã·ã§ãŒãã³ãŒããæŽæ°ããŠã¹ã¯ãªããããã«ãã§1åã ãããŒãããããšã§ããã
ã·ã³ãã«ã§æçœã«èãããŸãããç解ããã®ã¯é£ããã§ãïŒ ç¹ã«ãããã¯ãè¿œå ãããŸã§ã¯ãããããŸãæ©èœããŠããããã§ãã
èå³æ·±ãããšã«ãäžéšã®ããŒãžã«ã¯ãããã¯ã䜿çšããä»ã®ïŒããŸããŸãªïŒã¢ããªãåã蟌ãŸããŠãããReactã䜿çšããŠç¬èªã®ã¹ã¯ãªãã/ãã«ããããŒãããŸã...ããããããã§ãåé¡ãªãåäœããŸãïŒ åé¡ã¯ããŸã£ããåããã«ããè€æ°åããŒããããŠããŠãããã¯ã䜿çšããŠããå Žåã§ããã
ç§ã«ãšã£ãŠããŸããã£ãã®ã¯ããã®åé¡ã®ã¹ã¬ããããã®2ã€ã®ææ¡ã®çµã¿åããã§ããã
ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®webpackæ§æïŒ @apieceofbartã®ææ¡ïŒ
resolve: {
alias: {
react: resolve('./node_modules/react')
}
}
Dependencyã®webpackæ§æïŒ @tsevdosã®ææ¡ïŒ
externals:
react: 'react'
}
html-webpack-plugin
ã§ãã®åé¡ãçºçãã index.html
ãtemplate
ããHtmlWebpackPlugin
ã®èšå®ãšããŠäœ¿çšããŠããŸããã
// webpack.config.js
plugins: [
new HtmlWebpackPlugin({
template: "./public/index.html"
})
],
<!-- public/index.html -->
<html>
<head>
<title>React App</title>
</head>
<body>
<div id="root"></div>
<script src="main.js"></script>
</body>
</html>
ãã©ã°ã€ã³ã<div id="root"></div>
$ã®çŽåŸã«<script type="text/javascript" src="main.js"></script>
ã泚å
¥ããŠããããšã«æ°ã¥ããŸããã
ãããã£ãŠãéçºããŒã«ãéããŠHTMLãçæãããšã次ã®ããã«ãªããŸãã
<html>
<head>
<title>React App</title>
</head>
<body>
<div id="root"></div>
<script src="main.js"></script>
<script type="text/javascript" src="main.js"></script> <!-- injected from html-webpack-plugin -->
</body>
</html>
ç§ã«ãšã£ãŠãããã¯Invalid Hook Call Warning
ãåŒãèµ·ãããŠããŸããã
以äžã®ããã«<script src="main.js"></script>
ãåé€ããããšã§ãèŠåãåé€ããããšãã§ããŸããã
<!-- public/index.html -->
<html>
<head>
<title>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
ç§ã¯ããã解決çãæ¢ããŠãã誰ãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãïŒ
Reactã«äŸåããã©ã€ãã©ãªããããã®åé¡ãåŒãèµ·ããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ç§ã®å Žåã @emotion/core
ãš@emotion/styled
ã®ç°ãªãããŒãžã§ã³ã䜿çšããŠããŸããã
ããã
ã€ãžã§ã¯ãããã«èãããã解決çã¯ãwebpackãšã€ãªã¢ã¹æ§æãœãªã¥ãŒã·ã§ã³ãcustomize- craããã³react-app-rewiredã©ã€ãã©ãªãŒãšæ··åããããšã§ãã ãã®ããã«ã次ã®ã³ãã³ãã䜿çšããŠconfig-overrides.jsãã¡ã€ã«ãäœæããããšã«ãããåé¡ã解決ããããã«å¿ èŠãªWebpackæ§æã®ã¿ããªãŒããŒã©ã€ãã§ããŸãã
const { override, addWebpackAlias } = require('customize-cra');
const path = require('path');
module.exports = override(
addWebpackAlias({
react: path.resolve(path.join(__dirname, './node_modules/react')),
}),
);
Gatsbyãµã€ãã§ãã®åé¡ãçºçããŸãããnpminstallãå®è¡ããGatsbyã®ææ°ããŒãžã§ã³ã«æŽæ°ãããšããã¹ãŠä¿®æ£ãããŸããã
yarn or npm test
ãå®è¡ããŠããjestãã¹ãã§åé¡ãçºçãïŒç§ãããã§ãã£ãããã«ïŒã react-test-renderer
ã䜿çšããŠããå Žåã¯ã react-test-renderer
ãåãããŒãžã§ã³ã®react
ãšäžèŽããããšã確èªããŠãã ãã䜿çšããŠããŸãã
// Package.json
{
...
"react" : "16.8.3",
...
}
yarn add [email protected]
å®è¡ããŸã
ç§ã¯libãæã£ãŠããŠãlibãããžã§ã¯ããšmainãããžã§ã¯ãã®äž¡æ¹ã§react
ãšreact-dom
ã®ãã¹ãŠã®ããŒãžã§ã³ããã§ãã¯ããŸããã ãããã¯ãŸã£ããåãã§ãããæ©èœããŸããã§ããã
ãããã @ apieceofbartãœãªã¥ãŒã·ã§ã³ã¯ç§ã®ããã«åããŸããã
@apieceofbart ãããªãã¯ç§ã®æ¥ãæã£ã<3
ç§ã«ãšã£ãŠããŸããã£ãã®ã¯ããã®åé¡ã®ã¹ã¬ããããã®2ã€ã®ææ¡ã®çµã¿åããã§ããã
ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®webpackæ§æïŒ @apieceofbartã®ææ¡ïŒ
resolve: { alias: { react: resolve('./node_modules/react') } }
Dependencyã®webpackæ§æïŒ @tsevdosã®ææ¡ïŒ
externals: react: 'react' }
ãã£ã¡ãäžç·ã ãããæ©èœãããã«ã¯ããããã®ä¿®æ£ã®äž¡æ¹ãè¡ãå¿ èŠããããŸãã ç§ã®èª¬æã§ã¯ã2çªç®ã®æ§æã¯äŸåé¢ä¿ã«ãreactããšããååã®å€éšreactã䜿çšããããã«æ瀺ããæåã®æ§æã¯ãreactããšããååãã¡ã€ã³ãªããžããªã®ãnoââde_modules / reactããã©ã«ããŒã«ãã€ã³ãããŸãã ãããã£ãŠãreactããªããžãæ©èœãããã«ã¯äž¡æ¹ãå¿ èŠã§ãã
ããã§ããäžéšã®äººã«ãšã£ãŠã¯ãã®ãã¡ã®1ã€ã§ååãªããã§ãããç§ã«ã¯ããããããŸããã
ç§ã«ãšã£ãŠããŸããã£ãã®ã¯ããã®åé¡ã®ã¹ã¬ããããã®2ã€ã®ææ¡ã®çµã¿åããã§ããã
ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®webpackæ§æïŒ @apieceofbartã®ææ¡ïŒresolve: { alias: { react: resolve('./node_modules/react') } }
Dependencyã®webpackæ§æïŒ @tsevdosã®ææ¡ïŒ
externals: react: 'react' }
ãã£ã¡ãäžç·ã ãããæ©èœãããã«ã¯ããããã®ä¿®æ£ã®äž¡æ¹ãè¡ãå¿ èŠããããŸãã ç§ã®èª¬æã§ã¯ã2çªç®ã®æ§æã¯äŸåé¢ä¿ã«ãreactããšããååã®å€éšreactã䜿çšããããã«æ瀺ããæåã®æ§æã¯ãreactããšããååãã¡ã€ã³ãªããžããªã®ãnoââde_modules / reactããã©ã«ããŒã«ãã€ã³ãããŸãã ãããã£ãŠãreactããªããžãæ©èœãããã«ã¯äž¡æ¹ãå¿ èŠã§ãã
ããã§ããäžéšã®äººã«ãšã£ãŠã¯ãã®ãã¡ã®1ã€ã§ååãªããã§ãããç§ã«ã¯ããããããŸããã
2çªç®ã®é
ç®ã¯éèŠã§ãïŒ
ç¡èŠãããšããã«ãããã»ã¹ã§ãreactã¯å
éšäŸåé¢ä¿ã§ãããããäžç·ã«ãšã¯ã¹ããŒããããŸã
@apieceofbartã倧奜ãã§ã!!!! æºãå£ãã蹎ãåºãããšããŠãã
ãããã£ãŠããã€ã¯ããµãŒãã¹ã®åé¿çã¯ãŸã ãããŸããã å¥ã®reactãšã®ãã³ãã«ãåçã«å¿ èŠãšããreactã䜿çšããã«ãŒãã¢ããªã±ãŒã·ã§ã³ããããŸãã ç¬èªã®äŸåé¢ä¿ãæã€ç¬ç«ããããŒã ããããããããããreactã®å€éšããŒãžã§ã³ã䜿çšããããšã¯ã§ããŸããã åãå€éšããŒãžã§ã³ã䜿çšããããã«ããã·ã¥ãããšãã»ãšãã©ã®ãããžã§ã¯ããæããã«ã¯ã©ãã·ã¥ããåãããžã§ã¯ãããã®ããŒãžã§ã³ã«äŸåããããããã®ããŒãžã§ã³ãã¢ããã°ã¬ãŒãã§ããªããªããŸãã
äœãæ¡ã¯ïŒ
CRAããã®ã€ãžã§ã¯ããå¿ èŠãšããªããnpmãªã³ã¯ãšäžç·ã«reactããã¯ã䜿çšããããã®ãœãªã¥ãŒã·ã§ã³ã¯ãããŸããïŒ
@tschellenbach
cracoã䜿çšããŠãã€ãžã§ã¯ãããã«CRAæ§æãäžæžãã§ããŸãã
https://github.com/gsoft-inc/craco
@tsevdosã®ãããã§ãåé¡ã解決ããReactããã±ãŒãžã®äœææ¹æ³ã«é¢ãããã¥ãŒããªã¢ã«ãäœæããŸããïŒ https ïŒ//youtu.be/esyS87NfBOw
ãã®åé¡ãçºçããŸãããã代ããã«ããŒã»ã«ãã³ãã©ãŒã䜿çšããŠãããããwebpackãœãªã¥ãŒã·ã§ã³ãé©çšãããŸããã§ããã ã¡ã€ã³ã¢ããªã®package.jsonã§æ¬¡ã®ãããªãšã€ãªã¢ã¹ãæå®ããããšã§ä¿®æ£ã§ããŸãã
"alias": {
"react": "./node_modules/react",
"react-dom": "./node_modules/react-dom"
},
åããããžã§ã¯ãã®ç°ãªãããã±ãŒãžjsonã䜿çšããŠãElectronã¢ããªã§Reactã³ã³ããŒãã³ãïŒããã¯ã§èšè¿°ïŒã䜿çšããããšãããšåé¡ãçºçããŸãã ãã¡ã€ã«æ§é ã¯æ¬¡ã®ããã«ãªããŸãã
- javascript
- src
- ComponentIWantToUse.tsx
- package.json
- electron
- src
- IwantToUseItHere.tsx
- package.json
package.jsonã¯äž¡æ¹ãšãpackage.jsonã«reactãšreact-domãå«ãã§ããŸããããããã¯åãããŒãžã§ã³ã§ããã npm ls react
ãå®è¡ãããšãã«2ã€ã®reactã€ã³ã¹ããŒã«ã衚瀺ãããŸããã äœãæ¡ã¯ïŒ
ç·šéïŒ@ ewan-mã®ãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸããïŒ
ã ããç§ã¯å¥åŠãªäºä»¶ã«ééãããšæããŸãã æ®å¿µãªããããµãŒãããŒãã£ã®ã©ã€ãã©ãªã«ã¯ãæ©èœããŒã¹ã®ã³ã³ããŒãã³ããšã¯ã©ã¹ããŒã¹ã®ã³ã³ããŒãã³ããæ··åšããŠããŸãã ã³ãŒãããŒã¹ã®ã³ã³ããŒãã³ãã¯æ©èœããŠããŸãã ã©ã€ãã©ãªã®ã¯ã©ã¹ããŒã¹ã®ã³ã³ããŒãã³ãã¯ãã³ã³ããŒãã³ããåãšããŠã¬ã³ããªã³ã°ããã¬ã€ã¢ãŠããšããŠæ©èœããŸãã ãããããšã©ãŒïŒç¡å¹ãªããã¯åŒã³åºãããåŒãèµ·ãããŠãããšç§ã¯ä¿¡ããŠããŸãã ããã¯ã䜿çšããã«ã¯ããããã©ã®ããã«åé¿ããå¿ èŠããããŸããïŒç§ã®ãã®ãã¯ã©ã¹ã³ã³ããŒãã³ãã«å€æããå¿ èŠããããŸããïŒ
@GrandathePandaããã·ã³ã°ã¯ã©ã¹ãšæ©èœã³ã³ããŒãã³ãã¯éèŠã§ã¯ãããŸããã ã¯ã©ã¹ãããã¯ãåŒã³åºãæ±é¢æ°ãåŒã³åºãå Žåãããã«åé¡ã¯ãããŸããã ã§ããªãã®ã¯ãã¯ã©ã¹ããçŽæ¥ããã¯ãåŒã³åºãããšã ãã§ãã
ããŠã @ JeremyGrieshopã¯ãŸã 調æ»ãå¿ èŠã§ãããµãŒãããŒãã£ã®ã³ã³ããŒãã³ãã䜿çšããã«ã¬ã³ããªã³ã°ãããšãæ£åžžã«ã¬ã³ããªã³ã°ãããããããã®ã©ã€ãã©ãªãšã³ãŒãã®éã«ç«¶åãçºçããŸãã ç§ãæšæž¬ããªããã°ãªããªãã£ãå Žåã圌ãã¯ãããã圌ãã®ããã±ãŒãžã§ç°ãªãåå¿ããŒãžã§ã³ã䜿çšããŠããŸãã
ããŠã @ JeremyGrieshopã¯ãŸã 調æ»ãå¿ èŠã§ãããµãŒãããŒãã£ã®ã³ã³ããŒãã³ãã䜿çšããã«ã¬ã³ããªã³ã°ãããšãæ£åžžã«ã¬ã³ããªã³ã°ãããããããã®ã©ã€ãã©ãªãšã³ãŒãã®éã«ç«¶åãçºçããŸãã ç§ãæšæž¬ããªããã°ãªããªãã£ãå Žåã圌ãã¯ãããã圌ãã®ããã±ãŒãžã§ç°ãªãåå¿ããŒãžã§ã³ã䜿çšããŠããŸãã
ããã§ããã¢ããªããnpm ls react react-dom
ããã§ãã¯ããŠãè€æ°ã®ããŒãžã§ã³ããããã©ããã確èªããŠãã ããã ãµãŒãããŒãã£ã®ã©ã€ãã©ãªãç¹å®ã®ããŒãžã§ã³ã«äŸåããŠããå¯èœæ§ããããŸãã
@JeremyGrieshopãããã£ãŠãç§ã®ã¢ããªã±ãŒã·ã§ã³ã¯reactãšdomã«16.12.0ã䜿çšããŠããããµãŒãããŒãã£ïŒelastic search-uiïŒã¯reactãšdomã«16.8.0ã䜿çšããŠããããã§ãã ç§ãæ£ãããã°ãåé¡ã¯ã16.8.0ãµãŒãããŒãã£ã©ã€ãã©ãªã16.12.0ã§äœæãããã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããŠãããããåé¡ãçºçãããšããããšã§ãã ãããã¯ãŸããäžèšã®ã³ã¡ã³ãããã¹ãŠèªãã åŸããããããã«è€éã«ããå¯èœæ§ã®ããlernamonorepoã§ãã ãã®åé¡ã¯ãmaterialuiã§äœæãããuseStylesããã¯ã«èµ·å ããŸãããããã¯ãäžäœäºææ§ã®ããã«withStyles hocãæäŸããŸãããããŸã§ã®éãç§ã¯ãã®ã«ãŒãã«é²ããšæããŸãã äžèšã®webpackãããã±ãŒãžjsonãžã®ãã¹ãŠã®å€æŽã¯ãå®éã«ã¯ãéåžžã«å€ãã®ç°ãªãå®è£ ã®åé¡ã«çŽé¢ããŠããã¯ãæçããæ¹æ³ãç解ããŠããéãå€å žçãªããã¯ã䜿çšãããããå£ãããããã³ããšã€ãã®ããã«èŠããŸãã
@GrandathePanda IMHO ãããªãã®ãªãã·ã§ã³ã¯ãïŒ1ïŒãµãŒãããŒãã£ã«reactäŸåé¢ä¿ã16.12ã«æŽæ°ãããããããpeerDependencyãšããŠæã€ããšãäŸåé¢ä¿ãããé©åãã©ããã決å®ãããããšã§ãã ïŒ2ïŒã¢ããªã§16.8ã䜿çšããŠãåãlibããŒãžã§ã³ãå ±æããŸãã ïŒ3ïŒæ¬¡ã®åå¿ã®ã³ããŒãåé€ããŸãã
rimraf node_modules/search-ui/node_modules/react && rimraf node_modules/search-ui/node_modules/react-dom
äžèšã®ã³ãã³ãã¯ãpackage.jsonã®ãscriptsãéšåã®äžã«ãããprebuildããšãprestartãã«é 眮ã§ããŸãïŒããã¯ç§ãçŸåšè¡ã£ãŠããããšã§ãïŒãïŒ3ïŒã®æ¬ ç¹ã¯ããããã16.8ãã16.12ã®éã«å»æ¢ããããã®ã䜿çšããŠããŸãã
ããã«ã¡ã¯ãã¿ããªã
ã«ã¹ã¿ã ã©ã€ãã©ãªïŒmyDepPackageïŒãäŸåé¢ä¿ãšããŠäœ¿çšããã¢ããªïŒmyAppïŒããããŸãã ã©ã¡ãããã«ãããŒã«ãšããŠwebpackã䜿çšããŠããããã¡ããåããšã©ãŒãçºçããŠããŸããã äžèšã®è§£æ±ºçã¯ã©ããç§ã«ã¯ããŸããããŸããã§ããã ãããè¡ã£ãããšã¯ãã«ã¹ã¿ã ã©ã€ãã©ãªïŒmyDepPackageïŒã®æçµãã³ãã«ã«reactãå«ããªãããã«webpackã匷å¶ããããšã§ããã ïŒmyDepPackageã®ïŒwebpackæ§æã«è¿œå ããå¿ èŠãããå¯äžã®æ§æè¡ã¯æ¬¡ã®ãšããã§ãã
externals: { react: "react", },
ãexternalsããªãã·ã§ã³ã®è©³çŽ°ã«ã€ããŠã¯ã https ïŒ//webpack.js.org/configuration/externals/#externalsãã芧ãã ããã
@tsevdosç§ã¯ããªããæããŠããŸãã æ°æ¥éã®æ¿ããç ©ãããã«çµæ¢ç¬Šãæã€ã ãã§ãã ããããšãã
çããããã«ã¡ã¯ã
ã³ã³ããŒãã³ãã§ããã¯ã䜿çšããããšããŠããŸãããã®ã³ã³ããŒãã³ãã¯gatsby-browser.jsãããšã¯ã¹ããŒããããŸãã
çŸåšã®è¡åã¯äœã§ããïŒ
ãã®ãšã©ãŒãçºçããŸãïŒ
æªåŠçã®æåŠïŒãšã©ãŒïŒïŒç¡å¹ãªããã¯åŒã³åºãã ããã¯ã¯ãé¢æ°ã³ã³ããŒãã³ãã®æ¬äœã®å éšã§ã®ã¿åŒã³åºãããšãã§ããŸãã ããã¯ã次ã®ããããã®çç±ã§çºçããå¯èœæ§ããããŸãã
- Reactãšã¬ã³ãã©ãŒïŒReact DOMãªã©ïŒã®ããŒãžã§ã³ãäžèŽããŠããªãå¯èœæ§ããããŸã
- ããã¯ã®ã«ãŒã«ã«éåããŠããå¯èœæ§ããããŸã
- åãã¢ããªã«Reactã®ã³ããŒãè€æ°ããå¯èœæ§ããããŸã
ãã®åé¡ããããã°ããŠä¿®æ£ããæ¹æ³ã®ãã³ãã«ã€ããŠã¯ã httpsïŒ//fb.me/react-invalid-hook-callãåç §ããŠãã ããã
ããã¯ãµã³ãã«ã³ãŒãã§ãïŒ
import React from 'react';
import PropTypes from 'prop-types';
import { Provider } from 'react-redux';
import configureStore from './src/utils/configure-store';
import { useApiResources } from './src/hooks/use-api-resources';
const RootWrapper = ({ element }) => {
const resources = useApiResources();
const store = configureStore();
return <Provider store={store}>{element}</Provider>;
};
RootWrapper.propTypes = {
element: PropTypes.node.isRequired,
};
export default RootWrapper;
æåŸ ãããåäœã¯äœã§ããïŒ
ããã¯ã¯ãšã©ãŒãªãã§å®è¡ãããããæçšãªãšã©ãŒã¡ãã»ãŒãžãæäŸãããå¿ èŠããããŸãã
reactããã³react-domã®äŸåé¢ä¿ã®ããŒãžã§ã³ã¯16.12.0ã§ãã
@ leejh3224ã©ããããããšãïŒ äœæéãæ€çŽ¢ããåŸãç§ã¯ãã®çããèŠã€ããŸãããããã¯ç§ã®åé¡ã解決ããŸããã
HtmlWebpackPluginèšå®ãããå€æŽããŸãã
inject: true
ããinject: 'head'
ã«ãªããçž®å°ãããåå¿ãšã©ãŒã¯ãªããªããŸããã
ãããæ©èœãããããšããçµéšããã stackoverflowã®è³ªåãäœæããŸããã ãããããŸãæ©èœãããããšãã§ãã人ã«ãšã£ãŠããããèŠãŠãããã€ãã®ã¢ããã€ã¹ãæäŸããããšã¯å¯èœã§ããããïŒ
jqueryã¢ããªã±ãŒã·ã§ã³ãReactã«ç§»æ€ããŠããŸãã asJqueryPlugin
ãšåŒã°ããjQueryå
ã®Reactã³ã³ããŒãã³ããå
¬éãããŠãŒãã£ãªãã£ããããŸãã ãã¡ã€ã«ã¯æ¬¡ã®ãšããã§ãã
import React from 'react'
import ReactDOM from 'react-dom'
/**
* A way to render React components with props easily with jQuery
*
* ## Register the React Component
*
* In your React Component file, register the component with jQuery using `asJqueryPlugin`
* ```
* const Greeting = ({ person }) => <div>Hello {person}</div>
* asJqueryPlugin('Greeting', Greeting, { person: "Bob" })
* ```
*
* ## Rendering, Selecting and Updating Props with jQuery
*
* Select an element and render using the `react` function
* ```
* $('#greeting').react('Greeting', { person: 'Frank' })
* ```
*/
window.reactRegistry = window.reactRegistry || {}
// This is how React components register themselves as available within jQuery
export default function asJqueryPlugin(componentName, Component) {
window.reactRegistry[componentName] = { Component }
}
if (typeof window.$ !== 'undefined') {
;(function($) {
// Add the plugin function jQuery
$.fn.react = function renderReactIntoElements(componentName, props) {
this.each(function render() {
const entry = window.reactRegistry[componentName || $(this).data('react')]
if (!entry) throw Error(`${componentName} component is not registered.`)
ReactDOM.render(<entry.Component {...props} />, this)
})
return this
}
})(window.$)
}
ãã®ã¢ããªã«ã¯Webpackã«å€ãã®ãšã³ããªãã€ã³ãããããçŸåšçŽ3ã4åã®ã³ã³ããŒãã³ãããã®ææ³ã䜿çšããŠããŸãã ã³ã³ããŒãã³ããç°ãªããšã³ããªãã€ã³ããã³ãã«ã«ãã³ãã«ãããŠããå Žåãåé¡ãçºçããã®ã¯ãã®ãšãã ãšæããŸãã
ãããã£ãŠãWebpackã«2ã€ã®ãšã³ããªãã€ã³ããããå ŽåïŒ
entry: {
foo: './assets/js/foo',
bar: './assets/js/bar'
}
次ã«ããããã®åãã¡ã€ã«ã§ãå ¬éãããã³ã³ããŒãã³ããèšå®ããŸãïŒããããããã¯ã䜿çšïŒã
// foo.js
import React from 'react'
import asJqueryPlugin from '../utils/asJqueryPlugin'
const Foo = () => {
const ref = useRef()
return <div ref={ref}>Foo</div>
}
asJqueryPlugin('Foo', Foo)
// bar.js
... same stuff but with Bar component
åãããŒãžã«äž¡æ¹ã®ãšã³ããªãå«ããjqueryãã©ã°ã€ã³ãä»ããŠäž¡æ¹ã®ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããããšãããš...
<script src="/bundles/foo.js" />
<script src="/bundles/bar.js" />
<script>
$('#foo-container').react('Foo')
$('#bar-container').react('Bar')
</script>
...ãã®ããã¯ãšã©ãŒãçºçããŸãã
ãããäŒè©±ã«åœ¹ç«ã€ãã©ããã¯ããããŸããããå°ãªããšãïŒçãããããšã«ïŒæ£æ°ã®éçºè ãè€æ°ã®åå¿ã€ã³ã¹ã¿ã³ã¹ãããç¶æ³ã«é¥ãå¯èœæ§ã®ãããŠãŒã¹ã±ãŒã¹ã瀺ããŠããŸãã
ããã¯ç§ãå©ããŸãã-httpsïŒ //github.com/facebook/react/issues/13991#issuecomment-554928373
ãã ããäŸåé¢ä¿ããreact
ãšreact-dom
ãåé€ãããããããã¢ã®äŸåé¢ä¿ã«ç§»åããŠãããŒãã¢ãžã¥ãŒã«ãã¢ã³ã€ã³ã¹ããŒã«ããŠåã€ã³ã¹ããŒã«ããå¿
èŠããããŸããã
ããã
ç§ã¯äŒè©±ãšãŠã§ãäžã®å€ãã®æçš¿ãèªã¿ãŸããããããŠç§ã¯ãŸã åå¿ã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã®ãšã©ãŒã§ç«ã¡åŸçããŠããŸãã
ãã°ãåçŸããããã«ãã®ãªããžããªãããã·ã¥ããŸãïŒ https ïŒ//github.com/jeromelegrand/dooliz-lib
誰ããç§ãå©ããŠãããããšãé¡ã£ãŠããŸãã
ããããšãã
ç§ã¯ãã®åé¡ã«çŽé¢ããŠãããäžèšã®è§£æ±ºçã§ã¯ã©ãã«ãè¡ããŸããã
èŠããã«ãç§ã¯1ã€ã®reactããŒãžã§ã³ããå®è¡ããŠããªããšç¢ºä¿¡ããŠãããreact-bootstrapã䜿çšãããšãšã©ãŒãçºçããŸããããã¯ãä»ã®èª°ãåé¡ãæ±ããŠããªããããããã¯ãééã£ãŠäœ¿çšããŠããªãå¯èœæ§ããããŸãã
ãã®ãšã©ãŒã¯ãnode.jsããã¯ãšã³ãã§çºçããŸãã
__reactããŒãžã§ã³ã«ã€ããŠç¢ºèªããããš__
ã¯ãŒã¯ã¹ããŒã¹ã䜿çšããYarnã»ããã¢ããããããŸããã yarn list react
ãŸãã¯yarn list react-dom
ã«ã¯1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãã衚瀺ãããŸããã
äœãã€ã³ããŒãããããã確èªããããã«requirecacheãå°å·ããŸããïŒ
for(var key in require.cache) {
if(key.indexOf("react") !== -1 && key.indexOf("index") !== -1) {
console.log(key);
}
}
ç§ã¯react-bootstrapããäœããã¬ã³ããªã³ã°ããçŽåã«ãããå®è¡ããŸããããã«ãããç¡å¹ãªããã¯ãšã©ãŒãçºçãããã°ã«èšé²ãããŸãã
C:\web\resourceful\daCore\node_modules\react-dom\index.js
C:\web\resourceful\daCore\node_modules\react\index.js
C:\web\resourceful\daCore\node_modules\react-router-dom\index.js
C:\web\resourceful\daCore\node_modules\react-router-dom\node_modules\react-router\index.js
C:\web\resourceful\daCore\node_modules\react-is\index.js
C:\web\resourceful\daCore\node_modules\mini-create-react-context\dist\cjs\index.js
C:\web\resourceful\daCore\node_modules\react-router\index.js
C:\web\resourceful\daCore\node_modules\@fortawesome\react-fontawesome\index.js
C:\web\resourceful\daCore\node_modules\@tinymce\tinymce-react\lib\cjs\main\ts\index.js
ããã¯ãããŒããããReactããŒãžã§ã³ã1ã€ãããªãããšã確èªããŠããããã§ãã
æåŸã«ããããnode_modules / react-dom /index.jsã«è¿œå ããŸãã
console.log("React DOM daCore");
global['React1'] = require('react');
ãããŠãããnode_modules / react-router-dom / cjs /Form.jsã«
require('react-dom');
global['React2'] = require('react');
console.log('#TEST '+(global['React1'] === global['React2']? 'SAME' : 'NOT SAME'));
SAME
ãå°å·ããŸã
ãããä»ã«äœãã§ãããèããŠããŸããïŒ
ããã¯react-bootstrapãªããžããªã«ãæçš¿ããŸãã
ãããã£ãŠãReactã®ã€ã³ã¹ã¿ã³ã¹ã2ã€ããããšã¯ãããã§ã¯åé¡ã§ã¯ãªããšç¢ºä¿¡ããŠããŸãã åé¡ã¯ã2ã€ã®react_roots_ãããå Žåã ãšæããŸãã ããŒãžã®ããŸããŸãªéšåã«ReactDOM.render()
ãè€æ°ååŒã³åºããŠããŸããïŒ ãããããªããç§ã¯ãããåé¡ãåŒãèµ·ããå¯èœæ§ããããšæããŸãã ããã¯ã¯ç¹å®ã®ãã«ãŒããã«ãå±ãããè€æ°ããã2ã€ã®ãã³ãã«ãããã€ãã®å
±éã³ãŒããå
±æããŠããå Žåã¯å£ãããšæããŸãã ããã§æšæž¬ããŠããŸã...
...åé¡ã¯2ã€ã®react_roots_ãããå Žåã ãšæããŸãã ããŒãžã®ããŸããŸãªéšåã«
ReactDOM.render()
ãè€æ°ååŒã³åºããŠããŸããïŒ
ããããšã@timkindbergããã¯ç§ãæçµçã«ããã解決ããã®ãå©ããŸããã ReactDOMServer.renderToString
ã§æçµã¬ã³ããªã³ã°ãè¡ãåã«ã react-tree-walkerã䜿çšããŠåæã¬ã³ããªã³ã°ãå®è¡ããå¿
èŠãªããŒã¿ããã§ããããŠããããšã«æ°ä»ããŸããã
ãã®ããã±ãŒãžã®äœ¿çšããã°ããåé€ãããšãšã©ãŒãåé€ããã react-ssr-prepassã§åãããšãæ©èœããããã«ãªããŸãããããã¯ãreact-tree-walkerã®readmeããŒãžã§å®éã«æšå¥šãããŠããŸãã
ã€ãŸããå®éã«ã¯2åã®ReactDOM.render
åŒã³åºãã§ããã ä»ã®ãšããã react-ssr-prepassã䜿çšãããã®ã»ããã¢ããã¯ç§ã«ãšã£ãŠã¯ããŸããããSuspenseãreact-dom / serverã«å°éããããããã«åãæ¿ããããšãã§ããŸã
Gutenbergãããžã§ã¯ãã§react-compare-image
https://github.com/junkboy0315/react-compare-image
ã䜿çšããŠããŸãããä¿åé¢æ°ããReactCompareImage
ã³ã³ããŒãã³ããåé€ãããšãã¹ãŠãæ©èœããŸããããã®å¥åŠãªåé¡ãçºçããŸãã ç·šéæ©èœã¯å®å
šã«æ©èœããŸãããä¿åã¯æ©èœããŸããã
https://reactjs.org/warnings/invalid-hook-call-warning.htmlã確èªããŸãããããããã®åé¡ã¯çºçããŠããªããšæããŸãã
å®å šãªä¿åæ©èœãã¡ã€ã«ã¯æ¬¡ã®ãšããã§ãã
`` `import Inspector from" ./inspector ";
import {Fragment} from "react";
ãreact-compare-imageãããReactCompareImageãã€ã³ããŒãããŸãã
/ **
const save =ïŒ{classNameãattributes}ïŒ=> {
const {
paddingTop,
paddingRight,
paddingBottom,
paddingLeft,
marginTop,
marginRight,
marginBottom,
marginLeft,
border,
borderColor,
borderType,
background,
backgroundImage,
gradient,
dividerColor,
buttonColor,
direction,
beforeImage,
beforeLabel,
afterImage,
afterLabel,
} = attributes;
const style = {
"padding": `${paddingTop}px ${paddingRight}px ${paddingBottom}px ${paddingLeft}px`,
"margin": `${marginTop}px ${marginRight}px ${marginBottom}px ${marginLeft}px`,
"border": `${border}px ${borderType} ${borderColor}`,
"background": background
};
return(
<Fragment>
<ReactCompareImage
leftImage={beforeImage.url}
leftImageLabel={beforeLabel}
rightImage={afterImage.url}
rightImageLabel={afterLabel}
vertical={'vertical' === direction}
sliderLineColor={dividerColor}
/>
</Fragment>
);
};
ããã©ã«ãã®ä¿åããšã¯ã¹ããŒãããŸãã
`` `
ç§ããã®åé¡ã«çŽé¢ããŠããŸãã ç§ã¯SOã«èŠçŽãæçš¿ããŠããŸãïŒ https ïŒ//stackoverflow.com/questions/60331304/next-js-with-typescript-invalid-hook-call-hooks-can-only-be-called-inside-of-t
åçŸå¯èœãªæå°éã®äŸããããŸãïŒ https ïŒ//github.com/coler-j/shopify_playground
ç§ã®ã¡ã€ã³ã¢ããªã¯ãReactã䜿çšããå
±æã©ã€ãã©ãªãã€ã³ããŒãããŠããcreate-react
ã¢ããªïŒæåºãããŸããïŒã§ãã ç§ã¯ããã解決ããããšãã§ããŸããïŒ
webpackã®ä»£ããã«ããŒã«ã¢ããã䜿çšããŠã©ã€ãã©ãªãããã±ãŒãžåãã
äœããã®çç±ã§ç§ã¯ãŸã 解決ããŠããŸããããå€éšã䜿çšããŠãã©ã€ãã©ãªãã³ãã«ããReactã¯åé€ãããŸããã§ããã
rollup-config.js
export default [
{
input: 'src/index.js',
output: {
file: pkg.main,
format: 'cjs',
sourcemap: true,
},
plugins: [external(), babel(), resolve(), commonjs(), svgr()],
},
{
input: 'src/index.js',
output: {
file: pkg.module,
format: 'es',
sourcemap: true,
},
plugins: [
alias({
entries: [{ find: '<strong i="12">@components</strong>', replacement: 'src/components' }],
}),
external(),
babel(),
svgr(),
],
},
]
cracoãã€ã³ã¹ããŒã«ããããã䜿çšããŠã¡ã€ã³ã¢ããªã®webpackãå€æŽãã
craco.config.js
const path = require('path')
module.exports = {
webpack: {
alias: {
react: path.resolve(__dirname, './node_modules/react'),
},
},
}
ç§ãã¯ã©ã³ã«åããŠããã@arminyahyaã«æè¬ããŸãã
cdnããreactãããŒãããŠãããšãã«ããã¯ã䜿çšããããšããŠããŸãã ãã®äŸïŒããã¯htmlããŒãžå
šäœã§ãïŒã§ã¯ã Example()
ãåŒã³åºããããšãã«$ Hooks can only be called inside of the body of a function component
ãšã©ãŒãçºçããŸãã ReactDOMãå«ããŠãã¹ãŠãåé€ããã®ã§ãReactã®è€æ°ã®ã³ããŒãæã€ããšãã§ãããšã¯æ³åããããã§ãã ããã¯äžå¯èœã§ããïŒ
<!DOCTYPE html>
<html>
<head>
<script crossorigin src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
</body>
<script type="text/babel">
function Example() {
let [count, setCount] = React.useState(0);
return ( <h1>Hello</h1> );
};
Example();
</script>
</body>
</html>
@samkaminããã¯ããªãããŒãåå¿ã®æ ¹ãæã£ãŠããããã§ãã ã¢ããªã±ãŒã·ã§ã³ãã¬ã³ããªã³ã°ããå¿ èŠããããŸãã ãã ããããã¯ãããã¯ããªã¢ã¯ã·ã§ã³ã«ãŒãã«äŸåããŠããïŒãããŠããã«çµåãããŠããïŒããšã瀺ãè¯ã確èªã§ãã
<html>
<head>
<script crossorigin src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/[email protected]/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
</body>
<div id="root"></div>
<script type="text/babel">
function Example() {
let [count, setCount] = React.useState(0);
return ( <h1>Hello</h1> );
};
ReactDOM.render(<Example />, document.getElementById('root'))
</script>
</body>
</html>
ããããšãïŒ å®éã«ã¯ãreactã«ãŒãã®æ¬ åŠã§ã¯ãããŸããã§ãã-ãšã©ãŒãå¯èœãªéãåçŽåããéçšã§ãããåé€ããŸãã-ããããåãããã«æããªããšã§ãïŒ <Example />
ã®ä»£ããã«ã$ïŒ Example()
ãšæžããã ãã§ã
ç§ã«ã¯äœãããŸããããªãããã§ãã ä»ã®ãããžã§ã¯ãã§å ±æããã³äœ¿çšããããã®ã³ã³ããŒãã³ããäœæããŠããŸãããå¥ã®ãããžã§ã¯ãããããŒã«ã«ã§ãã¹ããããšæ©èœããŸããã ç§ã¯react16.13.0ã§ããã¯ã䜿çšããŠããŸãã
webpack.config.js
module.exports = {
entry: ENTRY,
output: {
library: LIBRARY_NAME,
path: path.resolve(__dirname, OUTPUT_DIR),
filename: OUTPUT_FILENAME,
libraryTarget: 'commonjs2',
},
module: {
rules: [
{
test: /\.(js|tsx)$/,
exclude: /node_modules/,
loader: 'babel-loader',
},
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: 'ts-loader',
},
],
},
resolve: {
alias: {
'<strong i="7">@src</strong>': path.resolve(__dirname, './src'),
'<strong i="8">@components</strong>': path.resolve(__dirname, './src/components'),
'<strong i="9">@core</strong>': path.resolve(__dirname, './src/core'),
react: path.resolve(__dirname, './node_modules/react'),
'react-dom': path.resolve(__dirname, './node_modules/react-dom'),
},
extensions: ['.js', '.json', '.tsx', '.ts'],
},
externals: {
react: 'react',
},
target: 'node',
plugins: [
new HtmlWebPackPlugin({
template: './tests/index.html',
filename: 'index.html',
}),
]}
å©èšããããŸããïŒ ç§ã¯å€ãè°è«ã®ãã¹ãŠã®ææ¡ããã¹ãããŸããã
ããããšãïŒ ïŒãã€ãªïŒ
ç§ã¯Settings.jsã次ã®ããã«å®£èšããŸããïŒ
import React, {useState} from 'react';
import {
View,
Text,
Switch
} from 'react-native';
export function Settings(props) {
const [rememberPin, setRememberPin] = useState(false);
let {changeView, header} = props;
const toggleRememberPin = (value) => {
setRememberPin(value);
};
return (
<View>
<Text>Remember PIN:</Text>
<Switch
onValueChange={toggleRememberPin}
value={rememberPin}
ios_backgroundColor="#aeaeae"
/>
</View>
);
}
export default {Settings};
次ã®ããã«App.jsã«ã€ã³ããŒãããŠäœ¿çšããŸãã
import React, {Component} from 'react';
import {
SafeAreaView,
StyleSheet,
View,
Text,
TouchableOpacity,
Dimensions,
ScrollView,
Switch
} from 'react-native';
import Colors from './src/assets/Colors';
import {Settings} from './src/components/Settings';
...
export default class App extends Component {
constructor(props) {
super(props);
this.state = {viewsStack: this.viewsStack};
}
viewsStack = {
SplashScreen: false,
BindingInstructions: false,
PinPad: false,
Qr: false,
Dashboard: false,
Authorizations: false,
Settings: true,
Browsers: false,
TransmitSDK: false,
OTP: false,
};
changeView = (newView) => {
let {viewsStack} = this.state;
for (let key of Object.keys(viewsStack)) {
viewsStack[key] = false;
}
viewsStack[newView] = true;
this.setState(viewsStack);
};
render() {
let {viewsStack} = this.state;
return (
<SafeAreaView style={styles.safeAreaView}>
{viewsStack.SplashScreen && (splashScreen())}
{viewsStack.BindingInstructions && (bindingInstructions({changeView: this.changeView}))}
{viewsStack.PinPad && (pinPad({message: 'Inserisci un nuovo PIN', changeView: this.changeView}))}
{viewsStack.Qr && (qr({header: 'QR Binding', message: 'Scansiona il QR dalla tua dashboard\noppure\ninserisci il codice manualmente.', changeView: this.changeView}))}
{viewsStack.Dashboard && (dashboard({header: 'Profilo Utente', changeView: this.changeView}))}
{viewsStack.Authorizations && (authorizations({header: 'Autorizzazioni', authorizations: [1, 2, 3, 4, 5, 6], changeView: this.changeView}))}
{viewsStack.Settings && (Settings({header: 'Impostazioni', changeView: this.changeView}))}
</SafeAreaView>
);
}
};
...
ããããç§ã¯åŸãŸãïŒ
ç§ã¯äœ¿ã£ãŠããïŒ
"react": "16.9.0",
"react-native": "0.61.5"
ã©ãããã®ïŒ
Settings
ã³ã³ããŒãã³ããé¢æ°ã³ã³ããŒãã³ããšããŠã§ã¯ãªããé¢æ°ãšããŠåŒã³åºããŠããŸãã
<Settings header='Impostazioni' changeView={this.changeView} />
ããã¯ã¯ãã¬ãŒã³é¢æ°å ã§ã¯èš±å¯ãããŠããŸãããé¢æ°ã³ã³ããŒãã³ãå ã§ã®ã¿èš±å¯ãããŠããããããåŒã³åºãæ¹æ³ã¯ãReactãã ãŸããŠãã³ã³ããŒãã³ããå®éã«ã¯éåžžã®é¢æ°ã§ãããšèããããŸãã
ãã¶ããããã¯èª°ãã®é çã®çš®ãå
ããã§ããããreact-router-domã䜿çšããŠããå Žåããã®ããã«ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ã§æž¡ããšïŒé©åãªæ¹æ³ã§ã¯ãããŸããïŒã Invalid Hook Call Warning
ãåŸãããŸãã
<Route path="/:cuid/:title" render={PostArticle} />
ç§ãã©ãã§ééã£ãŠããããç¥ãããã«30åããããŸãã
ããã¯èª°ããå©ãããããããŸãã-react-router-domã䜿çšããåŸã«ãã®ãã°ãçºçããå Žåã¯ãã«ãŒããã©ã®ããã«å®çŸ©ãããã確èªããŠãã ããã ããšãã°ã <Route path={'/upgrade/:plan'} exact children={Upgrade} />
ãå®è¡ããŠããéã¯<Route path={'/upgrade/:plan'} exact children={<Upgrade />} />
ã§ããå¿
èŠããããŸã
ã€ã³ã¯ãŸãã¯ãã¹ãã«ã䜿çšããŠCLIãæ§ç¯ããŠããå Žåãããã¯ç¹ã«åä»ã§ãïŒhttps://github.com/vadimdemedes/passel/issues/2ãåç §ïŒã ãã¹ãŠã®ãŠãŒã¶ãŒã«Reactã®ã€ã³ã¹ããŒã«ãäŸé Œããããšããç¹å®ã®ããŒãžã§ã³/ç¯å²ã®Reactã䜿çšããããã«åŒ·å¶ããããšãã§ããªããããpeerDepã«ããããšã¯ã§ããŸããã
ç§ã®ããŒã ã¯Yarnã䜿çšããŠãããã¢ããªã§ã¯ãªããã¹ãã§ã®ã¿Invalid hook call
ãšã©ãŒãçºçããŠããŸããã åé¡ã¯ã react-test-renderer
ãreact
ããã³react-dom
ãããäœãããŒãžã§ã³ã«è§£æ±ºãããŠããããã package.json
resolutions
ãè¿œå ããããšã§ãã
"devDependencies": {
...
"react": "16.12.0",
"react-dom": "16.12.0",
...
},
"resolutions": {
"react-test-renderer": "16.12.0"
}
ãµããã£ã¬ã¯ããªã§Gatsbyã䜿çšããŠãã人ã«ãšã£ãŠãããã¯å¯èœãªè§£æ±ºçã§ãã
gatsby-node.js
ïŒ
const path = require('path')
const fromRoot = name => path.resolve(__dirname + '/../node_modules/' + name)
exports.onCreateWebpackConfig = ({ actions }) => actions.setWebpackConfig({
resolve: {
alias: {
'react': fromRoot('react'),
'react-dom': fromRoot('react-dom'),
},
},
})
npm link
ã³ãã³ããå®è¡ãããšãã«åãåé¡ãçºçããŸããåé¡ããããŸã
次ã«ãreactãæäŸããå ¬åŒãœãªã¥ãŒã·ã§ã³ã䜿çšããŠãã®åé¡ã解決ããŸãã
ãã®åé¡ã¯ãnpmãªã³ã¯ãŸãã¯åçã®ãã®ã䜿çšããå Žåã«ãçºçããå¯èœæ§ããããŸãã ãã®å Žåããã³ãã©ãŒã¯2ã€ã®ReactããèŠããå¯èœæ§ããããŸãã1ã€ã¯ã¢ããªã±ãŒã·ã§ã³ãã©ã«ããŒã«ããããã1ã€ã¯ã©ã€ãã©ãªãã©ã«ããŒã«ãããŸãã myappãšmylibãå åŒãã©ã«ããŒã§ãããšä»®å®ãããšãèããããä¿®æ£ã®1ã€ã¯ãmylibããnpm link ../myapp/node_modules/reactãå®è¡ããããšã§ãã ããã«ãããã©ã€ãã©ãªã§ã¢ããªã±ãŒã·ã§ã³ã®Reactã³ããŒã䜿çšã§ããããã«ãªããŸãã
AãBã玹ä»ããå¿ èŠãããå ŽåïŒAãšBã¯å åŒã§ãïŒ
npm link ./../A/node_modules/react
npm link
npm link B
ãããã«ã¯ã§ãã
ãããã®çãããã£ãŠãããªããšã©ãŒãçºçããã®ãããããŸããã äŸåé¢ä¿ã©ã€ãã©ãªãã¡ã€ã³ã¢ããªã«ãªã³ã¯ãããšã©ãŒãçºçããåŸãreact-docsã«åŸããäŸåé¢ä¿ã©ã€ãã©ãªã®ããŒãžã§ã³ã®reactãã¢ããªã®reactã«ãªã³ã¯ããŸããïŒ npm link <>/webapp/node_modules/react
ãå®è¡ããŠããŸãïŒreact-ã§ãããå®è¡ããŸããïŒã React1ãšReact2ãåããã©ããããã¹ãããããã«ãã°ã«èšé²ãããšãã true
ããã°ã«èšé²ããããããéè€ããŒãžã§ã³ã®Reactã䜿çšãããåãããŒãžã§ã³ã®Reactã䜿çšããé¢æ°ã³ã³ããŒãã³ãã䜿çšããŠããŸããã ããããã£ãŠããã¹ããã°ã«Reactã®éè€ããŒãžã§ã³ããªãããšã瀺ãããŠããŠããããã¯ãšã©ãŒãçºçããŠããŸããã
ããããäžèšã®ããã«ãã®ãœãªã¥ãŒã·ã§ã³ãè©Šããšããã®ç¹å®ã®ãã°ãä¿®æ£ãããŸããã
alias: {
react: path.resolve('./node_modules/react')
}
ã ããç§ã¯éæ¹ã«æ®ããŠããŸãã
ã ããç§ã¯éæ¹ã«æ®ããŠããŸãã
@orpheusåãããŒãžã«è€æ°ã®reactã«ãŒããã¬ã³ããªã³ã°ããŸããïŒ å¥åãåãããŒãžã«è€æ°ã®ReactDOM.render
åŒã³åºãããããŸããïŒ
åãããŒãžã«è€æ°ã®reactã«ãŒããã¬ã³ããªã³ã°ããŸããïŒ å¥åãåãããŒãžã«è€æ°ã®
ReactDOM.render
åŒã³åºãããããŸããïŒ
@timkindberg
ç§ã¯ããŸããã app
ReactDOM.render
ãããããªã³ã¯ããŠããlib
ã¢ãžã¥ãŒã«ã¯ã³ã³ããŒãã³ãã©ã€ãã©ãªã§ããã ReactDOM.render
ã䜿çšããŠããŸããããŸã£ããã
ç·šéïŒç§ã¯æ¬¡ã®ãããªããšãããŠããŸãïŒ
import React from 'react'
import ReactDOM from 'react-dom'
import Root from './App/Root'
ReactDOM.render(
<Root />,
document.getElementById('root')
)
ããã§ã <Root />
ã¯æ¬¡ã®ããã«ã¬ã³ããªã³ã°ãããŸã
const Root = () => {
return <Provider store={store}>
<PermissionsProvider>
<Suspense fallback={null}>
<Router history={history}>
<Routes store={store} />
</Router>
</Suspense>
</PermissionsProvider>
</Provider>
}
PermissionsProvider
ã¯ããªã³ã¯ããlib
ã¢ãžã¥ãŒã«ããã€ã³ããŒãããReactã³ã³ããŒãã³ãã§ãããã¢ããªã倱æãããããã¯ã䜿çšããŸãã ç¶æ
ãšã³ã³ããã¹ããäœæãããã®åãã¬ã³ããªã³ã°ããŸãã
ããã«ã¡ã¯ãç§ã¯åå¿ããã¯ä»ãã®é»åã䜿çšããŠããŸãã ç§ãèªåã®ããã¯ãæžããªããããã¯ããŸããããŸãã ãããã react-use
ã swr
ãªã©ãnode_moduleã®ä»ã®ããã±ãŒãžã®ããã¯ã䜿çšãããšãšã©ãŒãçºçããŸãã
ããã±ãŒãžãããŒã«ã«ãã¡ã€ã«ã«ã³ããŒããå¿ èŠããããŸãã
誰ãããã®åé¡ã«ééããŸããïŒ
ããã«ãããããžã§ã¯ãã®äŸïŒ
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
ã³ã¢ã³ãŒãïŒ
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsx
ãŸããreactãšreact-domã®éè€ã³ããŒãåé€ããåŸãããã®åé¡ãçºçããŠããŸãã åçŸããããã®è¶ ç°¡åãªãã¹ããããžã§ã¯ããäœæããŸããã
$ tree -I node_modules
.
|-- test-app
| |-- dist
| | |-- index.html
| | `-- main.js
| |-- package-lock.json
| |-- package.json
| |-- src
| | |-- index.html
| | `-- index.js
| `-- webpack.config.js
`-- test-lib
|-- dist
| `-- main.js
|-- package-lock.json
|-- package.json
|-- src
| `-- index.js
`-- webpack.config.js
çŸåšãwebpackãšã€ãªã¢ã¹ã¡ãœããã䜿çšããŠããŸããã npm link
ã¡ãœãããè©ŠããŸããããã©ã¡ããæ©èœããŸããã
ç§ããã®åé¡ã«ééããŸããã ExpressJS + Pugã䜿çšããŠãã¥ãŒãã¬ã³ããªã³ã°ããŠããŸãã次ã«ãã³ã³ããŒãã³ãã®ãµãŒããŒåŽãšã¯ã©ã€ã¢ã³ãåŽãã¬ã³ããªã³ã°ã§ããã¬ã³ãã©ãŒïŒReactRailsãšåæ§ïŒãäœæããŸããã
æ£ããã£ãŠããã®ã§ããããå¥ã®ããã±ãŒãžã«æœåºããããšããŸãããããã®åé¡ã«ééããŸããã
ãããä¿®æ£ããã«ã¯ã resolve
ããŒã®äžã«è¿œå ããå¿
èŠããããŸããã
alias: {
react: path.resolve("./node_modules/react"),
},
ããã§ãwebpackãæ£åžžã«å®è¡ããŠãããšãã«æåŸ ã©ããã«æ©èœããŸãããDockerããªã¥ãŒã ã§ãåé¡ã解決ããŸããã Dockerã䜿çšããã«ã¯æ°ããããŠå¯ŸåŠã§ããªããããåŸã§åæ€èšããŸãã
ç·šéïŒç§ã¯ããŸãã«ãæ©ã話ããŸããã Reactã¬ã³ããªã³ã°ã§ã¯æ£åžžã«æ©èœããŸããããã€ãã¬ãŒãã§ã¯æ©èœããŸããã
ããã«ã¡ã¯ãç§ã¯åå¿ããã¯ä»ãã®é»åã䜿çšããŠããŸãã ç§ãèªåã®ããã¯ãæžããªããããã¯ããŸããããŸãã ãããã
react-use
ãswr
ãªã©ãnode_moduleã®ä»ã®ããã±ãŒãžã®ããã¯ã䜿çšãããšãšã©ãŒãçºçããŸããããã±ãŒãžãããŒã«ã«ãã¡ã€ã«ã«ã³ããŒããå¿ èŠããããŸãã
誰ãããã®åé¡ã«ééããŸããïŒ
ããã«ãããããžã§ã¯ãã®äŸïŒ
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-errorã³ã¢ã³ãŒãïŒ
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsx
ããã«ã¡ã¯ã ç§ãåãåé¡ãæ±ããŠããŸããã ãã¹ãŠã®ã¢ãžã¥ãŒã«ãwebpackã®å€éšãšããŠããŒã¯ããelectron-webpackã䜿çšããŠããŸãã ããã€ãã®ããŒãã³ãŒããããäŸå€ãé€ããŠ-reactãreact-domãªã©ã
ç§ã«ãšã£ãŠãããã¯ç§ã®ã³ãŒãããããŒããããreactããã®ãããªã¢ãžã¥ãŒã«ããããŒããããreactãšã¯ç°ãªãããšãæå³ããŸããã
ãããã®ã¢ãžã¥ãŒã«ããã¯ã€ããªã¹ãã«è¿œå ãããšåœ¹ç«ã€ããã§ãïŒãŸã ä»ã«äœãå£ããŠããªããã©ããã¯ããããŸãã:)
@huhleããããšããããã¯åäœããŸãïŒ ãã¶ããelectron-webpackã«é£ã³èŸŒãå¿ èŠããããŸãã
ç§ã¯ãããèªåã§ããŸãåããããšãã§ããŸããã LernaãšYarnã®ã¯ãŒã¯ã¹ããŒã¹ã«é¢ããŠã¯ãããã¯åªãããœãªã¥ãŒã·ã§ã³ã®1ã€ã ãšæããŸãããããããäžéšã®èŠçŽ ãå¥ã®ãœãªã¥ãŒã·ã§ã³ã«äœ¿çšã§ããå¯èœæ§ããããŸãã
ããã¯ãã¹ãŠãç§ãã€ã³ããŒãããŠããpackage.json
ãããžã§ã¯ãã®æ§æã«èŠçŽãããŠããããã§ãã ãããã®ã»ã¯ã·ã§ã³ãå«ããå¿
èŠããããŸããã
"peerDependencies": {
"react": "^16.13.1",
"react-dom": "^16.13.1"
},
"workspaces": {
"nohoist": [
"react", "react-dom"
]
}
ãããè¡ã£ãåŸãç§ã¯ãããžã§ã¯ããåæ§ç¯ããå¿ èŠããããç§ã¯çšŒåããŠããŸããã ãããããã¢ã®äŸåé¢ä¿ãšããŠãªã¹ããããšãæ¶è²»ãããããžã§ã¯ãã§ããããã€ã³ã¹ããŒã«ããå¿ èŠãããããã§ãã ãŸããäŸåé¢ä¿ã«ãªã¹ããããŠããªããããã€ã³ããŒãããããšããŠããããã±ãŒãžã§äœ¿çšã§ããªãã¯ãã§ãããäœããã®çç±ã§ãæã¡äžããªãããã«æ瀺ããªãéãã䜿çšå¯èœãªãŸãŸã§ãæ°ããReactã€ã³ã¹ã¿ã³ã¹ãå ¥ããŸãããšã©ãŒãçºçããŸãã
幞éãïŒ
åçŽãªãã§ãŒãã€ã³å¹æãåŸãããã«react-springã䜿çšããããšããŠããŸãã äœãæ©èœããŠããªãããã§ãã
`import Reactã{useStateãuseEffect} from'react ';
import {animatedãuseTransition} from'react-spring ';
const TextContent =ïŒpropsïŒ=> {
const [items] = useState([
{ id: '0', title: 'Text1' },
{ id: '1', title: 'Text2' },
{ id: '2', title: 'Text1' }
])
const [index, setIndex] = useState(0);
const transitions = useTransition(items[index], index => index.id,
{
from: { opacity: 0 },
enter: { opacity: 1 },
leave: { opacity: 0 },
config: { tension: 220, friction: 120 }
}
)
useEffect(() => {
const interval = setInterval(() => {
setIndex((state) => (state + 1) % items.length);
}, 4000)
return () => clearInterval(interval);
}, []);
return (
<div>
{
transitions.map(({ item, props, key }) => (
<animated.div
key={key}
style={{ ...props, position: 'absolute' }}
>
<p>{item.title}</p>
</animated.div>
))
}
</div>
)
}
ããã©ã«ãã®TextContentããšã¯ã¹ããŒãããŸã; `
Reactã®ã€ã³ã¹ã¿ã³ã¹ãè€æ°ãããã©ããã確èªããŠã¿ãŸããã Npm ls-ingã«ãããšãreactãšreact-domã®ããŒãžã§ã³ã¯1ã€ã ãã§ãã©ã¡ãã16.13.1ã§ãã
ããã«ã¡ã¯ãç§ã¯åå¿ããã¯ä»ãã®é»åã䜿çšããŠããŸãã ç§ãèªåã®ããã¯ãæžããªããããã¯ããŸããããŸãã ãããã
react-use
ãswr
ãªã©ãnode_moduleã®ä»ã®ããã±ãŒãžã®ããã¯ã䜿çšãããšãšã©ãŒãçºçããŸãã
ããã±ãŒãžãããŒã«ã«ãã¡ã€ã«ã«ã³ããŒããå¿ èŠããããŸãã
誰ãããã®åé¡ã«ééããŸããïŒ
ããã«ãããããžã§ã¯ãã®äŸïŒ
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
ã³ã¢ã³ãŒãïŒ
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsxããã«ã¡ã¯ã ç§ãåãåé¡ãæ±ããŠããŸããã ãã¹ãŠã®ã¢ãžã¥ãŒã«ãwebpackã®å€éšãšããŠããŒã¯ããelectron-webpackã䜿çšããŠããŸãã ããã€ãã®ããŒãã³ãŒããããäŸå€ãé€ããŠ-reactãreact-domãªã©ã
ç§ã«ãšã£ãŠãããã¯ç§ã®ã³ãŒãããããŒããããreactããã®ãããªã¢ãžã¥ãŒã«ããããŒããããreactãšã¯ç°ãªãããšãæå³ããŸããã
ãããã®ã¢ãžã¥ãŒã«ããã¯ã€ããªã¹ãã«è¿œå ãããšåœ¹ç«ã€ããã§ãïŒãŸã ä»ã«äœãå£ããŠããªããã©ããã¯ããããŸãã:)
é®®ãããïŒ ããããšã
åçŽãªãã§ãŒãã€ã³å¹æãåŸãããã«react-springã䜿çšããããšããŠããŸãã äœãæ©èœããŠããªãããã§ãã
`import Reactã{useStateãuseEffect} from'react ';
import {animatedãuseTransition} from'react-spring ';const TextContent =ïŒpropsïŒ=> {
const [items] = useState([ { id: '0', title: 'Text1' }, { id: '1', title: 'Text2' }, { id: '2', title: 'Text1' } ]) const [index, setIndex] = useState(0); const transitions = useTransition(items[index], index => index.id, { from: { opacity: 0 }, enter: { opacity: 1 }, leave: { opacity: 0 }, config: { tension: 220, friction: 120 } } ) useEffect(() => { const interval = setInterval(() => { setIndex((state) => (state + 1) % items.length); }, 4000) return () => clearInterval(interval); }, []); return ( <div> { transitions.map(({ item, props, key }) => ( <animated.div key={key} style={{ ...props, position: 'absolute' }} > <p>{item.title}</p> </animated.div> )) } </div> )
}
ããã©ã«ãã®TextContentããšã¯ã¹ããŒãããŸã; `
Reactã®ã€ã³ã¹ã¿ã³ã¹ãè€æ°ãããã©ããã確èªããŠã¿ãŸããã Npm ls-ingã«ãããšãreactãšreact-domã®ããŒãžã§ã³ã¯1ã€ã ãã§ãã©ã¡ãã16.13.1ã§ãã
ãã£ã¡ãäžç·ã ç§ã«ãšã£ãŠreactãšreact-domã¯16.13.1ã§ãããreact-springã䜿ãããšãããšåããšã©ãŒãçºçããŸãã
styled-components
ã®å¥ã®ã¹ã¬ããããã package.json
ã®file:
URIãä»ããŠç¬èªã®ããŒã«ã«ããã±ãŒãžã䜿çšããŠããå Žåã¯ã$ rm -rf node_modules/local-package-name/node_modules
ã䜿çšããå¿
èŠãããããšãåŠã³ãŸãããã©ããããããŒã«ã«ããã±ãŒãžã¯åé·ãªäŸåé¢ä¿ã«ã€ããŠnode_modules
ããã§ãã¯ããã«ã³ããŒããããããã¢ããªãå®è¡ããåã«rm -rf node_modules/local-package-name/node_modules
$ã
styled-components
ã®å¥ã®ã¹ã¬ãããããpackage.json
ã®file:
URIãä»ããŠç¬èªã®ããŒã«ã«ããã±ãŒãžã䜿çšããŠããå Žåã¯ã$rm -rf node_modules/local-package-name/node_modules
ã䜿çšããå¿ èŠãããããšãåŠã³ãŸãããã©ããããããŒã«ã«ããã±ãŒãžã¯åé·ãªäŸåé¢ä¿ã«ã€ããŠnode_modules
ããã§ãã¯ããã«ã³ããŒããããããã¢ããªãå®è¡ããåã«rm -rf node_modules/local-package-name/node_modules
$ã
ã¯ããããã¯ããã®ã¹ã¬ããã ãã§çŽ12ã®ãŠãŒã¹ã±ãŒã¹ã§åãåé¡ã§ãã rm -rfãå®è¡ããããã«ãprestartãããã³ãprebuildãã¿ãŒã²ãããè¿œå ããŸããïŒrimrafã䜿çšïŒã ãã®ã¹ã¬ããã®å¥ã®ãŠãŒã¶ãŒã¯ãprestartã§npm-link-sharedã䜿çšããŠãã¢ãžã¥ãŒã«ãåãreactã€ã³ã¹ã¿ã³ã¹ãå ±æããããã«ããŸããã ç§ãã¡monorepoãŠãŒã¶ãŒã®å€ããããã«ééããŠããŸãã
ããã«ã¡ã¯ãç§ã¯åå¿ããã¯ä»ãã®é»åã䜿çšããŠããŸãã ç§ãèªåã®ããã¯ãæžããªããããã¯ããŸããããŸãã ãããã
react-use
ãswr
ãªã©ãnode_moduleã®ä»ã®ããã±ãŒãžã®ããã¯ã䜿çšãããšãšã©ãŒãçºçããŸãã
ããã±ãŒãžãããŒã«ã«ãã¡ã€ã«ã«ã³ããŒããå¿ èŠããããŸãã
誰ãããã®åé¡ã«ééããŸããïŒ
ããã«ãããããžã§ã¯ãã®äŸïŒ
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
ã³ã¢ã³ãŒãïŒ
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsxããã«ã¡ã¯ã ç§ãåãåé¡ãæ±ããŠããŸããã ãã¹ãŠã®ã¢ãžã¥ãŒã«ãwebpackã®å€éšãšããŠããŒã¯ããelectron-webpackã䜿çšããŠããŸãã ããã€ãã®ããŒãã³ãŒããããäŸå€ãé€ããŠ-reactãreact-domãªã©ã
ç§ã«ãšã£ãŠãããã¯ç§ã®ã³ãŒãããããŒããããreactããã®ãããªã¢ãžã¥ãŒã«ããããŒããããreactãšã¯ç°ãªãããšãæå³ããŸããã
ãããã®ã¢ãžã¥ãŒã«ããã¯ã€ããªã¹ãã«è¿œå ãããšåœ¹ç«ã€ããã§ãïŒãŸã ä»ã«äœãå£ããŠããªããã©ããã¯ããããŸãã:)
ããã¯ãreduxãŸãã¯reduxããŒã«ããããšelectron-webpackã§åé¡ãçºçããŠãã人ã«ãåœãŠã¯ãŸããŸãã ç§ã¯æ¬¡ã®åäœæ§æãæã£ãŠããŸãïŒ
// package.json
...
"electronWebpack": {
"whiteListedModules": ["react-redux"]
}
https://github.com/electron-userland/electron-webpack/issues/349ãåç §ããŠãã ãã
ç§ã®åé¡ã¯ç§ãæžããããšã§ãã
import React from 'React'
ãã以å€ã®ïŒ
import React from 'react'
æã ããã¯ã°ãããããšã§ãã
Webpackæ§æã«ä»¥äžãè¿œå ããããšã§è§£æ±ºããŸããã
externals: {
react: {
root: "React",
commonjs2: "react",
commonjs: "react",
amd: "react",
},
"react-dom": {
root: "ReactDOM",
commonjs2: "react-dom",
commonjs: "react-dom",
amd: "react-dom",
},
},
ç§ã¯åœåããããnpmãªã³ã¯ã®åé¡ã ãšæããææ¡ããããã¹ãŠã®ããšãè¡ããããã«ã¯yarnã«åãæ¿ããŸããã æçµçã«ãnpmã«å ¬éãããšãã«äœãä»ã®ããšãèµ·ãã£ãŠããããšãããããå¥ã®ãããžã§ã¯ãã«ã€ã³ããŒããããšãã«åããšã©ãŒãçºçããŸããã
ããã®èª°ããæè¿lernamonorepoã§ããã解決ããŸãããïŒ ç§ã¯éãæªãã£ãããã€ãã®ææ¡ãè©ŠããŸããã
以äžã®//ã§ã³ã¡ã³ãã¢ãŠããããã³ãŒããè¿œå ããåŸããšã©ãŒãçºçããŸããã CssBaselineãè¿œå ãããã©ã°ã¡ã³ãæ å ±ãåå¿ããããšããšã©ãŒãçºçããŸãã ã³ã¡ã³ãã¢ãŠããããšããã¹ãŠæ£åžžã«åäœããŸãã å ã®ã³ãŒãã¯ãåçŽã«åºæ¬çãªnpxcreate-react-appã³ãŒãã§ãã ããã¯ãŸã£ããæ°ãããã®ã§ãããäžèšã§è©Šããããã€ãã®ä¿®æ£ã¯å¹æããããŸããã§ããã
'react'ããReactãã€ã³ããŒãããŸãã
'./logo.svg'ããããŽãã€ã³ããŒãããŸãã
'@ Material-ui / core / CssBaseline'ããCssBaselineãã€ã³ããŒãããŸãã
ããã©ã«ãé¢æ°ã®ãšã¯ã¹ããŒãAppïŒïŒ{
æ»ã ïŒ
//<React.Fragment>
//<CssBaseline />
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
//</React.Fragment>
ïŒ;
}
ããŒã«ã«ãã¹ãã®å ŽåïŒ
ã©ã€ãã©ãªnode_modulesã§ãreactããã³react-domãã©ã«ããŒãåé€ããŸã
ã¡ã€ã³ããã±ãŒãžã§ããyarninstallããŸãã¯ãnpminstallããå床å®è¡ããŸãã
ããã«ãããreactã®2çªç®ã®ã³ããŒãã¡ã€ã³ãã³ãã«ã«ããŒããããã®ãé²ããŸãã æããã«æä¹ çãªä¿®æ£ã§ã¯ãããŸããããããŒã«ã«ãã¹ãã§æ©èœããŸãã
lernaã䜿çšããŠããå Žåãããããã±ãŒãžã§ãã¹ããå®è¡ãããšãã³ãŒããå¥ã®ããã±ãŒãžã®ã³ã³ããŒãã³ããåç §ãããšãã«ããã®åé¡ãçºçããå¯èœæ§ããããŸãã
ãã®å Žåã«çºçããåé¡ã¯ãä»æ§ã«ã€ã³ããŒãããããããªã¢ã«UIã®ããã¯ã䜿çšããŠå®è£ ããããããªã¢ã«UIã®withStylesã䜿çšããŠããã³ã³ããŒãã³ãããªãŒã®ã³ã³ããŒãã³ãã«ãã€ã³ããŒããããããšãåå ã§ããã
reactã¯ReactCurrentDispatcher.current
å€æ°ã®ç¶æ
ãå
éšçã«ç®¡çããŠããããã§ããããã¯ãreactã®äžæ¹ã®ã€ã³ã¹ã¿ã³ã¹ã§èšå®ãããŸãããreactã®ããäžæ¹ã®ã€ã³ã¹ã¿ã³ã¹ã§äœ¿çšãããŸãã空ã®å Žåã¯Invalid hook call ...
ãã¹ããŒããŸãã
ãã«ãæã«CreateReactAppã®webpackæ§æããªãŒããŒã©ã€ãããããã«ãã§ã«Cracoã䜿çšããŠããŸããã
webpack: {
alias: {
react: path.resolve(__dirname, './node_modules/react'),
},
},
ãã ãããã®WebpackãªãŒããŒã©ã€ãã¯ãã«ãæã«ã®ã¿äœ¿çšãããŸãããã¹ãã®å®è¡æã«ã¯ãã³ãŒãã¯ãã«ããããŸãããããœãŒã¹ããã€ã³ã¹ã¿ã³ã¹åãããŸãããã®ããããœãªã¥ãŒã·ã§ã³ã¯ã craco.config.js
ã§CracoAliasã䜿çšããŠæå®ããããšã§ããããã¹ãäžã®åå¿ãã¹ïŒ
plugins: [
{
plugin: CracoAlias,
options: {
source: 'options',
baseUrl: './',
aliases: {
// We need to alias react to the one installed in the desktop/node_modules
// in order to solve the error "hooks can only be called inside the body of a function component"
// which is encountered during desktop jest unit tests,
// described at https://github.com/facebook/react/issues/13991
// This is caused by two different instances of react being loaded:
// * the first at packages/desktop/node_modules (for HostSignUpDownloadComponent.spec.js)
// * the second at packages/components/node_modules (for packages/components/Modal)
react: './node_modules/react',
},
},
},
],
@apieceofbartã®äŸã«åŸã£ãŠãã€ãžã§ã¯ãããã«@craco/craco
ããœãªã¥ãŒã·ã§ã³ãšããŠäœ¿çšããŸããã ç§ã«ãšã£ãŠã®æé ã¯ãããŒã«ã«ã¢ãžã¥ãŒã«ããã¹ãããããã«npm link
ã䜿çšããŠæ¬¡ã®ãšããã§ããã
npm i @craco/craco --save
ãå®è¡ããŠããã¢ã¢ããªã«cracoãã€ã³ã¹ããŒã«ããŸãcraco.config.js
ãäœæããŸããreact-scripts
ãcraco
ã«çœ®ãæããŠã start
ã build
ã test
ã¹ã¯ãªãããå€æŽããŸãã// craco.config.js
const path = require('path');
module.exports = {
webpack: {
alias: {
react: path.resolve(__dirname, './node_modules/react')
}
}
}
// package.json
{
....
"scripts": {
"start": "craco start",
"build": "craco build",
"test": "craco test",
"eject": "react-scripts eject"
},
...
}
ç·šéïŒ @jasondarwinãåãèããæã£ãŠããããšã«æ°ã¥ããŠããŸããã§ããã
ãã®åé¡ã解決ããããã«1æ¥ãè²»ãããŸããã ããã誰ããå©ããå Žåã«åããŠãããã«ç§ã®è§£æ±ºçãæçš¿ããŠãã ããã
ã¢ããªããžããªã䜿çšããŠããã2ã€ã®ããã±ãŒãžãreactããç°ãªãã€ã³ã¹ã¿ã³ã¹ãã€ã³ããŒãããŠããŸããããã«ãŒãããŒãã¢ãžã¥ãŒã«ã®åãå Žæã«è§£æ±ºãããŠããŸããã ã¢ããªã®1ã€ãç¬èªã®Webpackã䜿çšããŠãã³ãã«ãäœæããŠãããããããã2ã€ã®ã€ã³ã¹ã¿ã³ã¹ããã£ãããšãããããŸããã ããã¯ã«ãŒãããŒãã¢ãžã¥ãŒã«ã«æ£ããæã¡äžããããŠããŸãããããã®ããã±ãŒãžã«ãã£ãŠã€ã³ããŒãããããšãç¬èªã®ã€ã³ã¹ã¿ã³ã¹ãååŸããŠããŸããã 解決çã¯ãwebpackããã³ãã«ã®reactã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããªãããã«ãwebpackæ§æã®å€éšã«reactããã³reactDOMãå«ããããšã§ããã
externals: {
react: 'react',
reactDOM: 'react-dom',
},
ããã誰ãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãïŒ
ç§ã«ãšã£ãŠã¯react-hot-loaderããŒãžã§ã³4.0.0ã䜿çšããŠããŸããããreact-hot-loader4.8ã«æŽæ°ãããšããŸãããããã§ã
ã¢ãŒãã«ãŠã£ã³ããŠãæäœããããã«äœæããŠããã«ã¹ã¿ã ããã¯ã§ãã¹ããå®è¡ããå Žåã«ã®ã¿ã Invalid hook call
ã¡ãã»ãŒãžã衚瀺ãããŸãã
åäœã瀺ãããã«ã次ã®äŸãäœæããŸããã
ïŒhttps://github.com/BradCandell/invalid-hook-exampleïŒ
react
ãšreact-dom
ã®1ã€ã®ããŒãžã§ã³ã®ã¿ç§ã¯ã²ã©ãæçœãªäœããéããŠããŸããïŒ éå»ã«ã«ãŒã«ãç Žã£ãå Žåã npm start
ã¯å€±æããŸãã ããããããã¯ç§ã®ãã¹ãã§ã¯å€±æããŠããã ãã§ãã
ç§ã¯å©ãã«æè¬ããŸãïŒ
-ãã©ãã
Webpackæ§æã«ä»¥äžãè¿œå ããããšã§è§£æ±ºããŸããã
externals: { react: { root: "React", commonjs2: "react", commonjs: "react", amd: "react", }, "react-dom": { root: "ReactDOM", commonjs2: "react-dom", commonjs: "react-dom", amd: "react-dom", }, },
ç§ã¯åœåããããnpmãªã³ã¯ã®åé¡ã ãšæããææ¡ããããã¹ãŠã®ããšãè¡ããããã«ã¯yarnã«åãæ¿ããŸããã æçµçã«ãnpmã«å ¬éãããšãã«äœãä»ã®ããšãèµ·ãã£ãŠããããšãããããå¥ã®ãããžã§ã¯ãã«ã€ã³ããŒããããšãã«åããšã©ãŒãçºçããŸããã
ããã§ä¿®æ£ãããŸããã ç§ã¯react-toastifyãã€ã³ããŒãããŠããŠãç¡å¹ãªããã¯åŒã³åºããåãåã£ãŠããŸããã ã³ã³ãœãŒã«ãšã©ãŒã®åé ç®ã確èªããŸããã
- ReactãšReactDOMã®ããŒãžã§ã³ãäžèŽããŠããªãå¯èœæ§ããããŸãã
- ããã¯ã®ã«ãŒã«ã«éåããŠããå¯èœæ§ããããŸãã
- åãã¢ããªã«Reactã®ã³ããŒãè€æ°ããå ŽåããããŸãã
çµå±3å·ã«ãªããŸããã ç§ã¯ããã«åŸããŸããïŒ
https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate -react
ç§ã_ã€ã³ããŒã_ããŠããã©ã€ãã©ãªãšreactã®å¥ã®ã³ããŒããã³ãã«ããŠããããšã«æ°ä»ããŸã§ãäžèšã®è§£æ±ºçã¯ã©ããããŸããããŸããã§ããã
ã©ã€ãã©ãªã®ãœãŒã¹ã³ãŒãããã©ã³ã¹ãã€ã«ããŠãã³ãã«ããã®ã§ãããã¥ã¡ã³ãã«ãªã¹ããããŠããReactã®ããŸããŸãªããŒãžã§ã³ã®ãã§ãã¯ã§ã false
$ã§ã¯ãªãtrue
ãè¿ãããŠããŸããã
react
ãå€éšäŸåé¢ä¿ãšããŠããŒã¯ããã©ã€ãã©ãªã®ãã³ãã«ããé€å€ããããšã§ããŸããããŸããã
ç§ã®å Žåã¯ã¢ãã¬ãã§ã¯ãããŸããã§ãããããã䌌ããããªç¶æ³ã§ããã æ°ããUIãã¬ãŒã ã¯ãŒã¯ãéçºããŠãããnpm linkãlernaã䜿çšãã代ããã«ãwebpackãšã€ãªã¢ã¹ã䜿çšããŠå åŒãã©ã«ããŒäžã®ãã¡ã€ã«ãèŠæ±ããŠããŸãã æ£åžžã«åäœããŸããããã®åé¡ãçºçããŸãã 幞ãã @ apieceofbartã®ãœãªã¥ãŒã·ã§ã³ã§åé¡ãä¿®æ£ãããŸããã
130ïŒ21è¡ç®ïŒReact Hook "useStyles"ã¯ãReacté¢æ°ã³ã³ããŒãã³ãã§ãã«ã¹ã¿ã ReactHooké¢æ°react-hooks / rules-of-hooksã§ããªãé¢æ° "pharmacyDashboard"ã§åŒã³åºãããŸãã
133ïŒ45è¡ç®ïŒReact Hook "React.useState"ã¯ãReacté¢æ°ã³ã³ããŒãã³ãã§ãã«ã¹ã¿ã ReactHooké¢æ°react-hooks / rules-of-hooksã§ããªãé¢æ° "pharmacyDashboard"ã§åŒã³åºãããŸãã
ããã¯ãšã©ãŒã§ã.....誰ããããã解決ããã®ãæäŒã£ãŠãããŸããã
@vyshnaviryalié¢æ°ãåŒã³åºãæ¹ãããusePharmacyDashboard
./src/components/HomeFiles/AppFooter.js
1ïŒ1è¡ç®ïŒã«ãŒã«ãmaterial-ui / no-hardcoded-labelsãã®å®çŸ©ãèŠã€ãããŸããã§ããmaterial-ui / no-hardcoded-labels '
誰ããããã解決ããã®ãæäŒã£ãŠãããŸããã
ã³ã³ããŒãã³ãã«æ©èœãè¿œå ããå¿
èŠããããããã¹ãåã«npm publish
ãè¿œå ããããªãããã«ã npm link
ã§ãã®åé¡ãå®è¡ããŠãããã¹ãŠã®äººã«ãšã£ãŠã yalc
ã®äœ¿çšãææ¡ãã人ãããªãããšã«é©ããŠããŸãã
ã³ã³ããŒãã³ãã«æ©èœãè¿œå ããå¿ èŠããããããã¹ãåã«
npm publish
ãè¿œå ããããªãããã«ãnpm link
ã§ãã®åé¡ãå®è¡ããŠãããã¹ãŠã®äººã«ãšã£ãŠãyalc
ã®äœ¿çšãææ¡ãã人ãããªãããšã«é©ããŠããŸãã
ç§ã¯æšå¹Žå®éã«ãããŸããïŒ https ïŒ//github.com/facebook/react/issues/13991#issuecomment -535150839
ã»ãŒ1幎åããåé¡ãªã䜿çšããŠããŸãã
ããã§ãã1ã€ã¯lernaã䜿çšããŠããŸãã ãããä¿®æ£ããããã«ã react
ãšreact-dom
ã®äŸåé¢ä¿ãã«ãŒãpackage.json
ã«ç§»åããŸããã
åãåé¡ãçºçãã次ã®ããã«è¿œå ããŠè§£æ±ºããŸããã
alias: { react: path.resolve('./node_modules/react') }
ã¡ã€ã³ã¢ããªã®webpackæ§æã®
resolve
ããããã£ã«ãReactã2ã€äœ¿çšããã®ã¯æããã«ç§ã®ééãã§ãããããšã©ãŒã¡ãã»ãŒãžããã£ãšè¯ããã°çŽ æŽããããšæããŸãã ããã¯ãããã䌌ãŠãããšæããŸãïŒïŒ2402
äžèšã®æ¹æ³ã䜿çšããŠããããjestã®å®è¡æã«ãšã©ãŒãçºçããå Žåã¯ãããããjestã®æ§æã®moduleNameMapper
ã«è¿œå ããŸãïŒå¿
èŠããªãå Žåã¯react-domãçç¥ããŸãïŒã
moduleNameMapper: {
...
"^react$": "<rootDir>/node_modules/react",
"^react-dom$": "<rootDir>/node_modules/react-dom",
...
}
ç§ã¯éæ¹ã«æ®ããŠããŸãã ç§ã¯ãããååŸããŠããŸãããç§ã®ã¢ããªã¯ããã¯ã䜿çšããŠããããreactãŸãã¯react-domã®éè€ã¯ãããŸããã next.jsã䜿çšããŠããŸãã ããã¯ãããšé¢ä¿ããããŸããïŒ
npm ls react
npm ls react-dom
@maaptehã¯ç§ã«ãšã£ãŠããã§ãããïŒ ãããã®ã³ãã³ããå®è¡ããŸããããéè€ã¯èŠã€ãããŸããã§ããã äž¡æ¹ã®ã©ã€ãã©ãªã¯ããŒãžã§ã³16.13.1ã§ã
@dancancroç§ãNext.jsã䜿çšããŠããŸããããããä¿®æ£ã§ããŸããã
npm ls react
ãšnpm ls react-dom
ã¯ã©ã¡ãã1ã€ã®ãšã³ããªã®ã¿ãè¿ããŸãã ãããããããæ£ãããã©ããã¯ããããŸããã éçºçšã®ããŒã«ã«ããã±ãŒãžã«ãªã³ã¯ãããšããã®ãšã©ãŒãçºçããŸãã npm ls
ã¯ãäŸåé¢ä¿ã®reactãã¡ã€ã³ãªããžããªã«ãªã³ã¯ããªãå Žåã§ãã1ã€ã®ãšã³ããªã®ã¿ãè¿ããŸãã ãããããªã³ã¯ãé©åã«åå¿ããŠãããšã©ãŒãçºçããŸãã
@justincyãããžã§ã¯ãã«ããã±ãŒãžãªã³ã¯ããããŸããã Next.jsã«é¢é£ããŠããã«éããªãã ã¡ã€ã³ã³ã³ããŒãã³ããtypeof document !== 'undefined'
ã®äžã«å
¥ãããšãåé¡ã¯è§£æ±ºããNext.jsã®ç®çãäºå®äžæãªãããŸãã
äŸåé¢ä¿ã®node_modulesããreactãšreact-domãåé€ããããšã§ãåé¡ã解決ããããšãã§ããŸããã çæ³çã§ã¯ãããŸããããå°ãªããšãç§ã¯ä»äºãç¶ããããšãã§ããŸãã
@dancancroããªãã®åé¡ãNext.jsã«ãã£ãŠåŒãèµ·ããããŠããã®ã§ã¯ãªãããšçã£ãŠããŸãã ãããããªããä»ã®å€ãã®äººãåé¡ãæ±ããŠããã§ãããã ãªã³ã¯ãããããã±ãŒãžã®ããã«ç§ã¯ããã«ééããŠããã ãã§ãã ãªã³ã¯ãããããã±ãŒãžããªããšãšã©ãŒã¯è¡šç€ºãããŸããã
ã¡ã€ã³ã³ã³ããŒãã³ãã®7ã€ã®ã³ã³ããŒãã³ãã®ãã¡5ã€ãåé€ãããšãåé¡ã¯è§£æ±ºããŸãã ãããã®ã³ã³ããŒãã³ãã«ã€ããŠç¹å¥ãªããšã¯äœãããããŸããã ãããã®ã³ã³ããŒãã³ããtypeof document !== 'undefined'
ã§ã©ããããããšãã§ããŸãã
ããã«ã¡ã¯ããŒã ãç§ã¯ReactããŒãžã§ã³ã16.2.0ãã16.13.1ã«ã¢ããã°ã¬ãŒãããããšããŠããŸãããreact-domã§ãåãããšãããŸããã
ä»ãç§ã¯ã/ testãã§åŒã³åºãããŠããã©ãããŒã³ã³ããŒãã³ããæã£ãŠããŸã
class TestWrapper extends React.Component {
render() {
return (
<React.Fragment>
<TestComponent />
</React.Fragment>
)
}
}
ãã¹ãã©ãããŒã§ãããã¯ä»ãã®æ©èœã³ã³ããŒãã³ããã€ã³ããŒãããŸããfunction TestComponent(props) {
useEffect(() => {
console.log("TEST COMPONENT");
});
return (
<div>
Hello world!
</div>
)
}
ãã ããããŒãžãã¬ã³ããªã³ã°ããããšãUseEffectããã¯ãæ©èœããããšã©ãŒãçºçããŸããã€ãŸããç¡å¹ãªããã¯åŒã³åºãã®èŠåã§ãã
PSã ïŒ
ããã¯ç§ãæã£ãŠãããã®ã§ã
ç§ã¯ãã ...
@ @
nextJSã䜿çšããŠããã®ã§ãReactãã€ã³ããŒãããå¿
èŠã¯ãããŸããã ãããŠãç§ã¯ãããè©ŠããŸãã-å©ããªãã§ãã ããã
ä»ã®ãã¹ãŠã®ããŒãžãšfuncã¯å®å šã«æ©èœããŠããŸã
@Brotipok next.jsã®ã©ã®ããŒãžã§ã³ã§ããïŒ ïŒåæ§ã®åé¡ãçºçããŸããã9.4.Xãã9.5ã«ç§»è¡ããå Žåã®ã¿ïŒ
ããïŒ
ç§ã¯åããšã©ãŒãèµ·ãããŸãããnpmlsãå®è¡ãããšãã«reactãšreactdomã®ããã±ãŒãžã¯1ã€ã ãã§ãã
ReactããŒãžã§ã³ïŒ16.13.1
React-domããŒãžã§ã³ïŒ16.13.1
ç§ã¯typescriptã䜿çšããŠãããcreate-react-app my-app --templatetypescriptã䜿çšããŠãããžã§ã¯ããåæåããŸããã
æ©èœã³ã³ããŒãã³ãã¯ãããã¯ã䜿çšããŠããªãå Žåã«ã®ã¿æ©èœããŸãã
Package.json
{{
ãååãïŒãblablamovieãã
ãããŒãžã§ã³ãïŒã0.1.0ãã
ããã©ã€ããŒããïŒtrueã
ãäŸåé¢ä¿ãïŒ{
"@ tests-library / jest-dom"ïŒ "^ 4.2.4"ã
"@ tests-library / react"ïŒ "^ 9.5.0"ã
"@ tests-library / user-event"ïŒ "^ 7.2.1"ã
"@ types / jest"ïŒ "^ 24.9.1"ã
"@ types / node"ïŒ "^ 12.12.53"ã
"@ types / react"ïŒ "^ 16.9.43"ã
"@ types / react-dom"ïŒ "^ 16.9.8"ã
"@ types / react-router-dom"ïŒ "^ 5.1.5"ã
"react-icons"ïŒ "^ 3.10.0"ã
"react-scripts"ïŒ "3.4.1"ã
"typescript"ïŒ "^ 3.7.5"ã
"webpack-bundle-analyzer"ïŒ "^ 3.8.0"
}ã
"ã¹ã¯ãªãã"ïŒ{
"start"ïŒ "react-scripts start"ã
"ãã«ã"ïŒ "react-scriptsãã«ã"ã
"test"ïŒ "react-scripts test"ã
"eject"ïŒ "react-scriptsã€ãžã§ã¯ã"ã
"analyze"ïŒ "source-map-explorer'build / static / js/*ãjs '"
}ã
"eslintConfig"ïŒ{
"extends"ïŒ "react-app"
}ã
"ãã©ãŠã¶ãªã¹ã"ïŒ{
"補é "ïŒ [
"> 0.2ïŒ
"ã
"æ»ãã§ããŸãã"ã
ãop_miniallã§ã¯ãªãã
]ã
"çºé"ïŒ [
ãæåŸã®1ã¯ããŒã ããŒãžã§ã³ãã
ãFirefoxã®ææ°ããŒãžã§ã³1ãã
ãæåŸã®1ãµãã¡ãªããŒãžã§ã³ã
]
}
}
ç§ã¯éèŠãªãããžã§ã¯ãã§ãããããã¯ç§ãå°ã倢äžã«ãããŠããŸãã
誰ããå©ããããšãã§ããã°ããã¯çŽ æŽãããããšã§ãã
ããããšãã
@Brotipok next.jsã®ã©ã®ããŒãžã§ã³ã§ããïŒ ïŒåæ§ã®åé¡ãçºçããŸããã9.4.Xãã9.5ã«ç§»è¡ããå Žåã®ã¿ïŒ
ããã«äŸåé¢ä¿ããããŸã
ãäŸåé¢ä¿ãïŒ{
ã次ãžãïŒã9.4.4ãã
"次ã®ç»å"ïŒ "^ 1.4.0"ã
"node-sass"ïŒ "^ 4.14.1"ã
"react"ïŒ "16.13.1"ã
"react-document-meta"ïŒ "^ 3.0.0-beta.2"ã
"react-dom"ïŒ "16.13.1"ã
"react-horizoâântal-timeline"ïŒ "^ 1.5.3"ã
"react-meta-tags"ïŒ "^ 0.7.4"ã
"react-onclickoutside"ïŒ "^ 6.9.0"
}ã
"devDependencies"ïŒ{
"@ types / node"ïŒ "^ 14.0.23"ã
"@ types / react"ïŒ "^ 16.9.43"ã
"typescript"ïŒ "^ 3.9.7"
}
material-ui/core/Dialog
ã³ã³ããŒãã³ããã€ã³ããŒããããšãã«åãåé¡ãçºçããŸããç¹ã«ã react
ãšreact-dom
ã®äž¡æ¹ã«react 16.8.0
package.json
ãèšå®ããŸããã react-dom
ã€ã³ããŒãã
npm ls react
ãšnpm ls react-dom
ã1åã®ã€ã³ããŒãã§å®è¡ããŸããããŸãããšã©ãŒããŒãžã§èª¬æãããŠãããã¹ããè©ŠããŸããã
// Add this in node_modules/react-dom/index.js
window.React1 = require('react');
// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);
ããã¯false
ãè¿ããŸãããäŸåé¢ä¿ã«ãã£ãŠã€ã³ããŒããããŠãããç°ãªããåå¿ããŒãžã§ã³ãã©ã®ããã«è¿œè·¡ããŸããïŒããã¯ããããªã¢ã«UIãã€ã¢ãã°ã³ã³ããŒãã³ããã€ã³ããŒããããšãã«ã®ã¿çºçããããã§ããã¿ãããããšããã«çºçããŸããã¬ã³ããªã³ã°ã®ããã«ãããããªã¬ãŒãããã¿ã³ã List
ãListItems
ãªã©ã®ä»ã®ã³ã³ããŒãã³ãã䜿çšã§ããŸãã
匷å¶çã«è§£æ±ºããããšããŸããããä¿®æ£ãããŸããã§ããã
ç§ã¯Webããã¯ïŒæ¬åœã«å°ããªãããžã§ã¯ãïŒã䜿çšããŠããªãã®ã§ãéããçããå Žåã¯react-scripts build
ã§ãã«ããè¡ãããŸãã
æžãçŽãïŒè³ªåããœãªã¥ãŒã·ã§ã³ãªãã¡ã¬ã³ã¹ã«çœ®ãæããŸãïŒãããŠãç§ãã¡ãããŒã®ããã«ãããã¥ã¡ã³ãã§ããã«çšèªãæ確ã«ããããã®ãªã¯ãšã¹ãã§ããïŒ:)ïŒ
ããã¯ã°ã©ãŠã³ãïŒ
ç§ã¯ãããã¯ãåããæ©èœã³ã³ããŒãã³ããããã©ãŠã¶ãŒã®ããã©JSãããã®ã³ã³ããŒãã³ããåŒã³åºãããšãã§ããã¢ã»ããã«Webpackã§ã³ã³ãã€ã«ããããšããŠããŸããã
äŸãã°ã
function Example() {
const [count, setCount] = React.useState(0);
return <button onClick={() => setCount(count + 1)}>
You clicked {count} times
</button>;
}
export default Example;
...ããèªäœãã¢ãžã¥ãŒã«ãšããŠãšã¯ã¹ããŒããããã£ãã®ã§ããã®ã¢ã»ãããèªã¿èŸŒãã åŸã次ã®ããã«HTMLããçŽæ¥äœ¿çšããŸãã
<script defer>
ReactDOM.render(
ExportedCompiledExample.default(props),
document.getElementById("my_element")
);
</script>
ç§ã¯ãã£ãšåã«ãããåäœãããŸãã_ã³ã³ããŒãã³ãã«ããã¯ãå«ãŸããŠããªãéã_ã ããããããã¯ã䜿çšããŠãããšããç§ã¯ãã®æããããšã©ãŒã¡ãã»ãŒãžã«ééãç¶ããŸããã
ããŒãã«ã匟ãã»ã©ã·ã³ãã«ãªãœãªã¥ãŒã·ã§ã³
ç§ã¯_å€ãã®_ããè€éãªèµ€ããã·ã³ïŒè€æ°ã®react / reactDOMããŒãžã§ã³/ã€ã³ã¹ã¿ã³ã¹ãnpmã€ã³ããŒããšé衚瀺ã®äºæ¬¡äŸåé¢ä¿ãreact-hot-loaderãwebpackã»ããã¢ãããå€éšãããŸããŸãªãã³ãã«/ã¢ãžã¥ãŒã«/ã©ã€ãã©ãªèŠåãã³ã³ãã€ã«åŸã®æ§é ïŒã«åŸããŸããã ãïŒãããè©Šãåã«ãããã¯ããŸããããŸããïŒ
export default () => <Example />;
ïŒãŸãã¯è©²åœããå Žåexport default props => <Example {...props} />
ïŒã
ãµãããã20/20ã§ã¯ãããã¯çã«ããªã£ãŠãããšæããŸãã
ããããä»ã®èª°ãããããå¿ èŠãšããå Žåã«åããŠæ··ä¹±ã®åå ãç¹å®ããããã«ïŒããã¯ã®ã«ãŒã«ã®ããã¥ã¡ã³ãã¯_é¢æ°ã³ã³ããŒãã³ãã®æ¬äœã®ãããã¬ãã«ã§ããããåŒã³åºã_ãšèšã£ãŠããŸãã å®éã«äŸãæ§é ã«çŽæ¥è²Œãä»ããã®ã§ããããå®è¡ãããšæããŸããã
ç§ã®è§£éã¯ãããã¯ãäŸãã...
function Example() {
// Declare a new state variable, which we'll call "count"
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
...ããèªäœã¯é¢æ°ã³ã³ããŒãã³ãã§ã¯ãããŸãããïŒ ããã¯ãé©åãªåŒã³åºãã³ã³ããã¹ãã§ãããªããŸãïŒã€ãŸãã Example()
ã§ã¯ãªã<Example />
ïŒã
ããã¥ã¡ã³ãã®ã©ããã§èŠéãããããããŸããããããã§ãªãå Žåã¯ãå°ãã®äœ¿çšã³ã³ããã¹ãïŒãŸãã¯ESã¢ãžã¥ãŒã«ã®ã»ããã¢ããïŒãå«ãŸããŠãã/èšåãããŠãã/ãªã³ã¯ãããŠãããšãå€ãã®æéãç¯çŽã§ããŸãã :)ç¹ã«çŽæ¥export default Example
ããŒãžã§ã³ã¯ããã¯ãªãã§åäœããã®ã§ã
å®çšçãªãœãªã¥ãŒã·ã§ã³@apieceofbartãããããšãïŒ ç§ã®åé¡ã¯npmãªã³ã¯ã«é¢é£ããŠããŸããã
ããããWebpackã®èšå®ãèšèšäžé ãããŠããCreate ReactAppã§åäœããããã«ããæ¹æ³ã§ãã ãããããªãã®è§£æ±ºçãããããŸãã@florianzemmaïŒ
npm install -D react-app-rewired
// config-overrides.js
module.exports = function override(config, env) {
const path = require('path');
return {
...config,
resolve: {
...config.resolve,
alias: {
...config.resolve.alias,
react: path.resolve('./node_modules/react')
}
}
};
}
react-scripts ...
ã³ãã³ããreact-app-rewired ...
ã«çœ®ãæããŸããã圹ã«ç«ãŠã°å¹žãã§ã
ãã³ãã«ã2åããŒãããããããã®ãšã©ãŒãçºçããŸããã
ç§ã®å Žåãã¹ã¯ãªããã¿ã°ãã¬ã³ããªã³ã°ãããnunjucksãã³ãã¬ãŒãã2å䜿çšãããããã«çºçããŸãããã¬ã€ã¢ãŠãèªäœãšãäžè¬çã«ãããã¿ã°ã³ã³ãã³ãã®ãã³ãã¬ãŒãã§ãã
ç§ã¯Yarnã䜿çšããŠããŸããã
package.json
ã§è§£æ±ºã匷å¶ããããšã§ãããä¿®æ£ããŸããïŒ"resolutions": { "**/react": "16.7.0-alpha.2", "**/react-dom": "16.7.0-alpha.2" },
芪ã¢ããªïŒã©ã€ãã©ãªãæ¶è²»ããïŒã«è§£å床ãè¿œå ããããšã«å ããŠã次ã®ã³ãã³ãã§ã©ã€ãã©ãªã®äŸåé¢ä¿ãæŽæ°ããŸããã
yarn add link:/path/to/parent-app/node_modules/react
yarn add link:/path/to/parent-app/node_modules/react-dom
ãã®åŸã芪ã¢ããªã®ã©ã€ãã©ãªãyarn add link:/path/to/library
ã§åãªã³ã¯ããŸãã
ãã
ç§ã¯ç³žã®ã¯ãŒã¯ã¹ããŒã¹ã§åãåé¡ã«ééããŠããŸãã
ç§ã¯ãã®ãããªã¬ã€ã¢ãŠããæã£ãŠããŸãïŒ
ã¯ãŒã¯ã¹ããŒã¹/
âââå³æžé€š/
âââapp1/
âââapp2/
app1ãšapp2ã«ã¯ãreact v16.9.0ãreact-dom v16.9.0ãããã³ 'library'ãžã®çŽæ¥ã®äŸåé¢ä¿ããããŸãã
ãã©ã€ãã©ãªãã«ã¯ãv16.9.0ã«å¯Ÿå¿ããããã®ãã¢äŸåé¢ä¿ããããŸãããã¹ããŒãªãŒããã¯ã«å¯ŸããéçºäŸåé¢ä¿ããããŸãã
åé¡ã¯ãreactv16.13.1ã«äŸåããŠããã¹ããŒãªãŒããã¯ã«èµ·å ããŠããããã§ãã
ãã ããyarn installãå®è¡ãããšããããã¬ãã«ã®node_modulesã§react 16.13.1ã«ãªããapp1ãšapp2ã®ããŒã«ã«node_modulesã§react16.9.0ã«ãªããŸãã
app1ïŒCRAã§äœæïŒãå®è¡ãããšãããŒã«ã«ã®react v16.9.0ã䜿çšããŠããŸããããlibraryãã®ã³ã³ããŒãã³ãã¯Reactv16.13.1ã䜿çšããŠããŸãã
ããã¯ã糞巻ãäžãããžãã¯ãcreate-react-appsã®webpackå®çŸ©ããŸãã¯ãã®äž¡æ¹ã«åé¡ãããããã«æãããŸããïŒ
誰ãããã®ã·ããªãªã®åé¿çã®ã¢ã€ãã¢ãæã£ãŠããŸããïŒ
ãã
ç§ã¯ç³žã®ã¯ãŒã¯ã¹ããŒã¹ã§åãåé¡ã«ééããŠããŸãã
ç§ã¯ãã®ãããªã¬ã€ã¢ãŠããæã£ãŠããŸãïŒã¯ãŒã¯ã¹ããŒã¹/
âââå³æžé€š/
âââapp1/
âââapp2/app1ãšapp2ã«ã¯ãreact v16.9.0ãreact-dom v16.9.0ãããã³ 'library'ãžã®çŽæ¥ã®äŸåé¢ä¿ããããŸãã
ãã©ã€ãã©ãªãã«ã¯ãv16.9.0ã«å¯Ÿå¿ããããã®ãã¢äŸåé¢ä¿ããããŸãããã¹ããŒãªãŒããã¯ã«å¯ŸããéçºäŸåé¢ä¿ããããŸãã
åé¡ã¯ãreactv16.13.1ã«äŸåããŠããã¹ããŒãªãŒããã¯ã«èµ·å ããŠããããã§ãã
ãã ããyarn installãå®è¡ãããšããããã¬ãã«ã®node_modulesã§react 16.13.1ã«ãªããapp1ãšapp2ã®ããŒã«ã«node_modulesã§react16.9.0ã«ãªããŸããapp1ïŒCRAã§äœæïŒãå®è¡ãããšãããŒã«ã«ã®react v16.9.0ã䜿çšããŠããŸããããlibraryãã®ã³ã³ããŒãã³ãã¯Reactv16.13.1ã䜿çšããŠããŸãã
ããã¯ã糞巻ãäžãããžãã¯ãcreate-react-appsã®webpackå®çŸ©ããŸãã¯ãã®äž¡æ¹ã«åé¡ãããããã«æãããŸããïŒ
誰ãããã®ã·ããªãªã®åé¿çã®ã¢ã€ãã¢ãæã£ãŠããŸããïŒ
ããã«ã€ããŠç§ãèŠã€ããå¯äžã®è§£æ±ºçã¯ãCRAã¢ããªãyarn run eject
ãã resolve
ã»ã¯ã·ã§ã³ã®é åºã次ã®ããã«åãæ¿ããããšã§ããã
`` `javascript
ã¢ãžã¥ãŒã«ïŒ['node_modules'ãpaths.appNodeModules] .concatïŒ
modules.additionalModulePaths || []
ïŒã
`` ``
ã«
`` `javascript
ã¢ãžã¥ãŒã«ïŒ[paths.appNodeModulesã 'node_modules']ãconcatïŒ
modules.additionalModulePaths || []
ïŒã
`` ``
'appNodeModules'ãæåªå ã§ã¯ãªãããšã¯ç§ã«ã¯å¥åŠã«æããŸã-äŸåé¢ä¿ã®è§£æ±ºã«é¢ããŠã¯ãåé¡ã®å®éã®ã¢ããªã延æããå¿ èŠããããŸããïŒ
WebpackãšElectronãé¢ä¿ããèšå®ã§ãããã¯ãã®åé¡ãçºçããŸããã ç§ã®ãããžã§ã¯ãã¯ãããèªäœãWebpackã«ãã£ãŠãã³ãã«ãããŠããïŒãããŠç§ãèªåã§äœæããïŒã¢ãžã¥ãŒã«Aã«äŸåããŠããŸãã ç§ã¯ReactãAãââãå€éšåããŸããïŒcommonjs2ã¢ãžã¥ãŒã«ã§ãããšå®£èšããŸããïŒã ããã«ãããã©ã€ãã©ãªãã³ãã«ããReactãã¡ã€ã«ãé€å€ãããŸãã
Electron Rendererããã»ã¹ã§å®è¡ãããŠããç§ã®ã¡ã€ã³ããã°ã©ã ã¯ãReactã䜿çšããŠããŸãã Webpackã«Reactããã³ãã«ã«å«ããŸããïŒç¹å¥ãªæ§æã¯ãããŸããïŒã
ãã ããã©ã³ã¿ã€ã ç°å¢ã§Reactã®ã€ã³ã¹ã¿ã³ã¹ã2ã€ãããããããã«ãããããã¯ãã®åé¡ãçºçããŸããã
ããã¯ãããã®äºå®ã«ãã£ãŠåŒãèµ·ããããŸãïŒ
ç§ã®è§£æ±ºçã¯ãã¡ã€ã³ããã°ã©ã ãããReactãå€éšåããããšã§ããã ãã®ããã«ããŠãã¡ã€ã³ããã°ã©ã ãšã¢ãžã¥ãŒã«Aã®äž¡æ¹ãElectronããReactãååŸããŸããããã¯ã¡ã¢ãªå ã®åäžã®ã€ã³ã¹ã¿ã³ã¹ã§ãã
ãšã€ãªã¢ã¹ãããã€ã§ãè©ŠããŸãããããšã€ãªã¢ã¹ã¯ã¢ãžã¥ãŒã«ã³ãŒãã®å ŽæãWebpackã«æ瀺ããã ããªã®ã§ãåé¡ã¯è§£æ±ºããŸããã è€æ°ã®ã¢ãžã¥ãŒã«ãã£ãã·ã¥ã®åé¡ã«é¢ããŠã¯äœãããŸããïŒ
å¶åŸ¡ã§ããªãã¢ãžã¥ãŒã«ã§ãã®åé¡ãçºçããå Žåã¯ãReactãå€éšåãããŠãããã©ãããšãã®æ¹æ³ã確èªããŠãã ããã å€éšåãããŠããªããã°ãElectronã®ã³ã³ããã¹ãã§ã¯ãã®åé¡ã解決ã§ããªããšæããŸãã ã°ããŒãã«ãšããŠå€éšåãããŠããã ãã®å Žåã¯ãReactã.htmlãã¡ã€ã«ã«å ¥ããŠãã¡ã€ã³ããã°ã©ã ãããã«äŸåããããã«ããŸãã
ã€ãã«...
//webpack.config.js
module.exports = {
...
externals: {
react: 'react',
},
}
Vue3ã«ãåãåé¡ããããŸã
ãã®åé¡ã解決ããReactã䜿çšããå€éšã©ã€ãã©ãªã®package.jsonã«react
ãšreact-dom
ãpeerDependencies
ãšããŠé
眮ããŸããã
"peerDependencies": {
"react": "^16.13.1",
"react-dom": "^16.13.1"
},
ããã¥ã¡ã³ãã®ã©ããã§èŠéãããããããŸããããããã§ãªãå Žåã¯ãå°ãã®äœ¿çšã³ã³ããã¹ãïŒãŸãã¯ESã¢ãžã¥ãŒã«ã®ã»ããã¢ããïŒãå«ãŸããŠãã/èšåãããŠãã/ãªã³ã¯ãããŠãããšãå€ãã®æéãç¯çŽã§ããŸãã :)ç¹ã«çŽæ¥
export default Example
ããŒãžã§ã³ã¯ããã¯ãªãã§åäœããã®ã§ã
ããã«ã¡ã¯@ espen42 ã
ç§ã¯ããªãã®è§£æ±ºçãç§ãã¡ãå©ããããšãæ¬åœã«æãã§ããŸããã ããªããèšã£ãããã«ãç§ãã¡ã¯æåéã_ãã¹ãŠ_ãè©ŠããŸããã
æ®å¿µãªãããããªãã®è§£æ±ºçã圹ã«ç«ããªãããã§ãã å€åç§ã¯äœããéããã®ã ãããïŒ
ãããã£ãŠãããã±ãŒãžïŒ@ bla / blaãšåŒã³ãŸãïŒã«ã¯ã次ã®ãããªããã¯ä»ãã®ã³ã³ããŒãã³ããæã€index.js
ããããŸãã
function Bla = ({...props]) => {
const [bla, setBla] = useState(false);
return bla ? <div {...props} /> : 'no luck';
}
npx babel
ã䜿çšããŠããã±ãŒãžãã³ã³ãã€ã«ããŸãã
ãã®ããã±ãŒãžãnpm link
ã«ãªã³ã¯ããŠããã npm link @bla/bla
ã®ããã«ãããžã§ã¯ãã«å«ããŸãã
ããã±ãŒãžãšãããžã§ã¯ãã®äž¡æ¹ãåãããŒãžã§ã³ã®Reactãšreact-domã䜿çšããŸãã
ãããžã§ã¯ãã«ã¯ã次ã®ãããªããã±ãŒãžãå«ãŸããŠããŸãã
import Bla from `@bla/bla`
const RenderBla = ({...props}) => <Bla {...props} />
export default RenderBla
æ®å¿µãªããããšã©ãŒã¯åŒãç¶ãçºçããŸãã
Invalid hook call. Hooks can only be called inside of the body of a function component.
äœãæ¬ ããŠããã®ã§ããããïŒ
"externals": { "react": "react", "react-dom": "react-dom" }
ããã¯ç§ã®ããã«åé¡ãä¿®æ£ããŸãããã©ããããããšãâ€ïž
å€éšãªã³ã¯ïŒSharepoint OnlineïŒãä»ããŠã¢ã¯ã»ã¹ããå Žåã®ãã£ãŒã«ãã«ã¹ã¿ãã€ã¶ãŒãšã©ãŒ
ãªã³ã¯ãä»ããŠã¢ã¯ã»ã¹ãããšãããã€ãã®ãã¡ããªãã¯UIã³ã³ããŒãã³ããå«ãspfxãã£ãŒã«ãã«ã¹ã¿ãã€ã¶ãŒæ¡åŒµæ©èœã§ãfabricUIã®ããŒãžã§ã³ã«å¿ããŠæ¬¡ã®ããããã®ãšã©ãŒãçºçããŸãã
https://reactjs.org/docs/error-decoder.html/?invariant=321 ã
https://reactjs.org/docs/error-decoder.html/?invariant=290&args [] = A.ïŒ
20General
ããŒãžãæŽæ°ããããšããã¹ãŠãæ£ããæ©èœããŸãã
ã³ãŒãã§Reactããã¯ã䜿çšããããšã¯ãªããReactã³ã³ããŒãã³ãã®ã¿ã䜿çšããŸããã
åç
§ã䜿çšããŠããŸããã
ãã¹ãŠã®ãã¡ããªãã¯UIã³ã³ããŒãã³ããåé€ãããšããã¡ããªãã¯UIã®åå ã§ããå¯èœæ§ãããããšã©ãŒã¯çºçããŸããã
ããŸããŸãªããŒãžã§ã³ã®fabicuiã6.189.2ã6.214.0ãããã³7.114.1ãè©Šãããã¹ãŠã®fabric-uiåç §ãæµæ¢ãªuiã«çœ®ãæããããšããŸãããããŸã åé¡ã解決ããŠããŸãã
åå¿ããŒãžã§ã³ã確èªããŸããããããåºåã§ã
npmlsãåå¿ããŸã
+-@ microsoft / [email protected]
| +-@ microsoft / [email protected]
| | -- [email protected] deduped
| +-- @microsoft/[email protected]
| |
$ïŒ[email protected]éè€æé€
| +-@ microsoft / [email protected]
| | -- [email protected] deduped
|
$ïŒ[email protected]éè€æé€
`[email protected]
ããã«ã¡ã¯ãã¿ããªã
ç§ããã®åä»ãªãšã©ãŒã«åºããããŸããã ç§ã®å Žåãããã¯æçµçã«ç§ã®webpackãã«ãã®èšå®ãã¹ã§ããããŸããã ãããããã®åé¡ã§ææ¡ããããã®ã¯ã©ããç§ã«ã¯ããŸããããŸããã§ããã ã ããç§ãç§ã®çµéšãå
±æããããšæããŸãã
ç§ã®ããŒãžã«ã¯è€æ°ã®ãšã³ããªãã€ã³ããå«ãŸããŠãããSplitChunkPluginã¯ã©ã³ã¿ã€ã ãã£ã³ã¯ãäœæã§ããŸãã rails-webpacker gemã䜿çšããŠãããããããã©ã«ãã§ã¯ããã£ã³ã¯ããšã«ã©ã³ã¿ã€ã ãäœæããããã«æ§æãããŠããŸãã ããããwebpackã¯ããã©ã«ãã§åæ§ã®ããšãè¡ãããã£ã³ã¯å ã«ã©ã³ã¿ã€ã ãå«ãŸããŠããŸãã
ãã¡ãããããã¥ã¡ã³ãã¯ãã®ã±ãŒã¹ã«ã€ããŠèŠåããŠããŸãããããªãã¯ãããèŠã€ããªããã°ãªããŸããã optimization.runtimeChunk
ãsingle
ã«èšå®ãããšãåå¥ã®ã©ã³ã¿ã€ã ãäœæãããŸãã ããã«ãããè€æ°ã®ãšã³ããªãã€ã³ãããreactã䜿çšããå Žåã«ããã«ããreactã®è€æ°ã®ã³ããŒãã€ã³ã¹ã¿ã³ã¹åããã®ãé²ãããšãã§ããŸãã
https://webpack.js.org/configuration/optimization/#optimizationruntimechunkãåç §ããŠãã ãã
ããã«ã¡ã¯ãã¿ãªããã
CDNããååŸãã <script>
ã¿ã°ã«å«ãŸããŠããå€éšã©ã€ãã©ãªã䜿çšããããšããåé¡ããããããã³ãŒãèªäœã§ã§ããããšã¯ããŸããããŸããã libã¯reactãšhooksã䜿çšããŠããã®ã§ã
3. You might have more than one copy of React in the same app
ãšã©ãŒã
æ®å¿µãªãããã©ã€ãã©ãªçšã®NPMããã±ãŒãžã¯ãããŸããïŒ https ïŒ//github.com/Anyline/anyline-ocr-anylinejs-module
CRAã䜿çšããŠããŸããããããžã§ã¯ããæåºãããŸããã
ãµã³ãããã¯ã¹ã®äŸãå°ãäœæããŸããã
ä»ã®ããã±ãŒãžãããã¯ã䜿çšããŠããããç¬èªã®Reactã䜿çšããŠãããããåããšã©ãŒãã¹ããŒãããŸãã ããã±ãŒãžãNPMã«å ¬éããŠãããNPMããçŽæ¥ã€ã³ããŒãããå¿ èŠããããŸããã ããã
ç§ã¯æè¿ãã®åé¡ã«ééãããªãã ãããšæããŸãã
GitLabã«ã¢ããããŒãããã¢ãã¬ã¹ã§ã€ã³ã¹ããŒã«ããããšã§è§£æ±ºããŸããã
ããã±ãŒãžãšããŒã«ã«ããã±ãŒãžã®éãã¯äœã§ããïŒ
ãç¡å¹ãªããã¯åŒã³åºãããçºçããããšãããããŸããã ããã¯ãåŒã³åºããŠããã³ã³ããŒãã³ããåçã«ããŒããããšãã
ã³ãŒããµã³ãããã¯ã¹
ãã¢ããªããããŒããããã¹ãã¯éçã«åæ ŒããŸãã ãããåçã«ããŒããã2ã€ã®ãã¹ãïŒ1ã€ã¯require
ã䜿çšãããã1ã€ã¯é¢æ°ãšããŠimport
ã䜿çšïŒã¯äž¡æ¹ãšããšã©ãŒãåºããŸãã
ç§ãæ°ã«ããçç±ïŒããã¥ã¡ã³ãã«åŸã£ãŠãjest.doMockã䜿çšããŠããã€ãã®ãã®ãã¢ãã¯ã¢ãŠããããã¹ããããã¢ãžã¥ãŒã«ãåçã«ããŒããããã¹ããäœæããããšããŠããŸãã ããŸããŸãªæ©èœã§ããŸããŸãªæ¹æ³ã§ã¢ãã¯ãäœæã§ããããã«ããå¿ èŠããããããMockã®ä»£ããã«doMockã䜿çšããŠããŸãã ãã ããã¢ãã¯ã䜿çšããã«ãšã©ãŒãçºçããããšã«æ°ä»ãã§ãããã
ä»ã®ããã±ãŒãžãããã¯ã䜿çšããŠããããç¬èªã®Reactã䜿çšããŠãããããåããšã©ãŒãã¹ããŒãããŸãã ããã±ãŒãžãNPMã«å ¬éããŠãããNPMããçŽæ¥ã€ã³ããŒãããå¿ èŠããããŸããã ããã
ç§ã¯æè¿ãã®åé¡ã«ééãããªãã ãããšæããŸãã
GitLabã«ã¢ããããŒãããã¢ãã¬ã¹ã§ã€ã³ã¹ããŒã«ããããšã§è§£æ±ºããŸããã
ããã±ãŒãžãšããŒã«ã«ããã±ãŒãžã®éãã¯äœã§ããïŒ
@catsheueã¯ããªãã«ãšã£ãŠReact1 === React2
true
ããïŒ
ç§ã¯npmã§ç§ã®ãã®ãå
¬éããŠããŸãããããããåå ãã©ããç¥ããããšæã£ãŠããŸãã
ç§ã®ã¯React1 === React2 = true
ã®ããã§ãç§ã®åå¿ã©ã€ãã©ãªããããžã§ã¯ãã«ã€ã³ããŒããããšãã«ãªããããèµ·ãã£ãŠããã®ã解決çãèŠã€ããŠããŸãã
yarn link
ã䜿çšããŠããŒã«ã«ã©ã€ãã©ãªããã¹ããããšãã«ãåãåé¡ãçºçããŸããã ç§ã®ééãã¯ã react
ãšreact-dom
ãéçºè
ã®äŸåé¢ä¿ãšããŠãã¢ã§ã¯ãªããªã¹ãããããšã§ããã
ã ããç§ã¯yarn add --peer react react-dom
ãããã¹ãã ã£ãã æåŸã«ãReactãéçºäŸåé¢ä¿ãšããŠã³ãããããéã«ãã§ã«ééããç¯ãããããã©ã€ãã©ãªããnode_modulesãåé€ããå¿
èŠããããŸããã rm -rf node_modules; yarn
ã§åé¡ã解決ããŸããã
ç§ããã®åé¡ã«çŽé¢ããŸããã ç§ã®å ŽåãStorybookïŒv6.0.28ïŒã®Reactãéè€ããŠããããšãåå ã§ããã ç§ã¯ããªããããã§ããå€ãã®æ å ±ãèŠã€ããããšãã§ãããšä¿¡ããŠããŸãã
Storybookã®äŸåé¢ä¿ãã¢ã³ã€ã³ã¹ããŒã«ãã node_modules
ãåé€ããŠã yarn install
ãå床å®è¡ããŸããã ããã¯ç§ã®ããã«åããã ç§ã¯ããã誰ããããã§æ¶ãšç¡é§ãªæéãé¿ããã®ãå©ããããšãé¡ã£ãŠããŸãã
ãã®åé¿çã¯ç§ã«ãæå¹ã§ãã Firebase Functionsã䜿çšããŠããŠããããžã§ã¯ãã«ãŒããš/functions/
ãã£ã¬ã¯ããªã®äž¡æ¹ã«node_modules
ãã©ã«ãããããŸãã /functions/node_modules
ãåé€ãããšãã¢ããªã¯æ£åžžã«åäœããŸãã ããã¯åé¿çã§ãããããªãé¢åã§ãã äž¡æ¹ã®node_modules
ãã©ã«ããŒãåæã«ååšããããšãå¯èœã«ããåé¿çãèŠã€ãã人ã¯ããŸããïŒ
åŸäžããã³create-react-app
ã§äœæãããã¢ããªã§mdbootstrapã䜿çšãããšãã«ãã®åé¡ã«çŽé¢ããå¯èœæ§ã®ãã人ã®ããã«ã
ãã¿ã³ãã«ãŒãç»åãªã©ã®ããŸããŸãªmdbootstrapã³ã³ããŒãã³ããè¿œå ãããšããã®ãšã©ãŒãçºçããŸããã Reactã®ãµããŒãèšäºã«åŸã£ãŠãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®ããã«index.jsã«è¿œå ãããã³ã³ãœãŒã«åºåã¯ãããŒãžã§ã³ã®æ¯èŒã§true
ãè¿ããŸããã ã ããç§ã¯äœãä»ã®ããšãè©Šã¿ãªããã°ãªããŸããã§ããã
ä¿®æ£ã¯npm dedupe
ãå®è¡ããããšã§ãã
npm ls react
+-- [email protected]
| `-- [email protected]
`-- [email protected]
npm dedupe
npm ls react
+-- [email protected]
| `-- [email protected] deduped
`-- [email protected]
ãã®åŸããã¹ãŠã®ã³ã³ããŒãã³ãã¯æ£åžžã«æ©èœããŸããã 幞ããªæ¥ã ã
ãç¡å¹ãªããã¯åŒã³åºãããçºçããããšãããããŸããã ããã¯ãåŒã³åºããŠããã³ã³ããŒãã³ããåçã«ããŒããããšãã
ã³ãŒããµã³ãããã¯ã¹
ãã¢ããªããããŒããããã¹ãã¯éçã«åæ ŒããŸãã ãããåçã«ããŒããã2ã€ã®ãã¹ãïŒ1ã€ã¯
require
ã䜿çšãããã1ã€ã¯é¢æ°ãšããŠimport
ã䜿çšïŒã¯äž¡æ¹ãšããšã©ãŒãåºããŸããç§ãæ°ã«ããçç±ïŒããã¥ã¡ã³ãã«åŸã£ãŠãjest.doMockã䜿çšããŠããã€ãã®ãã®ãã¢ãã¯ã¢ãŠããããã¹ããããã¢ãžã¥ãŒã«ãåçã«ããŒããããã¹ããäœæããããšããŠããŸãã ããŸããŸãªæ©èœã§ããŸããŸãªæ¹æ³ã§ã¢ãã¯ãäœæã§ããããã«ããå¿ èŠããããããMockã®ä»£ããã«doMockã䜿çšããŠããŸãã ãã ããã¢ãã¯ã䜿çšããã«ãšã©ãŒãçºçããããšã«æ°ä»ãã§ãããã
@ miket01ãŸãã«ç§ãããããšããŠããããšã§ãïŒãã ããã¢ãã¯ã¯ãããŸããïŒã 解決çã¯èŠã€ãããŸãããïŒ
ãããè¡ãããšã«ééããŸããïŒ
function HeadedSection (props) {
if (!ReactDOMServer.renderToStaticMarkup(props.children))
return null;
const [hidden, set_hidden] = useState(props.hidden);
æåuseState
ãåŒã³åºãããšã§ä¿®æ£ïŒ
function HeadedSection (props) {
const [hidden, set_hidden] = useState(props.hidden);
if (!ReactDOMServer.renderToStaticMarkup(props.children))
return null;
äœã¶æãèã«çœ®ããåŸãããã®ãšã©ãŒãçºçããŸãã
ããã°ã©ã ã§ã¯ãŒãããã¯ã䜿çšããŠããŸãã react
ã®ã³ããŒã1ã€ãšreact-dom
ã®ã³ããŒã1ã€ã ãããããããã¯åãããŒãžã§ã³ã§ãã ãªã³ã¯ã¯ãããŸããã
æè¿ãã»ãã¥ãªãã£ã®åé¡ãä¿®æ£ããããã«ããã€ãã®ããã±ãŒãžãæŽæ°ããããšããåã«ãéšåçã«æ©èœããŠããŸããã ç§ã¯next.jsã䜿çšããŠãããä¿®æ£ã¯ããã€ãã®ãµãã³ã³ããŒãã³ãã{typeof window !== 'undefined'
ã§ã©ããããããšã«ãã£ãŠãããã¬ãã«ã®ã³ã³ããŒãã³ãããé€å€ããããšã§ããããçŸåšã¯ã©ã¡ããæ©èœããŸããã
[18:50:42] (master) questions
// ⥠npm ls react
[email protected] /Users/Dan/work/b/questions
âââ [email protected]
[22:46:34] (master) questions
// ⥠npm ls react-dom
[email protected] /Users/Dan/work/b/questions
âââ [email protected]
[22:46:55] (master) questions
// ⥠npm dedupe
removed 55 packages, moved 46 packages and audited 1712 packages in 65.449s
33 packages are looking for funding
run `npm fund` for details
found 26 vulnerabilities (15 low, 3 moderate, 8 high)
run `npm audit fix` to fix them, or `npm audit` for details
ReactCurrentDispatcher.current === null
ãåå ã§ãšã©ãŒãã¹ããŒãããŸããããããäœãã«èšå®ãããŠãã/node_modules/react/cjs/react.development.js
ã®ã©ãã«ãèŠã€ãããŸããã
ReactCurrentDispatcher.current
ãã©ãã§äŸ¡å€ãåŸãã¹ãã誰ãã«æããŠããããŸããïŒ
https://github.com/facebook/react/search?p=2&q=%22ReactCurrentDispatcher.current+%3D%22&type=code
ããã¯åè£ã®ããã«èŠããŸããããã®ã³ãŒãã¯ç§ã®react-development.js
ã«å«ãŸããŠããŸããã ãã¹ãã§ããïŒ
const prevPartialRenderer = currentPartialRenderer;
setCurrentPartialRenderer(this);
const prevDispatcher = ReactCurrentDispatcher.current;
ReactCurrentDispatcher.current = Dispatcher;
next.js
ã«ãããµãŒããŒåŽã®ã¬ã³ããªã³ã°ã§ãã®ãšã©ãŒãçºçãããã®ã³ãŒãã¯react-dom/server
ã®äžã®reactãœãŒã¹ã«ãããŸãã /node_modules/react/cjs/react-development.js
ãæ£ãããã©ããã確èªããã«ã¯ã©ãããã°ããã§ããïŒ
æŽæ°ïŒãããåé¡ã§ããã next.config.js
ãã¡ã€ã«ã®webpack.config.externals
ãç·šéããŸãã
https://github.com/vercel/next.js/issues/17592#issuecomment -712443172
ãããªã¢ã«UIãã¢ããªã«çµ±åããããšãããšãã¢ããªã倧ããªãšã©ãŒïŒç¡å¹ãªããã¯åŒã³åºãïŒãã¹ããŒããŸãã ç§ã¯Reactã«ãŸã£ããæ £ããŠããªãã®ã§ãå©ããå¿ èŠã§ãã
æãåèã«ãªãã³ã¡ã³ã
åãåé¡ãçºçãã次ã®ããã«è¿œå ããŠè§£æ±ºããŸããã
ã¡ã€ã³ã¢ããªã®webpackæ§æã®
resolve
ããããã£ã«ãReactã2ã€äœ¿çšããã®ã¯æããã«ç§ã®ééãã§ãããããšã©ãŒã¡ãã»ãŒãžããã£ãšè¯ããã°çŽ æŽããããšæããŸãã ããã¯ãããã次ã®ãããªãã®ã ãšæããŸãïŒ https ïŒ//github.com/facebook/react/issues/2402