BASE Advent Calendar 2021 9æ¥ç®ã®è¨äºã§ãã

ããªã¼ã©ã³ã¹ã®ããã³ãã¨ã³ãã¨ã³ã¸ã㢠åªå
ã§ãã
BASE ã®ãæä¼ããããã¦ããã ãããã«ãªã£ã¦ 1ã¶æãçµã¡ãè²ã
è¦ããããã«ãªã£ã¦ããä¸ã§æãæ°ã«ãªã£ã¦ããç¹ã® 1ã¤ãã
ãHMR ããã¦ããªãã
ã§ããã
BASE ã® Web ããã³ãã¨ã³ã㯠webpack ã§ãã«ãããã¦ããã®ã§ããã ãã¼ã«ã«ã®éçºç°å¢ã Docker ä¸ã§åãã¦ããäºããã£ã¦ããæ®å¿µãªãã HMR ã¯ããã¦ããªãç¶æ³ã§ããã
ãDocker ç°å¢ã ããç¡çï¼ã
ãâwebpack HMR dockerâ ã¨ãã§ã°ã°ãã¨è²ã
åºã¦ãããåºæ¥ãããªï¼ã
ãã£ããåãæãã£ã¦ã¿ã¾ããã
HMR ã¨ã¯ï¼
ä¸å¿ãHMR ã®èª¬æããã¦ããã¾ãã
https://webpack.js.org/guides/hot-module-replacement/
Hot Module Replacement ã®ç¥ã§ãã
js ã¢ã¸ã¥ã¼ã«ã®å¤æ´ãããã©ã¦ã¶ããªãã¼ããããã¨ç¡ãã«åçã«å·®ãæ¿ãã¦åæ ãã webpack ã®æ©è½ã®äºãæãã¾ãã
æ´å²ã¯å²ã¨å¤ããwebpack 1ç³»ã®é ãã試é¨çã«å°å
¥ããã¦ãã¾ããã
ä¼¼ããã®ã¨ãã¦ããã¡ã¤ã«ã®å¤æ´ãæ¤ç¥ãã¦ãã©ã¦ã¶ãèªåã§ãªãã¼ããã¦ããã liveReload ãããã¾ãã
ä»çµã¿
HMR ã¯ãããã以ä¸ã®æµãã§å®ç¾ããã¦ãã¾ãã

- webpack-dev-server ã HMR ç¨ã®ã³ã¼ããå«ã㦠js ãè¿ã
- WebSocket ã«æ¥ç¶
- webpack ããã¡ã¤ã«ã®å¤æ´ãæ¤ç¥ãããå·®åãã«ã
- 夿´ããã£ããã¨ã WebScoket ã§éç¥
- 夿´å·®åæ å ±ãåå¾
- 夿´ã®ãã£ãã¢ã¸ã¥ã¼ã«ãåå¾ãã¦åçã«ç½®ãæã
- ç½®ãæããã§ããªãå ´å㯠liveReload ããã
æ§æ
ä¸è¬ç㪠SPA ã®å ´åãèµ·åãã webpack-dev-server ã«ãã©ã¦ã¶ããã¢ã¯ã»ã¹ããAPI ãªã©ã¸ã®ã¢ã¯ã»ã¹ã¯å¿ è¦ã«å¿ãã¦ãªãã¼ã¹ãããã·ããã¨ããæ§æãåãã¾ãã

- èµ·åãã webpack-dev-server (
http://localhost:3000ãªã©)ã«ãã©ã¦ã¶ã§ã¢ã¯ã»ã¹ - webpack ã§ãã«ãããã html ãè¿å´
- webpack ã§ãã«ãããã js ãè¿å´
- webpack ã§ç®¡çãã¦ããªããªã½ã¼ã¹ã¯ backend ã¸ãªãã¼ã¹ãããã·
å½å
BASE ã®ãµã¼ãã¹ã¯ CakePHP ã使ç¨ãã¦ããã®ã§ãä¸è¨ã¨åæ§ã«å段㫠webpack-dev-server ãé ç½®ã㦠CakePHP ã¸ãªãã¼ã¹ãããã·ããå¿ è¦ãããã¨æã£ã¦ãã¾ããã
ã¾ãããã¼ã«ã« Docker ç°å¢ã¯æ¶ç©ºã®ãã¡ã¤ã³ï¼ããã§ã¯ä»®ã« *.base.testï¼ä¸ã§åãããã«ãªã£ã¦ããã®ã§ãwebpack-dev-server ã¸ããã®æ¶ç©ºãã¡ã¤ã³ã¨ãã¦ã¢ã¯ã»ã¹åºæ¥ãããã«ãã¦ãããå¿
è¦ãããã¨èããDocker ç°å¢å
ã« webpack-dev-server ã建ã¦ã¾ããã

ããã¯ããã§åãã®ã§ééãã§ã¯ãªãã®ã§ããã
- Dockerä¸ã§åããã®ã§åç´ã«éããªã
- Dockerä¸ã§ webpack-dev-server ã使ããã©ãããåãæ¿ããã®ãé¢åãã
- node-gyp ã«ãããã¤ãã£ãããã±ã¼ã¸ã«ä¾åãã¦ããã¨ãDockerä¸ã§ yarn install ããå¿ è¦ããã
- å é¨ã®ã©ã¤ãã©ãªã¸ã® yarn link ãå³ããã
ãªã©ã®åé¡ããããè²ã ã¨èª¿æ´ã解決ã大å¤ããã§ããã
å©è¨
ãããªä¸ãããå©è¨ããããã¾ããã
ã¢ã»ããã ããã¹ãå´ã® dev-server ã«ç¹ããªããã ããã
âââ
ãªãã¼ã¹ãããã·ããªããã°ãªããªãã¨æãè¾¼ãã§ãã¾ã£ã¦ãã¾ãããã
CDN ãã js ã css ãåå¾ãã¦åããããããªã®ã§ãwebpack-dev-server ã CDN ã®ããã«æ±ããã¨ãã§ããã®ã§ã¯ãªããï¼
å©è¨å¾

- webpack-dev-server ã¯ãã¹ãå´(
http://localhost:3081/)ã§èµ·åãã - CakePHP ã§ js ããã¼ããã¦ããç®æã® URL ã
http://localhost:3081/ã«åãã
以ä¸ã
js ã®åãå
ãå¤ããã ãã§è¯ããªã£ãã®ã§ãdocker-compose ã«ã¯å½±é¿ãåã¼ãããã¨ã¦ãã·ã³ãã«ãªä»çµã¿ã«ãªãã¾ããï¼
webpack ã®è¨å®
æçµç㪠webpack ã® devServer è¨å®ã¯ä»¥ä¸ã§ãã
devServer: { allowedHosts: ['.base.test'], client: { overlay: true, webSocketURL: 'ws://localhost:3081/ws', }, headers: { 'Access-Control-Allow-Origin': '*', }, port: 3081, proxy: { '*': 'http://localhost:8081/', }, static: false, watchFiles: ['app/**/*'], },
èæ ®ããç¹
CORS ã解決ãã
Docker ç°å¢ https://*.base.test ããè¦ãã¨ã http://localhost:3081 ã¯ã¯ãã¹ãªãªã¸ã³ãªã¢ã¯ã»ã¹ã«ãªãã®ã§ãdevServer.headers ã¨ã㦠CORS ãããã¼ãè¿ãå¿
è¦ãããã¾ãã
ã¾ããwebpack-dev-server ã¸ã®ã¢ã¯ã»ã¹ã許å¯ãããã¡ã¤ã³ã devServer.allowedHosts ã«è¿½å ããå¿
è¦ãããã¾ããã
devServer: { allowedHosts: ['.base.test'], headers: { 'Access-Control-Allow-Origin': '*', }, },
HMR ã® WebSocket æ¥ç¶å ãå·®ååå¾å ãªã©ã webpack-dev-server ã«åãã
html 㯠https://*.base.test/ ããè¿ããã¦ããããã®ã¾ã¾ã 㨠HMR ç¨ã® WebSocket ãªã©ããã¡ããåãã¦ãã¾ãã®ã§ãdevServer.client.webSocketURL ã§ ws://localhost:3081/ws ã¸åãã¾ãã
devServer: { client: { webSocketURL: 'ws://localhost:3081/ws', }, }
ã¾ããwebpack-manifest-plugin ã使ç¨ãã¦ããé¢ä¿ã§ãoutput.publicPath ãæå®ãã¦ããã®ã§ããã
output: { publicPath: '/', },
ãããå·®åã®åå¾å
ã«ä½¿ããã¦ããã®ã§ãwebpack-dev-server ã§èµ·åãã¦ããå ´å㯠localhost:3081 ã¸åãããã«ããå¿
è¦ãããã¾ããã
output: { publicPath: env.WEBPACK_SERVE ? 'http://localhost:3081/' : '/', },
webpack 管çå¤ã® js ã¸ã®å¯¾å¦
webpack ã§ãã«ãããã¦ããªãå¤ã js ãæ®ã£ã¦ããããã®ã¾ã¾ã ã¨ãããã¸ã®ã¢ã¯ã»ã¹ã 404 ã«ãªã£ã¦ãã¾ãã®ã§ãããç¨ã« devServer.proxy ã§ CakePHP ã¸ãªãã¼ã¹ãããã·ãã¦ãã¾ãã
devServer: { proxy: { '*': 'http://localhost:8081/', }, },
ã¾ããããããå«ã CakePHP å´ã«å¤æ´ããã£ãéã« liveReload ããããããdevServer.watchFiles ãè¨å®ãã¦ãã¾ãã
devServer: { watchFiles: ['app/**/*'], },
CakePHP ã§ js ã®åãå ãå¤ãã
HtmlHelper ã使ç¨ãã¦ã
<?= $this->Html->script('foo') ?>
ã®ããã«åºåãã¦ããã°ã App.jsBaseUrl ãè¨å®ããäºã§åãå ãå¤ãããã¨ãã§ãã¾ãã
<?php Configure::write('App.jsBaseUrl', 'http://localhost:3081/js/');
ããããã¼ã«ã«ã§ã®ã¿æå¹ã«ãªã Config ãã¡ã¤ã«ã«è¨è¿°ãã¦ãå¿ è¦ã«å¿ãã¦åãæ¿ããããã«ãã¦ãã¾ãã
ãããã«
Docker ç°å¢ã§ãã·ã³ãã«ãªå½¢ã§ webpack-dev-server ã§ HMR ããäºãã§ãã¾ããï¼
ãã®å½¢ã§ HMR ã§ããã¨ãªãã¨ãProxyman ã Charles ãªã©ã® proxy ã¨çµã¿åããã¦ã¿ãããªã©è²ã
å¿ç¨ãã§ãããã§ããã
ææ¥ã¯ @budougumi0617 ããã§ãï¼