2022-07-01
This is the first post of my new Astro blog.
Written by: Astro Learner
tags
astro
の書き方!!// 定義
---
const skills = ["HTML", "CSS", "JavaScript", "PHP", "Astro"];
---
// 出力
{skills.map((skill) => <p>{skill}</p>)}
// 定義
---
const happy = true;
const finished = false;
const goal = 3;
---
// happyがtrueかどうか
{happy && <p>I am happy to be learning Astro!</p>}
// finishedがtrueかどうか
{finished && <p>I finished this tutorial!</p>}
// goalが3かどうか。これもしや、型も判定してる?
{goal === 3 ? <p>My goal is to finish in 3 days.</p> : <p>My goal is not 3 days.</p>}
style!
スタイルを適用させたいページの style タグ内に書くっぽい
define:vars={ {...} }
ディレクティブとかいうのを使用できる
少しだるいけどまあまあ使えそう
scss
とかいらなくね?
// フロントマター部分
const skillColor = "navy";
/* CSS */
<style define:vars={{ skillColor }}>
.skill {
color: var(--skillColor);
}
text-transform
// フロントマタースクリプトで読み込み
---
import '../styles/global.css';
---
多分、astro
ファイルの上部で記述できるJavaScript
のことやな
import
。<Navigation /> // 何この閉じスラッシュ
Social.astro
を作成。// Social.astro
---
const { platform, username } = Astro.props;
---
<a href={`https://www.${platform}.com/${username}`}>{platform}</a>
// Footer.astro
---
import Social from "./Social.astro";
---
<footer>
<Social platform="twitter" username="astrodotbuild" />
<Social platform="github" username="withastro" />
<Social platform="youtube" username="astrodotbuild" />
</footer>
---
const { platform, username } = Astro.props;
---
<a href={`https://www.${platform}.com/${username}`}>{platform}</a>
<style>
a { // aタグがファイル内にないと適用されない
padding: 0.5rem 1rem;
color: white;
background-color: #4c1d95;
text-decoration: none;
}
</style>
---
import Social from "./Social.astro";
---
<style>
footer {
display: flex;
gap: 1rem;
margin-top: 2rem;
}
</style>
<footer>
<Social platform="twitter" username="astrodotbuild" />
<Social platform="github" username="withastro" />
<Social platform="youtube" username="astrodotbuild" />
</footer>
<script>
import "../scripts/Hamburger.js";
</script>
コンポーネントとの違いは何だ? Astro コンポーネントをほぼ全てのページで使用している場合、 コンポーネントではなくレイアウトを使用した方がいいっぽい。
blog/src/layouts/BaseLayout.astro ファイルを作成
---
import Header from '../components/Header.astro';
import Footer from '../components/Footer.astro';
import '../styles/global.css';
const pageTitle = "Home Page";
---
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} />
<title>{pageTitle}</title>
</head>
<body>
<Header />
<h1>{pageTitle}</h1>
<Footer />
<script>
import "../scripts/menu.js";
</script>
</body>
</html>
h2
が出力されてないけど。---
import BaseLayout from "../layouts/BaseLayout.astro";
const pageTitle = "Home Page";
---
<BaseLayout>
<h2>My awesome blog subtitle</h2>
</BaseLayout>
blog/src/layouts/BaseLayout.astro に<slot />
を追加!
h2
出力されたぁ
pageTitle を、BaseLayout に渡す
markdown 投稿用のレイアウトファイルを作成
blog/src/layouts/MarkdownPostLayout.astro
{frontmatter.title}
のように、frontmatter
を使用すると、
YAML フロントマターの値をレイアウト コンポーネントのプロパティとして渡せる
YAML フロントマターっていうのは多分、.md ファイルの上で定義してる奴ら
pubDate などの定数を は Layout ファイルに記述
blog/src/layouts/MarkdownPostLayout.astro に
blog/src/layouts/BaseLayout.astro をインポート
「ブログ投稿レイアウトをメインページレイアウト内にネストする」とかいうらしい
ネストってなんや?
BaseLayout と、MarkdownPostLayout で出力する内容に重複がないように注意