
ã©ããŸã§ããã³ãïŒ ã©ããã APIïŒ ã Next.js à Hono ã®è²¬ååæ ãæŽçããèšé² ã
åå¥çŽ ã» å¢çã®å 決ã ã» å±€ã®èãæ¹ â 3 ã€ã®åºæºã§ç·åŒããã
ãã©ããŸã§ããã³ãã§ãã©ããã API ãã
Next.js ã§ UI ãæžããHono ã§ API ãæžãã
ãããªæ§æã«ãããšãããã®åãã«çããããè¿·ã£ãããšã¯ãããŸãããïŒ
åããå人éçºã§ããã³ããš API ãäž¡æ¹è§Šããªãããåã®é£ãéãã§æ·±å€ãããã°ãç¹°ãè¿ããŸããã
壿ã¡ã®ãªãã§ãããã³ããš API ã®è²¬ååæ
ããã©ããªåºæºã§ç·åŒãããŠãããïŒããšèªåã«åãçŽããããããæŽçã§ããèšé²ãå
±æããŸãã
ãã©ãã§äœããããã ãæºããŠãã
ã¿ãªããã¯ãNext.js ãš Hono ã䜵çšããŠããŸããïŒ
ãããã¯ãNext.js ã® App Router ãš Server Actions ã ãã§å®çµããã€ã€ããã¡ãã£ãšãã API ã Hono ã§åãåºãããããšèããŠããæ¹ããããããããŸããã
åã¯å人éçºã§ãããã³ãã« Next.jsãAPI ã« Hono ãšããæ§æãåã£ãŠããŸãã
æ¡ä»¶ã§ã¯ Next.js ã®å€§èŠæš¡ã¢ããªããå人ããŒããã©ãªãªãµã€ãã§ã¯ Hono ãè§Šãæ©äŒããããŸããã
ãšãããããã©ããŸã§ããã³ãã§ãã©ããã API ãããããã£ãšææ§ã ã£ãã®ã§ãã
Server Actions ãæžããšãããããªããŒã·ã§ã³ã¯ã©ãã§ïŒããèªå¯ã¯ïŒããš Action ããšã«æºããã
Hono ã®ããã«ãŠã§ã¢ãç©ããšãããã©ããŸã§å
±éåãã¹ãããã§è¿·ãã
ããã³ããš API ã®ããã ã§åãé£ãéã£ãŠãã©ã³ã¿ã€ã ã§çºèŠããã
ãããšãããã£ãäžã€ã®å°ã㪠API ãäœãããã ãã« Next.js ã®ãããžã§ã¯ããç«ã¡äžããŠããŸããã
create-next-app ãæã¡ããããã /api/hello ã«ã¢ã¯ã»ã¹ã§ãããšããå¿ã«æµ®ããã ã®ã¯éææã§ã¯ãªããããçš®ã®ãã©ãããã§ããã
ãåã¯ãã ãå°ããªãã©ãã¯å°å±ã建ãŠããã ããªã®ã«ããŸãã§å·šå€§ãªåãç¯ããŠãããããªæ°åã âŠã
ãã®æèŠãšããã©ãã§äœãããããã®ææ§ããéãªã£ãŠãç·åŒãã®åºæºã欲ãããšåŒ·ãæããããã«ãªããŸããã
åã®é£ãéãã§æ·±å€ãããã°ãç¹°ãè¿ãã
åãå人éçºã§ããã³ããš API ãäž¡æ¹è§Šã£ãŠãããšããäœåºŠããèšã£ãèšããªããã«è¿ãããšãèµ·ããŸããã
ð API ã®ã¬ã¹ãã³ã¹ã« createdAt ã远å ãããããã³ã㯠created_at ãæåŸ ããŠããã
ð ããã³ãã§ããã®åã§åãåãããšæ±ºããŠããã®ã«ãAPI åŽã§ãã£ãŒã«ãåãå€ããŠããŸã£ãã
ð 仿§ã¯å£é ããã£ããã§å ±æããŠããããåãšããŠæ®ã£ãŠããªãã£ãã
ãã®ãã³ã«ãããã³ãã§ã©ã³ã¿ã€ã ãšã©ãŒã衚瀺厩ããèµ·ããåå ã远ãæéã奪ãããŸããã
æ·±å€ãç»é¢ãšãã°ãçšã¿ãªããããªãã§åããªããã ããšé ãæ±ããçµéšããããŸãã
ãèšã£ãèšããªãããé²ãã«ã¯ãåãå¥çŽãšããŠææåãããããªãã
ããæ°ã¥ããŠãããClient / Server äž¡åŽããåãæããèšèšã«åãæ¿ããŸããã
åå¥çŽã®è©±ã¯ã以åãèšã£ãèšããªããé²ããããã³ããš API ã®åå¥çŽãã§è©³ããæžããŠããŸãã
ã§ããåãæããŠãããã©ãã§äœãããããã®ç·åŒãã¯ããŸã ææ§ãªãŸãŸã§ããã
壿ã¡ã§åãçŽãã ã責ååæ ã®åºæºã
鱿«ã®å·çãããŒã§ãçŽ æããåããã«å€æããç¿æ £ããããŸãã
ãããšãããããªæçãããŒãã«ã«äžŠã³ãŸããã
ãHono ã® middlewareãã©ããŸã§å ±éåãã¹ããè¿·ã£ãã
ãããçåæã«å€æãããšããããªããŸãã
ãããã³ããš API ã®è²¬ååæ ããã©ããªåºæºã§ç·åŒãããŠãããïŒã
ãã®åãããåã®é ã®ãªãã§ãã£ãšåŒã£ããã£ãŠããŸããã
åå¥çŽã¯ãäœãæž¡ããäœãåãåãããã®è©±ã
ã§ãã
ãã©ãã§ããªããŒã·ã§ã³ãããã
ãã©ãã§èªå¯ãããã
ãããã³ããš API ã®å¢çãã©ãã«çœ®ããã
ãã®åºæºããèšèªåã§ããŠããªãã£ãã®ã§ãã
Server Actions ã®èšäºã§ãå¢çãå
ã«æ±ºããããšæžãããšããåãæèŠããããŸããã
ãã©ãã§ãããããæ±ºãŸã£ãŠããªããšã远å ã®ãã³ã«æºããã
å®è£ ãæžãå§ããåã«ã責ååæ ã®åºæºã決ããŠããã
ãã®æ¹éã§ãåã詊è¡é¯èª€ã®æ«ã«èŸ¿ãçãã 3 ã€ã®åºæºãæŽçããŸãã
責ååæ ãæŽçãã 3 ã€ã®åºæº
åããã©ããŸã§ããã³ãã§ãã©ããã API ãããç·åŒããããšãã«äœ¿ã£ãŠããã®ã¯ã次㮠3 ã€ã§ãã
ãåºæº 1ã åå¥çŽ â ãäœãæž¡ãã äœãåãåããã ãå ±æãã
ããã³ããš API ã®ããã ã§ã¯ãåãå¥çŽã«ãªããŸãã
人éå士ã®ãèšã£ãèšããªããã«ã¯è°äºé²ãããã
ããã³ããš API ã®ãèšã£ãèšããªããã«ã¯åãããã
ããæãçŽããŠãããåã®èšèšã¯å€ãããŸããã
ãªã¯ãšã¹ãã®åãã¬ã¹ãã³ã¹ã®åããšã©ãŒã®åã
ãããããã©ã¡ããäžæ¹ã ããæã€ã®ã§ã¯ãªããäž¡åŽã§åç
§ã§ãã圢ã§çœ®ãã
â å
±æããã±ãŒãžã«åã眮ããäž¡åŽãã import ãã
â Zod ã¹ããŒãããæ£ããšããããããåãæšè«ãã
â OpenAPI ããåãçæãã
ã©ã®æ¹åŒãéžã¶ãã¯ãããžã§ã¯ãã®èŠæš¡ã«ãããŸãã
倧åãªã®ã¯ãåå®çŸ©ãäžç®æã«ãããäž¡åŽããããåç
§ããŠããããšã§ãã
åå¥çŽãç Žã£ãç¬éãã³ã³ãã€ã«ãšã©ãŒãåºãã
ãèšã£ãèšããªããã¯ãã©ã³ã¿ã€ã ã§ã¯ãªããã«ãæã«æ€ç¥ã§ããã
ããã責ååæ
ã®åå°ã«ãªããŸãã
ãåºæº 2ã å¢çã®å 決ã â ãã©ãã§äœããããã ãå®è£ åã«æ±ºãã
å¢çãšã¯ããã©ã®ã¬ã€ã€ãŒã§ãäœãæ åœããããã®ç·åŒãã§ãã
ð ããªããŒã·ã§ã³:
å
¥åããæ£ãã圢ãããã©ãã§ãã§ãã¯ããã
ð èªå¯:
ããã®ãŠãŒã¶ãŒããã®æäœãããŠãããããã©ãã§ãã§ãã¯ããã
ð ãšã©ãŒ:
倱æãããšããåŒã³åºãå
ã«ã©ãè¿ãã
ãã® 3 ã€ãããã¡ã®ãããžã§ã¯ãã§ã¯ããããããšå ã«æ±ºããŠãããšãè¿·ããæ¶ããŸãã
Next.js ã® Server Actions ãªããããªããŒã·ã§ã³ã¯ Action ã®å
¥å£ã§ã
ä¿¡é Œã®å¢çã¯ãµãŒããŒã«çœ®ãã
Hono ã® API ãªããèªèšŒã¯ããã«ãŠã§ã¢ã§ãããžãã¹ããžãã¯ã¯ã«ãŒããã³ãã©ã§ã
å®è£
ãæžãå§ããåã«ãå¢çãæ±ºããŠããã
ããã ãã§ãäžè²«ããèšèšã«ãªããŸãã
ãåºæº 3ã å±€ã®èãæ¹ â 責åãåé¢ãã ç©ã¿æšã®ããã«éãã
Hono ã®ããã«ãŠã§ã¢ããç©ã¿æšããšããŠæãçŽãã話ã¯ã以åããªããšãªãããã«ãŠã§ã¢ã忥ãããHono ã§åŠãã å±€ã®èãæ¹ãã§æžããŸããã
æäžå±€:
ãšã©ãŒãã³ããªã³ã°
ðïž ã©ãã§äœãèµ·ããŠãåãæ¢ãã
äžéå±€:
ãã°
ðïž ãã¹ãŠã®ãªã¯ãšã¹ããèšé²ãã
äžå±€:
èªèšŒ
ðïž èš±å¯ããããªã¯ãšã¹ãã ããéã
å°è¡š:
ã«ãŒããã³ãã©
ðïž ããžãã¹ããžãã¯ã ã
ãã®ãå±€ãã®èãæ¹ã¯ãNext.js ã® Server Actions ã«ãéããŸãã
ãServer Actions ã®å¢çãå
ã«æ±ºãããã§ãããªããŒã·ã§ã³ã»èªå¯ã»ãšã©ãŒã®ãã©ãã§ãããããå
ã«æ±ºããéèŠæ§ãæžããŸããã
ãã¬ãŒã ã¯ãŒã¯ã¯éã£ãŠããèšèšã®ååã¯åãã
ã責åãåé¢ããå±€ãéããã
ãã®èãæ¹ã身ã«ã€ããšãNext.js ã§ã Hono ã§ããããªããšãªãããã忥ã§ããŸãã
ãå ·äœçãªç·åŒãã Next.js ãš Hono ã®åœ¹å²åæ
ããããã¯ãåãå®éã«æ¡çšããŠãããããã³ããš API ã®åœ¹å²åæ ãããããå°ãå ·äœçã«å ±æããŸãã
Next.js ïŒããã³ãïŒ ãæ ãããš
UI ã®æç»:
â ã³ã³ããŒãã³ããã¬ã€ã¢ãŠããã¹ã¿ã€ãªã³ã°
ãã©ãŒã ãš UX:
â å ¥åãããªããŒã·ã§ã³ã®å è¡ãã§ãã¯
ãïŒZod ã§ãµãŒããŒãšåãã¹ããŒãã䜿çšïŒ
Server Actions:
â ãã©ãŒã éä¿¡ãmutation
â ããªããŒã·ã§ã³ã¯ Action ã®å ¥å£ã§å¿ ãè¡ã
â ä¿¡é Œã®å¢çã¯ãµãŒããŒ
èªå¯ãã§ãã¯:
â ãã°ã€ã³æžã¿ãã©ãããæš©éããããã©ãã
â Action ã®å é ã§ç¢ºèªãã
Next.js ã¯ããŠãŒã¶ãŒã«è¿ãåŽãã®è²¬åãæ
ããŸãã
衚瀺ãå
¥åãéä¿¡ããããŠãµãŒããŒãžã®ãäŸé ŒããŸã§ã
Hono ïŒAPIïŒ ãæ ãããš
ããžãã¹ããžãã¯:
â DB ã¢ã¯ã»ã¹ãå€éš API åŒã³åºããèšç®
èªèšŒã»èªå¯:
â ããŒã¯ã³æ€èšŒãæš©éãã§ãã¯
â ããã«ãŠã§ã¢ã§å±€ãšããŠåé¢
ãã°ã»ãšã©ãŒ:
â ãªã¯ãšã¹ãã®èšé²ãäŸå€ã®åãæ¢ã
â ãããããã«ãŠã§ã¢ã§å±€ãšããŠåé¢
ã¬ã¹ãã³ã¹ã®åä¿èšŒ:
â å ±æåå®çŸ©ã«æ²¿ã£ãŠã¬ã¹ãã³ã¹ãè¿ã
â Zod ã§ã©ã³ã¿ã€ã ããªããŒã·ã§ã³ãè¡ã
Hono ã¯ãããžãã¹ããžãã¯ãšã€ã³ãã©ã«è¿ãåŽãã®è²¬åãæ
ããŸãã
ããã³ããããããããããŒã¿ã欲ããããšäŸé Œãåããåå¥çŽã«æ²¿ã£ãŠè¿ãã
å¢çãæ±ºãããšãã®ãã§ãã¯ãªã¹ã
æ°ããæ©èœã远å ãããšããåã¯æ¬¡ã® 3 ã€ã確èªããŠããŸãã
1ïžâ£ åã¯å
±æå®çŸ©ããåç
§ããŠãããïŒ
ðïž ããã³ããš API ã§å¥ã
ã«åãæžããŠããªãã
2ïžâ£Â ããªããŒã·ã§ã³ã»èªå¯ã»ãšã©ãŒã®ãã©ãã§ããããã¯æ±ºãŸã£ãŠãããïŒ
ðïž ååãšæºããŠããªãã
3ïžâ£Â å±€ã®é çªã«æå³ããããïŒ
ðïž ããªããã®é çªããã説æã§ããã
ãã® 3 ã€ãå®ãã ãã§ãã責ååæ ã®è¿·ãã¯ããªãæžããŸãã
å¢çãææ§ã ã£ããšãã®å€±æäŸ
åãå¢çãææ§ã«ããŠããé ã¯ããããªããšãèµ·ããŠããŸããã
ð Server Action ã«ãã£ãŠãããªããŒã·ã§ã³ãã¯ã©ã€ã¢ã³ãã§ãããã®ãšãµãŒããŒã ãã§ãããã®ãæ··åšããŠãã
ð èªå¯ãã§ãã¯ã®æç¡ã Action ããšã«ãã©ãã©ã§ããååã¯ã©ãæžããã£ãããšæ¯åæ©ãã
ð Hono ã®ã«ãŒããã³ãã©ã«ããã°åºåãšèªèšŒãã§ãã¯ãšããžãã¹ããžãã¯ãåå± ããŠãã
ãåããŠããããããŸããããã
ããæã£ãŠãã 3 ã¶æåŸã®åã¯ãèªåã®ã³ãŒããèªã¿è¿ãã®ãæããªã£ãŠããŸããã
å¢çãå
ã«æ±ºããŠãããå®è£
ãæžãå§ããã
ãã®ç¿æ
£ãã€ããŠãããã³ãŒãã®äžè²«æ§ãé©ãã»ã©äžãããŸããã
責ååæ ã¯ã äžåºŠæ±ºããŠçµããã§ã¯ãªã
責ååæ ã®åºæºã¯ããããžã§ã¯ãã®æé·ãšãšãã«èŠçŽããŠãããã®ã§ãã
æåã¯ãåå¥çŽããšãå¢çã®å
決ããã ãã§ãååã
èŠæš¡ã倧ãããªã£ããããå±€ã®èãæ¹ããããã«ãŠã§ã¢èšèšã«é©çšããã
Next.js ãš Hono ã®çµã¿åããã«æ£è§£ã¯ãããŸããã
倧åãªã®ã¯ããã©ãã§äœããããããèªåãªãã®åºæºã§èšèªåããäžè²«ããŠå®ãããš ã§ãã
ãããã³ããš API ã®è²¬ååæ ããã©ããªåºæºã§ç·åŒãããŠãããïŒã
ãã®åããã鱿«ã®å£æã¡ã§èªåã«æããããŠã¿ãŠãã ããã
çããèšèªåããã ãã§ãèšèšããã£ãšæ¥œã«ãªããŸãã
ã²ãšãããš
åã®é£ãéãã§æ·±å€ãããã°ãããçµéšã¯ãä»ã§ãå¿ããŸããã
ãèšã£ãèšããªãããé²ãåå¥çŽãšããã©ãã§äœããããããå
ã«æ±ºããå¢çèšèšã
ãã® 2 ã€ãèšèªåããŠããã責ååæ
ã®è¿·ãã¯ããªãæžããŸããã
ããã³ããš API ã®ç·åŒãã«æ©ãã§ããæ¹ãžã
ãŸãã¯ãåå¥çŽããšãå¢çã®å
決ããã® 2 ã€ã ããèªåãªãã®ã«ãŒã«ã«ããŠã¿ãŸãããã

ããããŠèªã¿ãã
⌠åå¥çŽã®å ·äœçãªèšèšãç¥ããããšãã«
åãå¥çŽãšããŠææåããå
±æåãã¡ã€ã«ã»Zod ã¹ããŒãã»OpenAPI ã® 3 ãã¿ãŒã³ã解説ã
責ååæ
ã®åå°ãšãªãåèšèšã®å®è·µäŸã§ãã
⌠Hono ã®å±€ã®èãæ¹ãç¥ããããšãã«
ããã«ãŠã§ã¢ããç©ã¿æšããšããŠèšèšããèãæ¹ã
ãšã©ãŒ â ãã° â èªèšŒã®é çªã®ããªãããèšèªåããæ¹æ³ãå
±æããŠããŸãã
⌠Server Actions ã®å¢çèšèšãç¥ããããšãã«
ãã©ãã§ãããããå®è£
åã«æ±ºããéèŠæ§ã
Next.js åŽã®å¢çèšèšã®å
·äœäŸã§ãã
⌠æè¡éžå®ã®å€é·ãç¥ããããšãã«
Next.js ãš Hono ãã©ãçµã¿åãããããæè¡éžå®ã®èæ¯ã解説ããŠããŸãã
⌠Hono ãšã®åºäŒããç¥ããããšãã«
å°ã㪠API ã« Next.js ãéããšæãããšããHono ãšåºäŒããŸã§ã®ç©èªã§ãã
次ã®äžæ©ãäžç·ã«æ±ºãã ãäœæŠäŒè°å®€ã ãž
責ååæ
ã®ç·åŒãããåå¥çŽã»å¢çèšèšã®å
·äœçãªå®è£
ã
ããããæè¡çãªèšèšã®æ©ã¿ã¯ãã¡ã³ããŒã·ãããããªãŒã©ã³ã¹éçºè
ã®äœæŠäŒè°å®€ãã§æ¯é±å
±æããŠããŸãã
Next.js ãš Hono ã®çµã¿åããäŸãå ±æåããã±ãŒãžã®æ§æãããã«ãŠã§ã¢ã®ç©ã¿æ¹ãªã©ããã®èšäºã§ã¯æžããããªãã£ã现ãã工倫ããäœæŠäŒè°å®€ã§ã¯ãå ·äœç©ããšããŠãå±ãããŠããŸãã
責ååæ ã®åºæºããäžç·ã«ç£šããŠãããŸãããïŒ