
â»ãã¡ãã¯ãã¤ã»ã«ãã¯ããã¸ã¼ãº Advent Calendar 2023ã®10æ¥ç®ã®è¨äºã§ãã
ååã®è¨äºã¯ãéæ¾¤ããã®Auth0ã¨Entra IDãæ±ããããã¯ãå士ãç¹ããããã®Istioè¨å®ããããã§ããã
ã¯ããã«
ããã«ã¡ã¯ãéçº3é¨ã®ç¥ä¿ã§ãã
ãã¤ã»ã«ã§ã¯ãã客æ§å® ã¸ã®åºå¼µè¨ªåã«ããè²·åãè²·åãã£ãã«ã®ä¸»åã¨ãªã£ã¦ãã¾ããç¾å¨éçº3é¨ã®å¼ãã¼ã ã§ã¯ããã®åºå¼µè¨ªåè²·åã§ä½¿ç¨ãããWebã¢ããªã±ã¼ã·ã§ã³ãVisitãã®æ°è¦éçºãé²ãã¦ãã¾ãã
Visitã®ããã³ãã¨ã³ãã«ã¯Reactãæ¡ç¨ãã¾ããããNext.jsçã®ãã¬ã¼ã ã¯ã¼ã¯ã¯ä½¿ç¨ãããVite + Reactã«ããSPA (Single Page Application)æ§æã鏿ãã¾ããã
æè¡é¸å®ã®éç¨ã§ã¯ã社å ã§ã®æ¡ç¨äºä¾ãªã©ããNext.jsãæ¤è¨ã®å¯¾è±¡ã¨ãªãã¾ããããæçµçã«ã¯ãã®æ¡ç¨ãè¦éãçµè«ã«è³ãã¾ããã
ä»åã®è¨äºã§ã¯ããã®çµè«ã«è³ãã¾ã§ã®æ¤è¨å 容ã«ã¤ãã¦ã¾ã¨ãã¾ããReactã®ãã¬ã¼ã ã¯ã¼ã¯é¸å®ã«æ©ãæ¹ã®åèã«ãªãã°å¹¸ãã§ãã
ãªãããã®è¨äºã§ã¯Core Web Vitalsãªã©ã®è©³ç´°ãªããã©ã¼ãã³ã¹æ¯è¼ã¯è¡ããã宿§çãªè¦³ç¹ããã®è°è«ã主ã¨ãªã£ã¦ãã¾ãã®ã§ãããããããäºæ¿ãã ããã
- ã¯ããã«
- åºå¼µè¨ªåè²·åã¢ããªãVisitã
- ããã³ãã¨ã³ãã®ãã¬ã¼ã ã¯ã¼ã¯é¸å®
- Visitã®å ´å
- ã¾ã¨ã
åºå¼µè¨ªåè²·åã¢ããªãVisitã
Visitã¯åºå¼µè¨ªåè²·åãè¡ãããã®Webã¢ããªã±ã¼ã·ã§ã³ã§ããè²·åãè¡ãæ»å®å£«ã¯ãååã®æ»å®ããå¥ç´æ¸ãå«ãå種æ¸é¡ã®ä½æã¾ã§ãVisitä¸ã§è¡ãã¾ãã
UIã«è¡¨ç¤ºãããé ç®ã¯ãæ»å®ããååæ å ±ãå¥ç´ã®ãå®¢æ§æ å ±ã¨ãã£ããã©ã³ã¶ã¯ã·ã§ã³ãã¼ã¿ãã»ã¨ãã©ã§ãããããèªè¨¼ä»ãã®ç®¡çç»é¢ç³»ã¢ããªã«åé¡ããããã®ã§ãã
Visitã¯ç¾å¨ãiPhoneããã³iPadä¸ã§å©ç¨ããããã®WebViewã¢ããªã¨ãã¦éçºãé²ãããã¦ãã¾ããWebViewã¢ããªã®ç¥è¦ã«ã¤ãã¦ãã¾ãã©ããã§ã話ãã§ãããã¨èãã¦ãã¾ãã

ããã³ãã¨ã³ãã®ãã¬ã¼ã ã¯ã¼ã¯é¸å®
Visitã®ããã³ãã¨ã³ãã«ã¯ã社å ã®æè¡ã¹ã¿ãã¯ãã©ã¤ãã©ãªã®ã¨ã³ã·ã¹ãã ãªã©ãèæ ®ããReactãæ¡ç¨ãã¾ããã
Reactã§ã¢ããªã±ã¼ã·ã§ã³ã使ããã«ã¯ãæè¿ã§ã¯Next.jsãRemixçã®ãã¬ã¼ã ã¯ã¼ã¯ãå©ç¨ããã®ããã¬ã³ãã¨ãªã£ã¦ãã¾ãã䏿¹ã§ãåå¦è ãã·ã³ãã«ãªã¢ããªã±ã¼ã·ã§ã³ã®éçºè ã«ã¨ã£ã¦ã¯ãããããã¬ã¼ã ã¯ã¼ã¯ã¯ãªã¼ãã¼ã¹ããã¯ã¨ããè¦æ¹ããããVite + Reactã®ãããªSPAæ§æãå¥½ãæ¹ãå¤ãããã§ãã
Reactå ¬å¼ã¨ãã¦ã¯ãæ°ããããã¥ã¡ã³ããã¿ãéããã¬ã¼ã ã¯ã¼ã¯ã®å©ç¨ãå¼·ãæ¨å¥¨ãã¦ããããã§ããViteãReactã¢ããªã使ãã鏿è¢ã¨ãã¦åçã«æ±ããã¨ããIssueãä¸ãã£ã¦ãã¾ãããç¾ç¶(2023.12å·çæç¹)ã§ã¯ãååãã«æ¤è¨ãããã¨ã®è¿ä¿¡ã«çã¾ã£ã¦ãã¾ãã
ããããReactéçºãã¼ã ã®ã¹ã¿ã³ã¹ããAppRouterã«ä»£è¡¨ãããããæè¿ã®Next.jsã®å¢ãã«å ãã社å ã§ã®æ¡ç¨äºä¾ãå¤ãã£ããã¨ãããVisitã§ãå½åã¯Next.jsã®å©ç¨ãæ¤è¨ãã¦ãã¾ããã
Next.jsãæ¡ç¨ãã¦å¾ããããã®
Next.jsãæ¡ç¨ãããã¨ã§ãããã©ã¼ãã³ã¹ã¨éçºä½é¨ã®2ã¤ã®è¦³ç¹ã§ã®ã¡ãªãããå¾ããã¾ãã
ããã©ã¼ãã³ã¹è¦³ç¹ã§ä¸çªéè¦ãªæ©è½ã¯SSR (Server Side Rendering)ãSSG (Static Site Generation)ã ã¨èãã¦ãã¾ããç¹ã«Visitã¯ã¢ãã¤ã«ç«¯æ«ã§å©ç¨ãããããã端æ«ã®è² è·ããµã¼ãã¼ã«å¯ãããã¨ã«ãã£ã¦ãã¯ã©ã¤ã¢ã³ãå´ã®ããã©ã¼ãã³ã¹åä¸ã¯å°ãªãããæå¾ ã§ããã§ãããã
ã¾ãã仿´ç´¹ä»ããã¾ã§ããªãã§ããããã«ã¹ã¿ãã¯ãã¬ã¼ã ã¯ã¼ã¯ã§ããNext.jsã¯API RoutesãMiddlewareã»Next/Imageã«ä»£è¡¨ãããOptimizationãªã©ããµã¼ãã¼ããããã¨ã«ãã£ã¦å®ç¾ã§ããæ§ã ãªæ©è½ããµãã¼ããã¦ãã¾ãã
ãã®ã»ãã«ãããã¡ã¤ã«ãã¼ã¹ã«ã¼ãã£ã³ã°ãã¼ãã³ã³ãã£ã°ã§ã®éçºã¹ã¿ã¼ããªã©ãããã©ã¼ãã³ã¹ã®ã¿ãªããéçºä½é¨ã®é¢ã§ãé åçãªæ©è½ãå¤ãæä¾ããã¦ãã¾ãã
é·æçãªè¦ç¹ã§ããæ ªå¼ä¼ç¤¾ãã³ãªã¼ããã®è¨äºã«ããããã«ãNext.jsãå©ç¨ãããã¨ã§ã¦ã¼ã¶ã¼ã»éçºè ã®åæ¹ãå¤ãã®ã¡ãªããã享åã§ããã¨æããã¾ãã
䏿¹ã§èª²é¡ããã
ä¸è¨ã®éãNext.jsãæ¡ç¨ãããã¨ã§å¾ãããæ©æµã¯å¤ãã§ããã䏿¹ã§èª²é¡ãããã¨èãã¦ãã¾ãã
ä¾ãã°ãç´è¿ã§ãKent C. Doddsã«ããNext.jsã«å¯¾ããæ¹è©ã話é¡ã«ãªã£ã¦ãã¾ãããå½¼ã®ä¸»å¼µã®100%ãæ¯æãã訳ã§ã¯ããã¾ããããVercelã¸ã®ããã¯ã¤ã³ãNext.jsã®æ©è½ã®è¤éãã«ã¤ãã¦ã¯è³åã§ããé¨åãå¤ãããã¾ãã
ãµã¼ãã¼ãéç¨ããã³ã¹ã
Next.jsã«éããã§ãããSSRããµãã¼ããããã¬ã¼ã ã¯ã¼ã¯ã¯ãµã¼ãã¼ãæã¤ãã¨ãåæã¨ãã¦ãããããå½ç¶ãµã¼ãã¼ãéç¨ããã³ã¹ããçºçãã¾ãã
åç´ãªã¤ã³ãã©è²»ç¨ã«å ããCloud Runã®ãããªãµã¼ãã¬ã¹ã§ãã£ã¦ããä¸è¬çãªããã¯ã¨ã³ããµã¼ãã¼ã¨åæ§ã«ãªã¯ã¨ã¹ãæ°ã®è¦ç©ãããè² è·è©¦é¨ãSLO (Service Level Objectives)ãSLA (Service Level Agreements)ãSLI (Service Level Indicators)ã®çå®ãã¹ã±ã¼ã«ã¢ã¦ãã®æ¤è¨ãæ¥ã ã®ã¡ããªã¯ã¹ç£è¦ããµã¼ãã¼èµ·å ã®ã¢ã©ã¼ã対å¿ãªã©ãæ§ã ãªéç¨ã³ã¹ããçºçãã¾ãã
ããã³ãã¨ã³ãã®ããã«ããããæ¥åãçºçãããã¨ã¯ããã¼ã ã¨ãã¦ãè² æ ã«ãªãããã¾ãããç¹ã«ãããã³ãã¨ã³ãã®ã¡ã³ãã¼ããµã¼ãã¼ãµã¤ããã¤ã³ãã©ã®ç¥èã«é·ãã¦ããªãå ´åã¯ããããã®ã³ã¹ãã¯ããã«å¢å ããå¯è½æ§ãããã¾ããå®éã«ãèªåãéå»ã«æå±ãã¦ãããã¼ã ãã社å ã§Next.jsãéç¨ãã¦ããä»ãããã¯ãã§ã¯ãããããæ©ã¿ãéç¨ä¸ã®èª²é¡ã¨ãã¦æãããã¦ãã¾ããã
Vercelããã¹ãã£ã³ã°å ã¨ãã¦å©ç¨ããã°ããã®ãããã®ããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°ãæèããã¨ããµãã¼ããã¦ããã¾ãããVercelã®å©ç¨æéãæ¬¡ã®éå£ã«ãªãã§ãããã
䏿¹ã§SPAã§ããã°ãéçã¢ã»ããã®é ä¿¡ã ãã§å®çµãã¾ããGoogle Cloudã§ããã°Cloud StorageãApp Engineã¨ãã£ãã容æã«éçãã¹ãã£ã³ã°ãå¯è½ã§èªåã§ã¹ã±ã¼ãªã³ã°ãã¦ããããµã¼ãã¹ããããããéç¨ã³ã¹ãã大ãã忏ã§ãã¾ãã
Static Exportsã¨ãã鏿è¢
Next.jsã®æ©æµã«ã¯ä¸ããããããµã¼ãã¼ãæã¡ãããªãã¨ãããã¼ãºã«å¯¾ãã¦ã¯ãNext.jsãéçãªã¢ã»ããã¨ãã¦ãã«ãããã¨ãã鏿è¢ãããã¾ãã
ããã¯å ã«è¿°ã¹ããµã¼ãã¼ã®ã©ã³ãã³ã°ã³ã¹ãã¨ãããã¡ãªãããè§£æ¶ãã¤ã¤ãã«ã¼ãã£ã³ã°ãªã©ã®Next.jsã®ä¸é¨æ©è½ãå©ç¨ã§ããæè¡·æ¡çãªãªãã·ã§ã³ã§ããããããDynamic Routesãå©ç¨ããå ´åã«ã¯æ³¨æãå¿ è¦ã§ãã
ããã¥ã¡ã³ãã®Supported Featuresã«ãDynamic Routes when using getStaticPathsãã¨ããéããã«ã¼ãã£ã³ã°å
ãæéã§ãã«ãæã«æ±ºå®ã§ããã±ã¼ã¹ã§ããã°æå¹ã§ãããããã§ãªãå ´åã¯ã¢ã»ãããposts/[postId].htmlã®ããã«ãã«ãããã¦ãã¾ãã/posts/1ã«ã¢ã¯ã»ã¹ãã¦ããã¡ã¤ã«ãåå¨ããªããã¨ã«ãªã£ã¦ãã¾ãã¾ãã
ãããã£ã¦ãå®å
¨ã«åçãªã«ã¼ãã£ã³ã°ãå®ç¾ããããã«ã¯ããã¡ã¤ã«ãè¦ã¤ãããªãã£ãå ´åã«fallbackããã404.htmlå
ã§ã«ã¼ãã£ã³ã°å¦çãè¡ããªããã°ãªãã¾ããã
ããããã¨ä¸åº¦404.htmlãã¯ã©ã¤ã¢ã³ãã«è¿ããã¦ãããæ£ãããã¼ã¸ã«ãªãã¤ã¬ã¯ããããã¨ããç¹æ®ãªæåã«ãªã£ã¦ãã¾ãã¾ãããã®çµæãäºéã«ãªã¯ã¨ã¹ãå¦çãè¡ããããã¨ã«ããã¦ã¼ã¶ã¼ä½é¨ã®æªåããrouter.eventsã2åçºç«ãããã¨ã«ããäºæãã¬åä½ã«ã¤ãªããå¯è½æ§ãããã¾ãã
䏿¹ã§ããã¼ã«ã«ã§ã¯Next.jsã®devãµã¼ãã¼ãé常éãã«ã¼ãã£ã³ã°ãè¡ããããããããåä½ã(ç¹æ®ãªéçºç°å¢ãç¨æããªãéã)åç¾ã§ãã¾ãããéçºæã«ã¯åç¾ã§ããªãæåãæ¬çªã§çºçãããã¨ã¯å¤§ããªæ¸å¿µç¹ã§ãã

ããä¸ã¤ã®è§£æ±ºçã¨ãã¦ããã¹ãã£ã³ã°ãµã¼ãã¼å´ã§ãã¹ã®ãªã©ã¤ããè¡ãã¨ããææ³ãããã¾ããApp Engineã¯ãã®ãããªæ©è½ããµãã¼ããã¦ãããapp.yamlã§è¨å®ãã§ãã¾ãã
Cloud Storageã«ã¯ãããã£ãæ©è½ã¯ããã¾ãããã以ä¸ã®ããã«Load Balancerå´ã§ãã¹ã®ãªã©ã¤ããå¯è½ã§ãã
defaultService: your-project/frontend-bucket name: matcher1 routeRules: - matchRules: - pathTemplateMatch: /posts/*/{rest=**} priority: 1 service: your-project/frontend-bucket routeAction: urlRewrite: pathTemplateRewrite: /posts/[postId]/{rest}
ãã¹ãã£ã³ã°å ãããããæ©è½ããµãã¼ããã¦ããªãå ´åã¯ãnginxãµã¼ãã¼ãåæ®µã«ç½®ãã°åæ§ã®å¦çãå®ç¾ã§ãã¾ãã
ãã ãããããã®æ¹æ³ã¯ãããã³ãã¨ã³ãã®ã«ã¼ãã£ã³ã°ã夿´ããããã³ã«ã¤ã³ãã©ã®è¨å®ã夿´ããªããã°ãªããªãéç¨ã«ãªã£ã¦ãã¾ããã¨ã課é¡ã¨ãããã§ãããã
ä¸è¨ã®éããã©ããã¦ãããã¯çãªæ¹æ³ã«é ¼ããããå¾ãªããããå®å ¨ã«åçãªã«ã¼ãã£ã³ã°ãå®ç¾ãããã¦ã¼ã¹ã±ã¼ã¹ã§ã¯ãNext.jsã®Static Exportsãå©ç¨ããã®ã¯ä¸å®ã®ãã¡ãªãããè² ããã¨ã«ãªãã¨èãã¦ãã¾ãã
Visitã®å ´å
Visitã¯åé ã«ç´¹ä»ããéãåºå¼µè¨ªåè²·åã§å©ç¨ããã¢ããªã±ã¼ã·ã§ã³ã§ããããã©ã³ã¶ã¯ã·ã§ã³ãã¼ã¿ã主ã¨ãã¦æ±ãã¾ãããããã£ã¦ãSSRãSSGã«ããã¡ãªããã享åã§ããç¯å²ã¯ããªãçµããã¾ããã¾ããè²·åæ¥åã§å©ç¨ããã¨ãããµã¼ãã¹ã®ç¹æ§ä¸ãFCP (First Contentful Paint)ãmsecåä½ã§è¿½æ±ããå¿ è¦ãèãã¨èãã¦ãã¾ããèªè¨¼ãªãã§é²è¦§å¯è½ãªãã¼ã¸ããªããããSEOã®è¦³ç¹ã§ãSSRã¯ä¸è¦ã§ãã
ä¸è¿°ããã¢ãã¤ã«ç«¯æ«ã§ã®ããã©ã¼ãã³ã¹åä¸ã¨ããå©ç¹ã¯ããã¾ããããã¡ããæ¥åå©ç¨ã¨ãã観ç¹ãããã¦ã¼ã¶ã¼ã§ããæ»å®å£«ã¯ä¼ç¤¾ã®é å¸ãã端æ«ãå©ç¨ãããã¨ãæ³å®ããããããæ¥µç«¯ã«ä½ã¹ããã¯ãªç«¯æ«ã®å©ç¨ã¯é¿ããããã¨èãã¾ããã
çµæçã«æ®ãã¡ãªããã¯ããã¡ã¤ã«ãã¼ã¹ã«ã¼ãã£ã³ã°ãã³ã¼ãåå²ã®ãµãã¼ããªã©ãã¦ã¼ã¶ã¼ä½é¨ã¨ãããããéçºè ä½é¨ã®é¢ã§ã®ãã®ã¨ãªã£ã¦ãã¾ãã¾ãã
以ä¸ãéã¿ãã¨ãããNext.jsãæ¡ç¨ãã¦å¾ãããã¡ãªãããããããµã¼ãã¼ã®é¢åãè¦ã¦ããã³ã¹ãããNext.jsãç¡çã«Static Exportsã§å©ç¨ãããã¡ãªããã大ããã¨ããçµè«ã«è³ãã¾ããã
ç¹ã«ãVisitã¯ããã³ãã¨ã³ãã¨ããã¯ã¨ã³ãã§åããããã¼ã æ§æã§éçºãã¦ããããããã«ã¹ã¿ãã¯ãªç¥èãæ±ããããæè¡ãéç¨ãã¦ããã®ã¯æé©ãªé¸æã§ã¯ãªãã¨èãã¾ãããçµæã¨ãã¦ãVisitã§ã¯ãã¬ã¼ã ã¯ã¼ã¯ãªãã§ã®Reactãæ¡ç¨ããCloud Storageã§é ä¿¡ããã¨ãã夿ã«ãªãã¾ããã
SPAãæ¡ç¨ãã¦ã¿ã¦
Visitã¯ã¾ã æ¬æ ¼çãªãã¼ã³ãããããã¦ãã¾ããããããã¾ã§æ°ã¶æééçºãé²ãã¦ãã¾ãããããã§ã¯ãå®éã«Vite + Reactã®æ§æãæ¡ç¨ããå¾ã®èª²é¡ãç¥è¦ãããã¤ãç´¹ä»ãã¾ãã
ãã³ãã«ãã¼ã«ã®éã
ã¢ã¸ã¥ã¼ã«ãã³ãã©ã«æ¡ç¨ããViteã®devãµã¼ãã¼ã¯ããã³ãã«ã³ã¹ãã忏ãããã¨ã«ãã£ã¦ãé常ã«é«éãªHMR (Hot Module Replacement)ãæä¾ãã¦ãã¾ããããã¯ãä¾åé¢ä¿ã®ã¿äºåãã³ãã«ãè¡ããã½ã¼ã¹ã³ã¼ãã¯ãã©ã¦ã¶ã®ãã¤ãã£ãESMãå©ç¨ãã¦import/exportãããã¨ã§å®ç¾ããã¦ããããã§ã(åè)ã使ã§ããNext.jsã§ãµãã¼ãããã¦ããwebpackã¨æ¯è¼ãã¦ã¨ã¦ãå¿«é©ã«æãã¾ã(Turbopackã®æ¹ãããé«éã¨ã¯è¨ããã¦ãã¾ã...)ã
䏿¹ã§Viteã¯ã©ã¤ãã©ãªã®å¯¾å¿ç¶æ³ãã¾ã é²è¡ä¸ãªé¨åãããã¾ããä¾ãã°ãç»åå帰ãã¹ããã¼ã«ã§ããChromaticã§ã¯ãSnapShotæ°ã忏ããããã®TurboSnapãViteã§æå¹ã«ããã«ã¯ãexperimentalãªpluginãå©ç¨ããªããã°ãªãã¾ããããã ãç¾ç¶ã®Viteã®äººæ°ãã©ã¤ãã©ãªã¨ãã¦ã®å°æ¥æ§ãèããã¨ãããããã¨ã³ã·ã¹ãã ãä»å¾ã¾ãã¾ãæçãã¦ãããã¨ãæå¾ ã§ãã¾ãã
ã«ã¼ãã£ã³ã°ã®å®è£
Visitã®ã«ã¼ãã£ã³ã°ã©ã¤ãã©ãªã«ã¯ãGitHub Starsçãåèã«ãReact Routerãæ¡ç¨ãã¾ããã
Next.jsã®Pages Routerã¨æ¯è¼ããã¨ãReact Routerã§ã¯Nested Routesãå©ç¨ã§ããã¨ããã¡ãªãããããã¾ããããã®ä¸æ¹ã§åå®å ¨ã§ã¯ãªãã¨ããåé¡ãå¤ãææããã¦ãã¾ããRoconãreact-router-typingã®ãããªååé¡ã«å¯¾å¦ããã©ã¤ãã©ãªãããã¤ãéçºããã¦ãã¾ãããNext.jsã§ã®pathpidaã®ãããªããã¡ã¯ãã¹ã¿ã³ãã¼ãã¨ãªããããªã©ã¤ãã©ãªã¯ãªãããã«æãã¾ããçµæã¨ãã¦ãVisitã§ããããã®ã©ã¤ãã©ãªãåèã«ãã«ã¼ãã£ã³ã°ãåå®å ¨ã«æ±ãããã®æ©æ§ãèªåã§å®è£ ãããã¨ã«ãªãã¾ããã
ã³ã¼ãåå²ã«é¢ãã¦ã¯ãReact.lazyãå©ç¨ãã¦ãã¼ã¸åä½ã§ã®Splittingãè¨å®ãã¦ãã¾ãã ãã ãViteã«éããã§ããããã«ãã®ææç©ã§ããjsãã¡ã¤ã«åã«ããã·ã¥ãè¨è¼ãããé½åä¸ããããã¤æã«ãã«ããã¡ã¤ã«ãç½®æãã¦ãã¾ãã¨ã¢ã»ãããè¦ã¤ããããã¢ããªã±ã¼ã·ã§ã³ã¨ã©ã¼ãçºçãã¦ãã¾ãã¨ããåé¡ãããã¾ãã
ãã¡ãã®è¨äºã«ããããã«ããã¤ãã®å¯¾çãèãããã¾ãããVisitã§ã¯å®è£ ã³ã¹ããèãã以ä¸ã®ä¸ä¾ã®ããã«ã¨ã©ã¼ããã£ãããã¦ãã³ããªã³ã°ãè¡ããã¨ã§åé¿ãã¦ãã¾ãã
const LazyComponent = React.lazy(() => import("/hoge").catch(() => { // ã¨ã©ã¼ãã¼ã¸ã®è¡¨ç¤ºããªãã¼ãçã®å¦ç }));
Reactã®ããã¥ã¡ã³ãã§ãå¿ åããã¦ããéãããã¬ã¼ã ã¯ã¼ã¯ã«é ¼ããªãåããã®ããã«èªåã§æè¡é¸å®ãæè¡ç課é¡ã«å¯¾å¦ãããã¨ãæ±ãããã¾ããã
ã¤ã³ãã©è¦³ç¹ã§ã®çæç¹
SPAã§ã¯å½ç¶ãã«ã¼ã以å¤ã®URLã«ç´ã¢ã¯ã»ã¹ãããã¨ãã«ãindex.htmlãè¿ãå¿
è¦ãããã¾ããCloud Storageã§ã¯ãWebãµã¤ãã®æ§æã§404æã®fallbackã¨ãã¦index.htmlãæå®ãããã¨ã§ããã®æåãå®ç¾ã§ãã¾ãã
ãã ããCloud Storageã§ãã®ããã«fallbackããããã¼ã¸ã¯ãæ£ããåå¾ã§ãããã®ã®ã¹ãã¼ã¿ã¹ã³ã¼ã404ã§è¿ããã¦ãã¾ãã¾ããã¢ããªã±ã¼ã·ã§ã³ã¸ã®å½±é¿ã¯ãªãã®ã§ãããConsoleãNetworkä¸ã§ã¯ã¨ã©ã¼è¡¨ç¤ºããã¦ãã¾ããã¨ã¨ãããã©ã¼ãã³ã¹åæãã¼ã«ã§ããLighthouseãå®è¡ã§ããªããã¨ãåé¡ã§ããã


ããã¯ãStatic Exportsã®ç« ã§ç´¹ä»ããLoad Balancerã§ã®ãã¹ã®ãªã©ã¤ãã«ãã£ã¦è§£æ±ºã§ãã¾ããã¤ã³ãã©ã®å¤æ´ãé¿ãããå ´åã¯ãvite previewã§ããã°404ãè¿ããããã¨ã¯ãªãã®ã§ããã¼ã«ã«çã§ãã«ãã»ãã¬ãã¥ã¼ããã°Lighthouseã®å®è¡ãå¯è½ã§ããã¡ãªã¿ã«App Engineãå©ç¨ããå ´åã¯ããããfallbackã®è¨å®ããªãããããããã«ãããã¹ã®ãªã©ã¤ãè¨å®ãè¡ããªããã°ãªãã¾ããã
ãã®ä»ã«ããããã¤å ã§ããGoogle Cloudã®ãµã¼ãã¹ã®å·®ç°ãããã¾ãã
ä¸ä¾ã¨ãã¦ãApp EngineããNext.jsã®ãããã¤å ã®ç¬¬ä¸åè£ã§ããCloud Runã«ã¯ãã©ãã£ãã¯ç®¡çæ©è½ããããã«ããªã¢ãªãªã¼ã¹ãA/Bãã¹ãã«å©ç¨ã§ãã¾ããé害æã«ç´ æ©ãåã®ãªãã¸ã§ã³ã«åãæ»ã対å¿ãå¯è½ãªç¹ãå¼·ã¿ã§ããCloud Storageã«ã¯ããã¾ã§å å®ããæ©è½ã¯ããã¾ãããããªãã¸ã§ã¯ãã®ãã¼ã¸ã§ãã³ã°ã«ããåã®ãã¼ã¸ã§ã³ã¸ã®å¾©å æ©è½ã¯ãµãã¼ãããã¦ãã¾ãã
ããããã¤ã³ãã©é¢ã§ã®å·®ç°ããè¦ä»¶ã«ãã£ã¦ã¯éè¦ãªæè¡é¸å®ã®è¦ç´ ã¨ãªãå ´åãèãããã¾ãã
ã¾ã¨ã
Next.jsã®å°é ã«ããã æè¿ã§ã¯ç®¡çç»é¢ç³»ã®ãããã¯ãã§ãNext.jsãæ¡ç¨ããäºä¾ãå¢ãã¦ããããã«æãã¾ãããVisitã§ã¯ã³ã¹ãã¨å¤©ç§¤ã«ãããçµæãVite + Reactã®SPAã鏿ãã¾ããã
ãªãä»åã®çµè«ã¯ããã¾ã§Visitã®è¦ä»¶ã«ç §åããçµæã§ãã£ã¦ãããããã®é¸æè¢ãåªãã¦ããã¨ãããã¨ã主張ãããã®ã§ã¯ããã¾ãããéè¦ãªã®ã¯ãããã¯ãããã¼ã ã®è¦ä»¶ã«åããã¦æè¡é¸å®ãè¡ããã¨ã ã¨èãã¦ãã¾ãã
ã¾ããNext.jsèªä½ã¯è¤éãã«å¯¾ããçåã¯æãããã¦ã¯ãããã®ã®ããã«ã¹ã¿ãã¯ãã¬ã¼ã ã¯ã¼ã¯ã¨ãã¦æ¥éã«é²åãç¶ãã¦ããéè¦ãªæè¡ã§ãããããããã³ãã¨ã³ãã¨ã³ã¸ãã¢ã¨ãã¦ãã£ããã¢ããã¯ç¶ãã¦ãããªããã°ãªããªãã¨æãã¦ãã¾ãã
æå¾ã¾ã§èªãã§ããã ããããã¨ããããã¾ãããææ¥ã®è¨äºã¯ç¦ç°ããã®ã¢ãã¬ããå°å ¥ãã¦éçºå¹çãä¸ããã§ãããã²ã覧ãã ããï¼
ã¾ããBuySell Technologiesã§ã¯ããã³ãã¨ã³ãã¨ã³ã¸ãã¢ãçµ¶è³åéä¸ã§ãããã¡ããèå³ã®ããæ¹ã¯ãã²ã確èªãã ããï¼