šŸš€ Astroćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æå…„é–€ļ¼šę¬”äø–ä»£ć®Webć‚µć‚¤ćƒˆę§‹ēÆ‰ć‚’ćÆ恘悁悈恆ļ¼

Web開ē™ŗ

Web開ē™ŗ恮äø–ē•ŒćÆåøøć«é€²åŒ–ć—ć¦ćŠć‚Šć€ę–°ć—ć„ćƒ„ćƒ¼ćƒ«ć‚„ćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æ恌ē™»å “恗ē¶šć‘ć¦ć„ć¾ć™ć€‚ćć®äø­ć§ć‚‚čæ‘幓态ē‰¹ć«ę³Øē›®ć‚’é›†ć‚ć¦ć„ć‚‹ć®ćŒć€ŒAstroć€ć§ć™ć€‚ć“ć®ćƒ–ćƒ­ć‚°čؘäŗ‹ć§ćÆ态AstroćØćÆä½•ć‹ć€ćŖćœå¤šćć®é–‹ē™ŗ者恫éøć°ć‚Œć¦ć„ć‚‹ć®ć‹ć€ćć—ć¦åŸŗęœ¬ēš„ćŖä½æć„ę–¹ć«ć¤ć„ć¦ć€åˆåæƒč€…ć®ę–¹ć«ć‚‚åˆ†ć‹ć‚Šć‚„ć™ćč§£čŖ¬ć—ć¦ć„ćć¾ć™ć€‚āœØ

AstroćÆć€ć‚³ćƒ³ćƒ†ćƒ³ćƒ„é§†å‹•åž‹ć®Webć‚µć‚¤ćƒˆļ¼ˆćƒ–ćƒ­ć‚°ć€ćƒžćƒ¼ć‚±ćƒ†ć‚£ćƒ³ć‚°ć‚µć‚¤ćƒˆć€eć‚³ćƒžćƒ¼ć‚¹ć‚µć‚¤ćƒˆćŖ恩ļ¼‰ć‚’é«˜é€Ÿć«ę§‹ēÆ‰ć™ć‚‹ćŸć‚ć«čØ­čØˆć•ć‚ŒćŸć‚Ŗćƒ¼ćƒ«ć‚¤ćƒ³ćƒÆćƒ³ć®Webćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æ恧恙怂2021å¹“ć«ęœ€åˆć®ćƒćƒ¼ć‚øćƒ§ćƒ³ćŒćƒŖćƒŖćƒ¼ć‚¹ć•ć‚Œć€ęÆ”č¼ƒēš„ę–°ć—ć„ćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æć§ć™ćŒć€ćć®é©ę–°ēš„ćŖć‚¢ćƒ—ćƒ­ćƒ¼ćƒćØé«˜ć„ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ć§ę€„é€Ÿć«äŗŗę°—ć‚’é›†ć‚ć¦ć„ć¾ć™ć€‚

Astroć®ęœ€å¤§ć®ē‰¹å¾“ćÆć€ć€Œć‚¢ć‚¤ćƒ©ćƒ³ćƒ‰ć‚¢ćƒ¼ć‚­ćƒ†ć‚Æćƒćƒ£ļ¼ˆIslands Architectureļ¼‰ć€ćØå‘¼ć°ć‚Œć‚‹ę–°ć—ć„ćƒ•ćƒ­ćƒ³ćƒˆć‚Øćƒ³ćƒ‰ć‚¢ćƒ¼ć‚­ćƒ†ć‚Æćƒćƒ£ć‚’ęŽ”ē”Ø恗恦恄悋ē‚¹ć§ć™ć€‚ć“ć‚Œć«ć‚ˆć‚Šć€äøč¦ćŖJavaScript悒č‡Ŗ動ēš„ć«å‰Šé™¤ć—ć€Webć‚µć‚¤ćƒˆć®čŖ­ćæč¾¼ćæ速åŗ¦ć‚’劇ēš„ć«å‘äøŠć•ć›ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚ä»–ć®å¤šćć®ćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚ÆćŒåˆęœŸč”Øē¤ŗć«å¤§é‡ć®JavaScript悒åæ…要ćØ恙悋恮恫åÆ¾ć—ć€AstroćÆćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ć‚¼ćƒ­JavaScript悒ē›®ęŒ‡ć—ć¾ć™ć€‚ć‚¤ćƒ³ć‚æ惩ć‚Æćƒ†ć‚£ćƒ–ę€§ćŒåæ…要ćŖéƒØ分ļ¼ˆć“ć‚Œć‚’ć€Œć‚¢ć‚¤ćƒ©ćƒ³ćƒ‰ć€ćØå‘¼ć³ć¾ć™šŸļøļ¼‰ć ć‘ć‚’éøꊞēš„ć«ćƒć‚¤ćƒ‰ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ļ¼ˆJavaScriptć‚’ęœ‰åŠ¹åŒ–ļ¼‰ć™ć‚‹ć“ćØć§ć€ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ćØć‚¤ćƒ³ć‚æ惩ć‚Æćƒ†ć‚£ćƒ–ę€§ć‚’äø”ē«‹ć•ć›ć¦ć„ć¾ć™ć€‚

šŸ’” Astro恮äø»ćŖē‰¹å¾“

  • ć‚µćƒ¼ćƒćƒ¼ćƒ•ć‚”ćƒ¼ć‚¹ćƒˆ: é‡ć„ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°å‡¦ē†ć‚’ć‚µćƒ¼ćƒćƒ¼å“ć§č”Œć„ć€ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆļ¼ˆćƒ–ćƒ©ć‚¦ć‚¶ļ¼‰ć®č² č·ć‚’č»½ęø›ć—ć¾ć™ć€‚
  • ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ć‚¼ćƒ­JS: äøč¦ćŖJavaScriptć‚’ęŽ’é™¤ć—ć€åˆęœŸčŖ­ćæč¾¼ćæć‚’é«˜é€ŸåŒ–ć—ć¾ć™ć€‚
  • ć‚¢ć‚¤ćƒ©ćƒ³ćƒ‰ć‚¢ćƒ¼ć‚­ćƒ†ć‚Æćƒćƒ£: ć‚¤ćƒ³ć‚æ惩ć‚Æćƒ†ć‚£ćƒ–ćŖUIć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆļ¼ˆć‚¢ć‚¤ćƒ©ćƒ³ćƒ‰ļ¼‰ć ć‘ć‚’éøꊞēš„ć«ćƒć‚¤ćƒ‰ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć—ć¾ć™ć€‚
  • č‡Ŗē”±ćŖUIćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æ: React, Vue, Svelte, SolidJS, Lit ćŖć©ć€å„½ćæ恮UIćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æ悒ēµ„ćæåˆć‚ć›ć¦åˆ©ē”Øć§ćć¾ć™ć€‚č¤‡ę•°ć®ćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æć‚’åŒäø€ćƒšćƒ¼ć‚øå†…ć§ę··åœØ恕恛悋恓ćØ悂åÆčƒ½ć§ć™ć€‚
  • ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³: Markdown悄MDXćƒ•ć‚”ć‚¤ćƒ«ć®ē®”ē†ć€ćƒćƒŖćƒ‡ćƒ¼ć‚·ćƒ§ćƒ³ć€TypeScriptć«ć‚ˆć‚‹åž‹å®‰å…Øę€§ć‚’ć‚µćƒćƒ¼ćƒˆć—ć¾ć™ć€‚
  • é«˜ć„ć‚«ć‚¹ć‚æ惞悤ć‚ŗꀧ: Tailwind CSS态MDXćŖ恩态100仄äøŠć®ć‚¤ćƒ³ćƒ†ć‚°ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ćŒåˆ©ē”ØåÆčƒ½ć§ć™ć€‚
  • View Transitions APIć®ć‚µćƒćƒ¼ćƒˆ: Astro 3.0 (2023幓8꜈ćƒŖćƒŖćƒ¼ć‚¹) ć‹ć‚‰ć€ćƒšćƒ¼ć‚ø遷ē§»ę™‚ć®ć‚¢ćƒ‹ćƒ”ćƒ¼ć‚·ćƒ§ćƒ³ć‚’ć‚¹ćƒ ćƒ¼ć‚ŗ恫恙悋View Transitions APIć‚’ćƒć‚¤ćƒ†ć‚£ćƒ–ć‚µćƒćƒ¼ćƒˆć—ć¦ć„ć¾ć™ć€‚ć“ć‚Œć«ć‚ˆć‚Šć€MPAļ¼ˆćƒžćƒ«ćƒćƒšćƒ¼ć‚øć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ļ¼‰ć§ć‚ć‚ŠćŖ恌悉SPAļ¼ˆć‚·ćƒ³ć‚°ćƒ«ćƒšćƒ¼ć‚øć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ļ¼‰ć®ć‚ˆć†ćŖ껑悉恋ćŖćƒ¦ćƒ¼ć‚¶ćƒ¼ä½“éØ“ć‚’ęä¾›ć§ćć¾ć™ć€‚

Astro恮čØ­čØˆę€ęƒ³ćÆć€Œć‚³ćƒ³ćƒ†ćƒ³ćƒ„é§†å‹•ć€ć€Œć‚µćƒ¼ćƒćƒ¼ćƒ•ć‚”ćƒ¼ć‚¹ćƒˆć€ć€Œćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§é«˜é€Ÿć€ć€Œē°”å˜ć«ä½æ恈悋怍怌開ē™ŗč€…ć‚’é‡č¦–ć€ćØ恄恆5ć¤ć®åŽŸå‰‡ć«åŸŗć„ć„ć¦ć„ć¾ć™ć€‚ē‰¹ć«ć€ć€ŒAstro恧遅恄Webć‚µć‚¤ćƒˆć‚’ä½œć‚‹ć®ćÆäøåÆčƒ½ć§ć‚ć‚‹ć¹ćć ć€ćØ恄恆ē›®ęØ™ć‚’ęŽ²ć’ć¦ć„ć‚‹ē‚¹ćÆć€ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ćøć®å¼·ć„ć“ć ć‚ć‚Šć‚’ē¤ŗć—ć¦ć„ć¾ć™ć€‚

2. Astro悒ćÆ恘悁悋ęŗ–å‚™ šŸ› ļø

Astro惗惭ć‚ø悧ć‚Æćƒˆć‚’é–‹å§‹ć™ć‚‹ć®ćÆ非åøø恫ē°”å˜ć§ć™ć€‚Node.js (v16.12.0仄降ęŽØå„Ø) ćŒć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć•ć‚Œć¦ć„ć‚‹ē’°å¢ƒć§ć‚ć‚Œć°ć€ä»„äø‹ć®ć‚³ćƒžćƒ³ćƒ‰ć‚’å®Ÿč”Œć™ć‚‹ć ć‘ć§ć™ć€‚

# npm悒ä½æć†å “åˆ
npm create astro@latest

# yarn悒ä½æć†å “åˆ
yarn create astro

# pnpm悒ä½æć†å “åˆ
pnpm create astro

ć‚³ćƒžćƒ³ćƒ‰ć‚’å®Ÿč”Œć™ć‚‹ćØ态惗惭ć‚ø悧ć‚Æćƒˆåć‚„ä½æē”Øć™ć‚‹ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆć€TypeScript恮čح定ćŖ恩悒åÆ¾č©±å½¢å¼ć§éøęŠžć§ćć¾ć™ć€‚åˆåæƒč€…ć®ę–¹ćÆć€ć¾ćšćÆć‚·ćƒ³ćƒ—ćƒ«ćŖćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆļ¼ˆ`Empty` 悄 `Blog` ćŖ恩ļ¼‰ć‹ć‚‰å§‹ć‚ć‚‹ć®ćŒćŠć™ć™ć‚ć§ć™ć€‚

惗惭ć‚ø悧ć‚ÆćƒˆćŒä½œęˆć•ć‚ŒćŸć‚‰ć€ćƒ‡ć‚£ćƒ¬ć‚Æ惈ćƒŖ恫ē§»å‹•ć—ć¦ä¾å­˜é–¢äæ‚ć‚’ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć—ć€é–‹ē™ŗć‚µćƒ¼ćƒćƒ¼ć‚’čµ·å‹•ć—ć¾ć™ć€‚

# 惗惭ć‚ø悧ć‚Æćƒˆćƒ‡ć‚£ćƒ¬ć‚Æ惈ćƒŖ恫ē§»å‹•
cd your-project-name

# 依存関äæ‚ć‚’ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«
npm install

# 開ē™ŗć‚µćƒ¼ćƒćƒ¼ć‚’čµ·å‹•
npm run dev

開ē™ŗć‚µćƒ¼ćƒćƒ¼ćŒčµ·å‹•ć™ć‚‹ćØć€ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ćÆ `http://localhost:4321` ć§ć‚¢ć‚Æć‚»ć‚¹ć§ćć‚‹ć‚ˆć†ć«ćŖć‚Šć¾ć™ć€‚ćƒ–ćƒ©ć‚¦ć‚¶ć§é–‹ć„ć¦ć€Astroć®ć‚¦ć‚§ćƒ«ć‚«ćƒ ćƒšćƒ¼ć‚ø恌č”Øē¤ŗć•ć‚Œć‚Œć°ęˆåŠŸć§ć™ļ¼šŸŽ‰

惗惭ć‚ø悧ć‚Æćƒˆć®ę§‹é€ 

ä½œęˆć•ć‚ŒćŸćƒ—ćƒ­ć‚ø悧ć‚Æ惈ćÆ态仄äø‹ć®ć‚ˆć†ćŖåŸŗęœ¬ēš„ćŖćƒ‡ć‚£ćƒ¬ć‚Æ惈ćƒŖę§‹é€ ć‚’ęŒć£ć¦ć„ć¾ć™ć€‚

ćƒ‡ć‚£ćƒ¬ć‚Æ惈ćƒŖ/ćƒ•ć‚”ć‚¤ćƒ«čŖ¬ę˜Ž
src/惗惭ć‚ø悧ć‚Æćƒˆć®ć‚½ćƒ¼ć‚¹ć‚³ćƒ¼ćƒ‰ćŒå«ć¾ć‚Œć‚‹äø»č¦ćŖćƒ‡ć‚£ćƒ¬ć‚Æ惈ćƒŖ怂
src/pages/ć‚µć‚¤ćƒˆć®ćƒšćƒ¼ć‚øć‚’ä½œęˆć™ć‚‹å “ę‰€ć€‚ć“ć“ć«ć‚ć‚‹.astro, .md, .htmlćƒ•ć‚”ć‚¤ćƒ«ćÆč‡Ŗ動ēš„ć«ćƒšćƒ¼ć‚øćØć—ć¦ćƒ«ćƒ¼ćƒ†ć‚£ćƒ³ć‚°ć•ć‚Œć¾ć™ć€‚ćƒ•ć‚”ć‚¤ćƒ«ćƒ™ćƒ¼ć‚¹ćƒ«ćƒ¼ćƒ†ć‚£ćƒ³ć‚°ćŒęŽ”ē”Øć•ć‚Œć¦ć„ć¾ć™ć€‚
src/layouts/č¤‡ę•°ć®ćƒšćƒ¼ć‚øć§å…±ęœ‰ć•ć‚Œć‚‹ćƒ¬ć‚¤ć‚¢ć‚¦ćƒˆć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚’é…ē½®ć—ć¾ć™ć€‚ćƒ˜ćƒƒćƒ€ćƒ¼ć‚„ćƒ•ćƒƒć‚æćƒ¼ćŖć©å…±é€šć®UIę§‹é€ ć‚’å®šē¾©ć™ć‚‹ć®ć«ä¾æåˆ©ć§ć™ć€‚
src/components/再利ē”ØåÆčƒ½ćŖUIć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆļ¼ˆ.astroćƒ•ć‚”ć‚¤ćƒ«ć‚„ä»–ć®UIćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æć®ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆļ¼‰ć‚’配ē½®ć—ć¾ć™ć€‚
src/styles/ć‚°ćƒ­ćƒ¼ćƒćƒ«ćŖCSSćƒ•ć‚”ć‚¤ćƒ«ćŖć©ć‚’é…ē½®ć—ć¾ć™ć€‚
public/ē”»åƒć€ćƒ•ć‚©ćƒ³ćƒˆć€faviconćŖć©ć€ćƒ“ćƒ«ćƒ‰ćƒ—ćƒ­ć‚»ć‚¹ć§å‡¦ē†ć•ć‚ŒćŖ恄静ēš„ć‚¢ć‚»ćƒƒćƒˆć‚’é…ē½®ć—ć¾ć™ć€‚ć“ć“ć®ćƒ•ć‚”ć‚¤ćƒ«ćÆćć®ć¾ć¾ć‚µć‚¤ćƒˆć®ćƒ«ćƒ¼ćƒˆć«ć‚³ćƒ”ćƒ¼ć•ć‚Œć¾ć™ć€‚
astro.config.mjsAstro惗惭ć‚ø悧ć‚Æ惈恮čØ­å®šćƒ•ć‚”ć‚¤ćƒ«ć€‚ć‚¤ćƒ³ćƒ†ć‚°ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®čæ½åŠ ć‚„ćƒ“ćƒ«ćƒ‰ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć®å¤‰ę›“ćŖć©ć‚’č”Œć„ć¾ć™ć€‚
package.json惗惭ć‚ø悧ć‚Æćƒˆć®ä¾å­˜é–¢äæ‚ć‚„ć‚¹ć‚ÆćƒŖćƒ—ćƒˆćŒå®šē¾©ć•ć‚Œć¦ć„ć¾ć™ć€‚

3. Astroć®ć‚³ć‚¢ć‚³ćƒ³ć‚»ćƒ—ćƒˆ āœØ

Astro悒ä½æ恄恓ćŖ恙äøŠć§é‡č¦ćŖć€ć„ćć¤ć‹ć®ć‚³ć‚¢ć‚³ćƒ³ć‚»ćƒ—ćƒˆć‚’č¦‹ć¦ć„ćć¾ć—ć‚‡ć†ć€‚

Astroć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆ (.astroćƒ•ć‚”ć‚¤ćƒ«)

Astro恮åŸŗęœ¬ēš„ćŖę§‹ęˆč¦ē“ ćÆ怌Astroć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć€ć§ć™ć€‚ć“ć‚ŒćÆ.astroćØć„ć†ę‹”å¼µå­ć‚’ęŒć¤ćƒ•ć‚”ć‚¤ćƒ«ć§å®šē¾©ć•ć‚Œć¾ć™ć€‚HTMLć«ä¼¼ćŸę§‹ę–‡ć‚’ęŒć”ć¾ć™ćŒć€ć„ćć¤ć‹ć®ćƒ¦ćƒ‹ćƒ¼ć‚ÆćŖē‰¹å¾“ćŒć‚ć‚Šć¾ć™ć€‚

<!-- src/components/MyComponent.astro -->
---
// ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚¹ć‚ÆćƒŖ惗惈 (ćƒ•ćƒ­ćƒ³ćƒˆćƒžć‚æćƒ¼)
// JavaScript/TypeScriptć‚³ćƒ¼ćƒ‰ć‚’ć“ć“ć«ę›øćć¾ć™ć€‚
// 恓悌ćÆć‚µćƒ¼ćƒćƒ¼ć‚µć‚¤ćƒ‰ć§ć®ćæå®Ÿč”Œć•ć‚Œć¾ć™ć€‚
const name = "Astro";
const items = ["Item 1", "Item 2", "Item 3"];

// Propsć‚’å—ć‘å–ć‚‹ć“ćØć‚‚ć§ćć¾ć™
export interface Props {
  greeting?: string;
}
const { greeting = "Hello" } = Astro.props;
---
<!-- HTMLćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆ -->
<div class="card">
  <h2>{greeting}, {name}!</h2>
  <p>恓悌ćÆAstroć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć§ć™ć€‚</p>
  <ul>
    {items.map((item) => (
      <li>{item}</li>
    ))}
  </ul>
  <!-- ć‚¹ćƒ­ćƒƒćƒˆ: ä»–ć®ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‹ć‚‰ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚’å—ć‘å–ć‚‹å “ę‰€ -->
  <slot />
</div>

<!-- ć‚¹ć‚æć‚¤ćƒ« (ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ć‚¹ć‚³ćƒ¼ćƒ—ä»˜ć) -->
<style>
  .card {
    border: 1px solid #ccc;
    padding: 1rem;
    border-radius: 8px;
    background-color: #f9f9f9;
  }
  h2 {
    color: rebeccapurple;
  }
</style>

Astroć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆćÆäø»ć«3恤恮éƒØåˆ†ć§ę§‹ęˆć•ć‚Œć¾ć™ć€‚

  1. ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚¹ć‚ÆćƒŖ惗惈 (ć‚³ćƒ¼ćƒ‰ćƒ•ć‚§ćƒ³ć‚¹ --- 内): ć‚µćƒ¼ćƒćƒ¼ć‚µć‚¤ćƒ‰ć§å®Ÿč”Œć•ć‚Œć‚‹JavaScript/TypeScriptć‚³ćƒ¼ćƒ‰ć‚’ę›øćå “ę‰€ć§ć™ć€‚ćƒ‡ćƒ¼ć‚æć®ćƒ•ć‚§ćƒƒćƒć€å¤‰ę•°ć®å®šē¾©ć€propsć®å—ć‘å–ć‚ŠćŖć©ć‚’č”Œć„ć¾ć™ć€‚ć“ć“ć§å®šē¾©ć•ć‚ŒćŸå¤‰ę•°ćÆ态äø‹ć®HTMLćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆå†…ć§ę³¢ę‹¬å¼§{}悒ä½æć£ć¦å‚ē…§ć§ćć¾ć™ć€‚
  2. HTMLćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆ: ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć®HTMLę§‹é€ ć‚’å®šē¾©ć—ć¾ć™ć€‚é€šåøø恮HTMLć‚æć‚°ć«åŠ ćˆć€ä»–ć®Astroć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚„UIćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚’ć‚¤ćƒ³ćƒćƒ¼ćƒˆć—ć¦ä½æē”Øć§ćć¾ć™ć€‚JSXćƒ©ć‚¤ć‚ÆćŖ式ļ¼ˆ{variable}, {array.map(...)}, {condition && ...}ćŖ恩ļ¼‰ć‚’ä½æć£ć¦å‹•ēš„ćŖć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚’åŸ‹ć‚č¾¼ć‚€ć“ćØćŒć§ćć¾ć™ć€‚
  3. ć‚¹ć‚æć‚¤ćƒ« (<style>ć‚æć‚°å†…): ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć«é©ē”Ø恙悋CSS悒ę›øćć¾ć™ć€‚ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ćÆ态恓恓恫ę›øć‹ć‚ŒćŸć‚¹ć‚æć‚¤ćƒ«ćÆćć®ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆå†…ć§ć®ćæęœ‰åŠ¹ćŖć‚¹ć‚³ćƒ¼ćƒ—ä»˜ćCSSćØćŖć‚Šć¾ć™ć€‚ć“ć‚Œć«ć‚ˆć‚Šć€ć‚¹ć‚æć‚¤ćƒ«ćŒä»–ć®ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć«å½±éŸæ悒äøŽćˆć‚‹ć®ć‚’é˜²ćŽć¾ć™ć€‚ć‚°ćƒ­ćƒ¼ćƒćƒ«ćŖć‚¹ć‚æć‚¤ćƒ«ć‚’å®šē¾©ć—ćŸć„å “合ćÆ态<style is:global>悒ä½æē”Øć—ć¾ć™ć€‚

ćƒšćƒ¼ć‚ø (src/pages/)

src/pages/ ćƒ‡ć‚£ćƒ¬ć‚Æ惈ćƒŖć«é…ē½®ć•ć‚ŒćŸ .astro, .md, .markdown ćƒ•ć‚”ć‚¤ćƒ«ćÆ态č‡Ŗ動ēš„ć«ć‚µć‚¤ćƒˆć®ćƒšćƒ¼ć‚ø恫ćŖć‚Šć¾ć™ć€‚ćƒ•ć‚”ć‚¤ćƒ«åćŒćć®ć¾ć¾URLć®ćƒ‘ć‚¹ć«åƾåæœć—ć¾ć™ļ¼ˆćƒ•ć‚”ć‚¤ćƒ«ćƒ™ćƒ¼ć‚¹ćƒ«ćƒ¼ćƒ†ć‚£ćƒ³ć‚°ļ¼‰ć€‚

  • src/pages/index.astro ā†’ /
  • src/pages/about.astro ā†’ /about
  • src/pages/blog/post-1.md ā†’ /blog/post-1

動ēš„ćŖćƒ«ćƒ¼ćƒˆļ¼ˆä¾‹: /posts/[id]ļ¼‰ć‚‚ä½œęˆåÆčƒ½ć§ć™ć€‚ćƒ•ć‚”ć‚¤ćƒ«åć«č§’ę‹¬å¼§[]悒ä½æē”Øć—ć¾ć™ļ¼ˆä¾‹: src/pages/posts/[id].astroļ¼‰ć€‚ć“ć‚Œć‚‰ć®ćƒšćƒ¼ć‚ø恧ćÆ态getStaticPaths() é–¢ę•°ć‚’ä½æć£ć¦ć€ē”Ÿęˆć™ć‚‹ćƒšćƒ¼ć‚øć®ćƒ‘ć‚¹ćØć€å„ćƒšćƒ¼ć‚ø恫ęø”ć™ćƒ‡ćƒ¼ć‚æć‚’å®šē¾©ć—ć¾ć™ć€‚

ćƒ¬ć‚¤ć‚¢ć‚¦ćƒˆ (src/layouts/)

ćƒ¬ć‚¤ć‚¢ć‚¦ćƒˆćÆć€č¤‡ę•°ć®ćƒšćƒ¼ć‚øć§å…±é€šć®HTML꧋造ļ¼ˆćƒ˜ćƒƒćƒ€ćƒ¼ć€ćƒ•ćƒƒć‚æćƒ¼ć€ćƒŠćƒ“ć‚²ćƒ¼ć‚·ćƒ§ćƒ³ćŖ恩ļ¼‰ć‚’再利ē”Øć™ć‚‹ćŸć‚ć®Astroć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć§ć™ć€‚é€šåøø态src/layouts/ ćƒ‡ć‚£ćƒ¬ć‚Æ惈ćƒŖć«é…ē½®ć•ć‚Œć¾ć™ć€‚

<!-- src/layouts/BaseLayout.astro -->
---
export interface Props {
  title: string;
}
const { title } = Astro.props;
---
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width">
  <title>{title} | ćƒžć‚¤ć‚µć‚¤ćƒˆ</title>
  <link rel="stylesheet" href="/styles/global.css">
  <!-- 恓恓恧ViewTransitionsć‚’ć‚¤ćƒ³ćƒćƒ¼ćƒˆ -->
  <!-- import { ViewTransitions } from 'astro:transitions'; -->
  <!-- <ViewTransitions /> -->
</head>
<body>
  <header>
    <nav>
      <a href="/">ćƒ›ćƒ¼ćƒ </a>
      <a href="/about">ꦂ要</a>
    </nav>
  </header>
  <main>
    <!-- ćƒšćƒ¼ć‚øå›ŗęœ‰ć®ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ćŒć“ć“ć«ęŒæå…„ć•ć‚Œć‚‹ -->
    <slot />
  </main>
  <footer>
    <p>Ā© 2025 ćƒžć‚¤ć‚µć‚¤ćƒˆ</p>
  </footer>
</body>
</html>

ćƒšćƒ¼ć‚øć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆļ¼ˆä¾‹: src/pages/index.astroļ¼‰ć‹ć‚‰ć“ć®ćƒ¬ć‚¤ć‚¢ć‚¦ćƒˆć‚’ä½æē”Ø恙悋恫ćÆć€ćƒ¬ć‚¤ć‚¢ć‚¦ćƒˆć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚’ć‚¤ćƒ³ćƒćƒ¼ćƒˆć—ć¦ć€ćƒšćƒ¼ć‚øć®ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚’ćć®äø­ć«čؘčæ°ć—ć¾ć™ć€‚<slot /> ć‚æ悰恮éƒØåˆ†ć«ć€ćƒšćƒ¼ć‚øć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć®ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ćŒęŒæå…„ć•ć‚Œć¾ć™ć€‚

<!-- src/pages/index.astro -->
---
import BaseLayout from '../layouts/BaseLayout.astro';
import MyComponent from '../components/MyComponent.astro';
---
<BaseLayout title="ćƒ›ćƒ¼ćƒ ćƒšćƒ¼ć‚ø">
  <h1>悈恆恓恝ļ¼</h1>
  <p>恓悌ćÆćƒ›ćƒ¼ćƒ ćƒšćƒ¼ć‚øć®ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć§ć™ć€‚</p>
  <MyComponent greeting="Hi">
    <p>恓悌ćÆMyComponent恫ęø”ć•ć‚Œć‚‹ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć§ć™ć€‚</p>
  </MyComponent>
</BaseLayout>

ć‚¢ć‚¤ćƒ©ćƒ³ćƒ‰ć‚¢ćƒ¼ć‚­ćƒ†ć‚Æćƒćƒ£ćØćƒć‚¤ćƒ‰ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ šŸļø

前čæ°ć®é€šć‚Šć€Astroć®ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ć®éµćÆć‚¢ć‚¤ćƒ©ćƒ³ćƒ‰ć‚¢ćƒ¼ć‚­ćƒ†ć‚Æćƒćƒ£ć«ć‚ć‚Šć¾ć™ć€‚ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ćÆ态Astroć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚„ä»–ć®UIćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆćÆć‚µćƒ¼ćƒćƒ¼äøŠć§HTMLć«ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć•ć‚Œć€ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć‚µć‚¤ćƒ‰JavaScriptćÆå«ć¾ć‚Œć¾ć›ć‚“ć€‚

恗恋恗态惜ć‚æćƒ³ć®ć‚ÆćƒŖ惃ć‚Æć‚¤ćƒ™ćƒ³ćƒˆć‚„ēŠ¶ę…‹ē®”ē†ćŖ恩态ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć‚µć‚¤ćƒ‰ć§ć®ć‚¤ćƒ³ć‚æ惩ć‚Æćƒ†ć‚£ćƒ–ę€§ćŒåæ…要ćŖć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚‚ć‚ć‚Šć¾ć™ć€‚ć“ć®ć‚ˆć†ćŖć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚’ć€Œć‚¢ć‚¤ćƒ©ćƒ³ćƒ‰ć€ćØć—ć¦ęŒ‡å®šć—ć€JavaScript悒čŖ­ćæč¾¼ć¾ć›ć‚‹ļ¼ˆćƒć‚¤ćƒ‰ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć™ć‚‹ļ¼‰ć“ćØćŒć§ćć¾ć™ć€‚ć“ć‚Œć«ćÆć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆćƒ‡ć‚£ćƒ¬ć‚Æćƒ†ć‚£ćƒ–ć‚’ä½æē”Øć—ć¾ć™ć€‚

<!-- src/pages/interactive.astro -->
---
import BaseLayout from '../layouts/BaseLayout.astro';
// Reactć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚’ć‚¤ćƒ³ćƒćƒ¼ćƒˆ (äŗ‹å‰ć« `npm run astro add react` 恌åæ…要)
import Counter from '../components/Counter.jsx';
---
<BaseLayout title="ć‚¤ćƒ³ć‚æ惩ć‚Æćƒ†ć‚£ćƒ–ćƒšćƒ¼ć‚ø">
  <h1>ć‚¤ćƒ³ć‚æ惩ć‚Æćƒ†ć‚£ćƒ–ćŖć‚«ć‚¦ćƒ³ć‚æćƒ¼</h1>

  <!-- ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ćÆJSćÆčŖ­ćæč¾¼ć¾ć‚ŒćŖ恄 (ć‚µćƒ¼ćƒćƒ¼ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć®ćæ) -->
  <Counter />

  <!-- client:load ćƒ‡ć‚£ćƒ¬ć‚Æćƒ†ć‚£ćƒ–: ćƒšćƒ¼ć‚øčŖ­ćæč¾¼ćæå¾Œć™ćć«ćƒć‚¤ćƒ‰ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ -->
  <Counter client:load />

  <!-- client:idle ćƒ‡ć‚£ćƒ¬ć‚Æćƒ†ć‚£ćƒ–: ćƒ”ć‚¤ćƒ³ć‚¹ćƒ¬ćƒƒćƒ‰ćŒć‚¢ć‚¤ćƒ‰ćƒ«ēŠ¶ę…‹ć«ćŖć£ćŸć‚‰ćƒć‚¤ćƒ‰ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ -->
  <Counter client:idle />

  <!-- client:visible ćƒ‡ć‚£ćƒ¬ć‚Æćƒ†ć‚£ćƒ–: 要ē“ ćŒćƒ“ćƒ„ćƒ¼ćƒćƒ¼ćƒˆć«å…„ć£ćŸć‚‰ćƒć‚¤ćƒ‰ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ -->
  <div style="height: 200vh;">ć‚¹ć‚Æćƒ­ćƒ¼ćƒ«ć—ć¦ćć ć•ć„</div>
  <Counter client:visible />

  <!-- client:media ćƒ‡ć‚£ćƒ¬ć‚Æćƒ†ć‚£ćƒ–: ē‰¹å®šć®ćƒ”ćƒ‡ć‚£ć‚¢ć‚Æć‚ØćƒŖ恫äø€č‡“ć—ćŸć‚‰ćƒć‚¤ćƒ‰ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ -->
  <Counter client:media="(max-width: 800px)" />

  <!-- client:only ćƒ‡ć‚£ćƒ¬ć‚Æćƒ†ć‚£ćƒ–: ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć‚µć‚¤ćƒ‰ć§ć®ćæćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚° (SSR恗ćŖ恄) -->
  <!-- ē‰¹å®šć®ćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æć‚’ęŒ‡å®šć™ć‚‹åæ…č¦ćŒć‚ć‚‹ -->
  <Counter client:only="react" />
</BaseLayout>

利ē”ØåÆčƒ½ćŖć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆćƒ‡ć‚£ćƒ¬ć‚Æćƒ†ć‚£ćƒ–ćÆ仄äø‹ć®é€šć‚Šć§ć™ć€‚

ćƒ‡ć‚£ćƒ¬ć‚Æćƒ†ć‚£ćƒ–ćƒć‚¤ćƒ‰ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®ć‚æć‚¤ćƒŸćƒ³ć‚°ćƒ¦ćƒ¼ć‚¹ć‚±ćƒ¼ć‚¹
client:loadćƒšćƒ¼ć‚øčŖ­ćæč¾¼ćæå¾Œć™ćć™ćć«č”Øē¤ŗćƒ»ę“ä½œćŒåæ…要ćŖUI要ē“ ļ¼ˆćƒ˜ćƒƒćƒ€ćƒ¼ć®ćƒ”ćƒ‹ćƒ„ćƒ¼ćŖ恩ļ¼‰
client:idlećƒ–ćƒ©ć‚¦ć‚¶ćŒć‚¢ć‚¤ćƒ‰ćƒ«ēŠ¶ę…‹ć«ćŖć£ćŸćØćé‡č¦åŗ¦ć®ä½Žć„UI要ē“ ļ¼ˆć‚µć‚¤ćƒ‰ćƒćƒ¼ć®ć‚¦ć‚£ć‚ø悧惃惈ćŖ恩ļ¼‰
client:visible要ē“ ćŒćƒ“ćƒ„ćƒ¼ćƒćƒ¼ćƒˆå†…ć«å…„ć£ćŸćØ恍ē”»é¢äø‹éƒØ恫恂悋要ē“ ć€é…延čŖ­ćæč¾¼ćæ恗恟恄ē”»åƒć‚«ćƒ«ćƒ¼ć‚»ćƒ«ćŖ恩
client:media={query}ęŒ‡å®šć—ćŸćƒ”ćƒ‡ć‚£ć‚¢ć‚Æć‚ØćƒŖ恌äø€č‡“恗恟ćØććƒ¢ćƒć‚¤ćƒ«ć§ć®ćæč”Øē¤ŗć•ć‚Œć‚‹ć‚µć‚¤ćƒ‰ćƒćƒ¼ćŖ恩
client:only={framework}ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć‚µć‚¤ćƒ‰ć§ć®ćæćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ļ¼ˆSSRćŖ恗ļ¼‰ćƒ–ćƒ©ć‚¦ć‚¶APIć«å¼·ćä¾å­˜ć™ć‚‹ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆ

ć“ć®ć‚¢ć‚¤ćƒ©ćƒ³ćƒ‰ć‚¢ćƒ¼ć‚­ćƒ†ć‚Æćƒćƒ£ć«ć‚ˆć‚Šć€é–‹ē™ŗ者ćÆćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ćøć®å½±éŸæć‚’ęœ€å°é™ć«ęŠ‘ćˆćŖ恌悉态åæ…要ćŖē®‡ę‰€ć«ć ć‘ć‚¤ćƒ³ć‚æ惩ć‚Æćƒ†ć‚£ćƒ–ę€§ć‚’čæ½åŠ ć§ćć¾ć™ć€‚

UIćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æ恮ēµ±åˆ šŸ§©

Astroć®å¤§ććŖé­…åŠ›ć®äø€ć¤ćÆ态React, Vue, Svelte, Solid, Lit, AlpineJSćŖ恩态複ꕰ恮äŗŗ갗UIćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æ悒ē°”å˜ć«ēµ±åˆć§ćć‚‹ē‚¹ć§ć™ć€‚ćƒ—ćƒ­ć‚ø悧ć‚Æćƒˆå†…ć§ć“ć‚Œć‚‰ć®ćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æć‚’ę··åœØ恕恛悋恓ćØ悂åÆčƒ½ć§ć™ć€‚

ćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æ悒čæ½åŠ ć™ć‚‹ć«ćÆ态astro add ć‚³ćƒžćƒ³ćƒ‰ć‚’ä½æē”Øć—ć¾ć™ć€‚

npm run astro add react
npm run astro add vue
npm run astro add svelte

čæ½åŠ å¾Œć€.jsx, .vue, .svelte ćŖć©ć®ćƒ•ć‚”ć‚¤ćƒ«ć‚’ src/components/ ćƒ‡ć‚£ćƒ¬ć‚Æ惈ćƒŖć«é…ē½®ć—态.astro ćƒ•ć‚”ć‚¤ćƒ«å†…ć§é€šåøøé€šć‚Šć‚¤ćƒ³ćƒćƒ¼ćƒˆć—ć¦ä½æē”Øć§ćć¾ć™ć€‚

<!-- src/pages/frameworks.astro -->
---
import BaseLayout from '../layouts/BaseLayout.astro';
import ReactCounter from '../components/ReactCounter.jsx';
import VueCounter from '../components/VueCounter.vue';
import SvelteCounter from '../components/SvelteCounter.svelte';
---
<BaseLayout title="Framework Mix">
  <h1>č¤‡ę•°ć®ćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æć‚’ę··åœØļ¼</h1>

  <ReactCounter client:visible />
  <VueCounter client:visible />
  <SvelteCounter client:visible />
</BaseLayout>

ć“ć‚Œć«ć‚ˆć‚Šć€ę—¢å­˜ć®ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆč³‡ē”£ć‚’再利ē”Øć—ćŸć‚Šć€ćƒćƒ¼ćƒ ćƒ”ćƒ³ćƒćƒ¼ćŒå¾—ę„ćŖćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æ悒ä½æē”Ø恗恟悊恙悋恓ćØćŒå®¹ę˜“ć«ćŖć‚Šć¾ć™ć€‚

View Transitions šŸŽ¬

Astro 3.0 (2023幓8꜈ćƒŖćƒŖćƒ¼ć‚¹) ä»„é™ć€View Transitions API ć‚’åˆ©ē”Øć—ćŸćƒšćƒ¼ć‚ø遷ē§»ć‚¢ćƒ‹ćƒ”ćƒ¼ć‚·ćƒ§ćƒ³ćŒē°”å˜ć«å®Ÿč£…ć§ćć‚‹ć‚ˆć†ć«ćŖć‚Šć¾ć—ćŸć€‚ć“ć‚ŒćÆ态MPAļ¼ˆćƒžćƒ«ćƒćƒšćƒ¼ć‚øć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ļ¼‰ć§ć‚ć‚ŠćŖ恌悉态SPAļ¼ˆć‚·ćƒ³ć‚°ćƒ«ćƒšćƒ¼ć‚øć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ļ¼‰ć®ć‚ˆć†ćŖ껑悉恋ćŖ遷ē§»ć‚’実ē¾ć™ć‚‹ę©Ÿčƒ½ć§ć™ć€‚

ęœ‰åŠ¹ć«ć™ć‚‹ć«ćÆć€ćƒ¬ć‚¤ć‚¢ć‚¦ćƒˆćƒ•ć‚”ć‚¤ćƒ«ć® <head> ć‚æć‚°å†…ć« ViewTransitions ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆć‚’ć‚¤ćƒ³ćƒćƒ¼ćƒˆć—ć¦čæ½åŠ ć™ć‚‹ć ć‘恧恙怂

<!-- src/layouts/BaseLayout.astro -->
---
import { ViewTransitions } from 'astro:transitions';
export interface Props { title: string; }
const { title } = Astro.props;
---
<html lang="ja">
<head>
  <title>{title}</title>
  <!-- View Transitions ć‚’ęœ‰åŠ¹åŒ– -->
  <ViewTransitions />
</head>
<body>
  <slot />
</body>
</html>

ć“ć‚Œć ć‘ć§ć€ćƒšćƒ¼ć‚ø間恮遷ē§»ę™‚ć«ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć®ćƒ•ć‚§ćƒ¼ćƒ‰ć‚¢ćƒ‹ćƒ”ćƒ¼ć‚·ćƒ§ćƒ³ćŒé©ē”Øć•ć‚Œć¾ć™ć€‚ć•ć‚‰ć«ć€transition:animate ćƒ‡ć‚£ćƒ¬ć‚Æćƒ†ć‚£ćƒ–ć‚’ä½æć£ć¦ć€ē‰¹å®šč¦ē“ ć®ć‚¢ćƒ‹ćƒ”ćƒ¼ć‚·ćƒ§ćƒ³ļ¼ˆć‚¹ćƒ©ć‚¤ćƒ‰ćŖ恩ļ¼‰ć‚’ć‚«ć‚¹ć‚æ惞悤ć‚ŗ恗恟悊态transition:persist ćƒ‡ć‚£ćƒ¬ć‚Æćƒ†ć‚£ćƒ–ć§č¦ē“ ć®ēŠ¶ę…‹ļ¼ˆå‹•ē”»ć®å†ē”Ÿä½ē½®ćŖ恩ļ¼‰ć‚’ćƒšćƒ¼ć‚ø遷ē§»å¾Œć‚‚ē¶­ęŒć—ćŸć‚Šć§ćć¾ć™ć€‚ē‰¹å®šć®ćƒŖćƒ³ć‚Æ恧恮View Transitions悒ē„”åŠ¹ć«ć™ć‚‹ć«ćÆ态<a> ć‚æ悰恫 data-astro-reload å±žę€§ć‚’čæ½åŠ ć—ć¾ć™ć€‚

4. ćƒ“ćƒ«ćƒ‰ćØ惇惗惭悤 šŸŒ

開ē™ŗćŒå®Œäŗ†ć—ćŸć‚‰ć€ć‚µć‚¤ćƒˆć‚’ćƒ“ćƒ«ćƒ‰ć—ć¦å…¬é–‹ć™ć‚‹ęŗ–å‚™ć‚’ć—ć¾ć™ć€‚

npm run build

ć“ć®ć‚³ćƒžćƒ³ćƒ‰ć‚’å®Ÿč”Œć™ć‚‹ćØć€ęœ€é©åŒ–ć•ć‚ŒćŸé™ēš„ćƒ•ć‚”ć‚¤ćƒ«ļ¼ˆHTML, CSS, JavaScriptļ¼‰ćŒćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ dist/ ćƒ‡ć‚£ćƒ¬ć‚Æ惈ćƒŖ恫ē”Ÿęˆć•ć‚Œć¾ć™ć€‚

ē”Ÿęˆć•ć‚ŒćŸ dist/ ćƒ‡ć‚£ćƒ¬ć‚Æ惈ćƒŖć®å†…å®¹ć‚’ć€Netlify, Vercel, GitHub Pages, Cloudflare PagesćŖć©ć®é™ēš„ćƒ›ć‚¹ćƒ†ć‚£ćƒ³ć‚°ć‚µćƒ¼ćƒ“ć‚¹ć«ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć™ć‚‹ć ć‘ć§ć€ć‚µć‚¤ćƒˆć‚’å…¬é–‹ć§ćć¾ć™ć€‚å¤šćć®ćƒ›ć‚¹ćƒ†ć‚£ćƒ³ć‚°ć‚µćƒ¼ćƒ“ć‚¹ć§ćÆ态GitćƒŖ惝ć‚ø惈ćƒŖćØ連ęŗ恗恦č‡Ŗå‹•ćƒ‡ćƒ—ćƒ­ć‚¤ć‚’čØ­å®šć™ć‚‹ć“ćØ悂åÆčƒ½ć§ć™ć€‚

AstroćÆ静ēš„ć‚µć‚¤ćƒˆē”Ÿęˆļ¼ˆSSGļ¼‰ćŒćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ć™ćŒć€ć‚¢ćƒ€ćƒ—ć‚æćƒ¼ć‚’ä½æē”Ø恙悋恓ćØ恧SSRļ¼ˆć‚µćƒ¼ćƒćƒ¼ć‚µć‚¤ćƒ‰ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ļ¼‰ć‚‚åÆčƒ½ć§ć™ć€‚Vercel, Netlify, CloudflarećŖć©ć®ć‚µćƒ¼ćƒćƒ¼ćƒ¬ć‚¹ē’°å¢ƒć‚„态Node.jsć‚µćƒ¼ćƒćƒ¼ć§ć®å®Ÿč”Œć«åƾåæœć—ć¦ć„ć¾ć™ć€‚SSRć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć«ćÆ态čØ­å®šćƒ•ć‚”ć‚¤ćƒ«ļ¼ˆastro.config.mjsļ¼‰ć§ć‚¢ćƒ€ćƒ—ć‚æćƒ¼ć‚’ęŒ‡å®šć—ć¾ć™ć€‚

// astro.config.mjs
import { defineConfig } from 'astro/config';
import node from '@astrojs/node'; // 例: Node.jsć‚¢ćƒ€ćƒ—ć‚æćƒ¼

export default defineConfig({
  output: 'server', // ć¾ćŸćÆ 'hybrid'
  adapter: node({
    mode: 'standalone'
  })
});

SSR悄惏悤惖ćƒŖćƒƒćƒ‰ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ļ¼ˆäø€éƒØć®ćƒšćƒ¼ć‚øćÆ静ēš„态äø€éƒØćÆ動ēš„ļ¼‰ć‚’利ē”Ø恙悋恓ćØć§ć€ć‚ˆć‚Šå‹•ēš„ćŖć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć‚‚ę§‹ēÆ‰ć§ćć¾ć™ć€‚

5. ć¾ćØ悁ćØę¬”ć®ć‚¹ćƒ†ćƒƒćƒ— šŸš€

AstroćÆć€ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ć€é–‹ē™ŗč€…ä½“éØ“ć€ęŸ”č»Ÿę€§ć‚’é‡č¦–ć—ćŸćƒ¢ćƒ€ćƒ³ćŖWebćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æ恧恙怂ē‰¹ć«ć‚³ćƒ³ćƒ†ćƒ³ćƒ„äø­åæƒć®Webć‚µć‚¤ćƒˆę§‹ēÆ‰ć«ćŠć„ć¦ć€ćć®ēœŸä¾”悒ē™ŗę®ć—ć¾ć™ć€‚

  • ć‚¢ć‚¤ćƒ©ćƒ³ćƒ‰ć‚¢ćƒ¼ć‚­ćƒ†ć‚Æćƒćƒ£ć«ć‚ˆć‚‹é©šē•°ēš„ćŖćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ć€‚
  • React, Vue, SveltećŖć©ć€å„½ćæ恮UIćƒ•ćƒ¬ćƒ¼ćƒ ćƒÆćƒ¼ć‚Æć‚’åˆ©ē”ØåÆčƒ½ć€‚
  • ćƒ•ć‚”ć‚¤ćƒ«ćƒ™ćƒ¼ć‚¹ćƒ«ćƒ¼ćƒ†ć‚£ćƒ³ć‚°ć‚„ć‚¹ć‚³ćƒ¼ćƒ—ä»˜ćCSSćŖ恩态ē›“ꄟēš„ć§ć‚·ćƒ³ćƒ—ćƒ«ćŖ開ē™ŗ体éØ“ć€‚
  • View Transitionsć«ć‚ˆć‚‹ć‚¹ćƒ ćƒ¼ć‚ŗćŖćƒšćƒ¼ć‚ø遷ē§»ć€‚
  • Markdown/MDXć‚µćƒćƒ¼ćƒˆćØć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³ć«ć‚ˆć‚‹åŠ¹ēŽ‡ēš„ćŖć‚³ćƒ³ćƒ†ćƒ³ćƒ„ē®”ē†ć€‚

恓恮čؘäŗ‹ć§ćÆAstro恮åŸŗęœ¬ēš„ćŖéƒØåˆ†ć‚’ē“¹ä»‹ć—ć¾ć—ćŸć€‚ć•ć‚‰ć«ę·±ćå­¦ć¶ćŸć‚ć«ćÆ态仄äø‹ć®ć‚¹ćƒ†ćƒƒćƒ—ć‚’ćŠå‹§ć‚ć—ć¾ć™ć€‚

  1. å…¬å¼ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć‚’čŖ­ć‚€: Astroć®å…¬å¼ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆ (https://docs.astro.build/ja/) ćÆ非åøøć«å……å®Ÿć—ć¦ćŠć‚Šć€ę—„ęœ¬čŖžć«ć‚‚åƾåæœć—ć¦ć„ć¾ć™ć€‚
  2. ćƒćƒ„ćƒ¼ćƒˆćƒŖć‚¢ćƒ«ć‚’č©¦ć™: å…¬å¼ć®ćƒ–ćƒ­ć‚°ćƒćƒ„ćƒ¼ćƒˆćƒŖć‚¢ćƒ«ćŖć©ć‚’é€šć—ć¦ć€å®Ÿéš›ć«ę‰‹ć‚’å‹•ć‹ć—ć¦ćæć¾ć—ć‚‡ć†ć€‚
  3. ć‚¤ćƒ³ćƒ†ć‚°ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’ęŽ¢ć‚‹: Tailwind CSS, MDX, ē”»åƒęœ€é©åŒ–ćŖ恩态豊åƌćŖć‚¤ćƒ³ćƒ†ć‚°ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’č©¦ć—ć¦ćæć¾ć—ć‚‡ć†ć€‚
  4. ć‚³ćƒŸćƒ„ćƒ‹ćƒ†ć‚£ć«å‚åŠ ć™ć‚‹: Discord (https://astro.build/chat) ćŖ恩恧他恮開ē™ŗ者ćØäŗ¤ęµć—态č³Ŗå•ć—ćŸć‚ŠēŸ„č¦‹ć‚’å…±ęœ‰ć—ćŸć‚Šć—ć¾ć—ć‚‡ć†ć€‚

AstroćÆę€„é€Ÿć«é€²åŒ–ć—ć¦ćŠć‚Šć€Web開ē™ŗ恮ęœŖę„ć‚’å½¢ä½œć‚‹åÆčƒ½ę€§ć‚’ē§˜ć‚ć¦ć„ć¾ć™ć€‚ćœć²ć“ć®ę©Ÿä¼šć«Astro悒試恗恦态ꬔäø–ä»£ć®Webć‚µć‚¤ćƒˆę§‹ēÆ‰ć‚’ä½“éØ“ć—ć¦ćæć¦ćć ć•ć„ļ¼šŸ˜„

ć‚³ćƒ”ćƒ³ćƒˆ

ć‚æć‚¤ćƒˆćƒ«ćØURLć‚’ć‚³ćƒ”ćƒ¼ć—ć¾ć—ćŸ