Astroブログでダークモード実装してみた話【FOUC対策からアクセシビリティまで】
Astroブログにダークモード実装した時にぶつかったFOUC問題、LocalStorageとの連携、アクセシビリティ対応まで、実際に躓いたポイントと解決方法を全部コード付きで解説します。個人開発でダークモード入れたい人は必見です!
こんにちは、えふてぃです!
普段はNext.jsでWebアプリを作ることが多いですが、今回はコンテンツ駆動のウェブサイト向けのフレームワーク「Astro」でこのブログを作ってみました。
結論から言うと、めちゃくちゃ良いです。
特に個人ブログを作るなら、Next.jsよりAstroの方が圧倒的に楽でした。今回はその理由と、実際に使ってみて感動したポイントを共有しますね。
まず驚いたのがビルド時間の速さです。このブログをビルドしてみたら:
[build] 12 page(s) built in 1.49s
[build] Complete!
たった1.5秒でビルド完了!Next.jsのプロジェクトだと10秒以上かかることも多いので、この速さは割と驚きでした。
さらに、Astroの設計思想が「Zero JavaScript by default」なので、生成されるサイト自体もかなり軽いです。
// Next.jsだと自動でReactがバンドルされる
// Astroは必要な部分だけJavaScriptを送る
といった感じですね。
Next.jsあたりでブログを作ると、MDXの設定やらremark/rehypeプラグインの設定やらが面倒そうだ…。
Astroなら最初から全部入ってます(圧倒的感謝):
---
title: '記事のタイトル'
description: '記事の説明'
pubDate: 'Oct 17 2024'
---
## 見出し
本文をMarkdownで書くだけ!
しかも、Content Collectionsという機能で型安全に記事を管理できます。
// content.config.tsで記事のスキーマを定義
const blog = defineCollection({
schema: z.object({
title: z.string(),
description: z.string(),
pubDate: z.coerce.date(),
categories: z.array(z.enum(['技術', '映画', '読書'])),
}),
});
これでタイポしたらビルド時にエラーで教えてくれる!TypeScript使いには最高です。
「でも動的な機能が欲しくなったらどうするの?」
これも大丈夫らしい。Astroはアイランドアーキテクチャを採用していて、必要な部分だけReactやVue、Svelteを使えます:
---
// 静的な部分はAstroコンポーネントで
import Header from '../components/Header.astro';
// 動的な部分だけReactを使う
import CommentSection from '../components/CommentSection.jsx';
---
<Header />
<article>
<!-- 記事の内容 -->
</article>
<CommentSection client:visible />
client:visibleで、コンポーネントが画面に表示されたタイミングでJavaScriptを読み込みます。賢い!
astro:assetsで画像を自動でWebP変換興味を持った方のために、最速でAstroブログを始める方法を紹介します:
# 1. プロジェクト作成(ブログテンプレート使用)
npm create astro@latest my-blog -- --template blog
# 2. 開発サーバー起動
cd my-blog
npm run dev
# 3. ブラウザで確認
open http://localhost:4321
astro-blog/
├── src/
│ ├── pages/ # ページコンポーネント
│ │ ├── index.astro # トップページ
│ │ ├── about.astro # アバウトページ
│ │ └── blog/ # ブログ関連ページ
│ ├── content/ # コンテンツ管理
│ │ └── blog/ # ブログ記事(.md/.mdx)
│ ├── components/ # 再利用可能なコンポーネント
│ ├── layouts/ # レイアウトテンプレート
│ ├── styles/ # スタイルシート
│ └── assets/ # 画像などの静的アセット
├── public/ # 静的ファイル(フォント、favicon等)
├── astro.config.mjs # Astro設定ファイル
├── tsconfig.json # TypeScript設定
└── package.json # プロジェクト依存関係
まぁわかりやすいフォルダ構成だーって感じです。
Viteベースで爆速開発環境 - Astroはお馴染みViteを使ってるから開発サーバーの起動が爆速 - ホットリロードも一瞬で反映される。ブログ作成の上でこれは地味にありがたいポイント。
キャッシュでハマった話 - 画像ファイルを移動したら謎のエラーが… -
.astroフォルダにキャッシュが残ってた - もしやと思いrm -rf .astroでキャッシュクリアしたら解決!
これだけで、このブログとほとんど同じような構成のサイトが立ち上がります!
Next.jsは自分で自由にできる反面、個人ブログには少しオーバースペック気味になってまう。
Astroなら:
P.S. (小声)でも静的ブログ以外だと自分は使わなそうなのでこれがAstroとの一期一会開発なのかもしれない涙
読んでくれてありがとう。よかったらシェアやフォロー押してってください。Xで雑に絡んでくれるのも普通に嬉しい。