<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Stella Dev</title><description>Webサイト制作のナレッジ・サイト</description><link>https://stella-dev.biz/</link><language>ja</language><item><title>Container・Image・Volumeから始めるDocker入門</title><link>https://stella-dev.biz/posts/docker-getting-started/</link><guid isPermaLink="true">https://stella-dev.biz/posts/docker-getting-started/</guid><description>Container・Image・Volumeの3つを軸に、WordPress環境を例にしたDocker入門メモです。</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;3つのキーワードからDockerを始める&lt;/h1&gt;
&lt;p&gt;Dockerを使い始めたので、学んだことをメモします。&lt;/p&gt;
&lt;p&gt;DockerにはWeb制作とは異なる概念や用語が数多く登場するため敷居が高いと感じました。いろいろ調べていくうちに、3つのキーワードが浮かんできました。それは、&lt;strong&gt;Container, Image, Volume&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;これらの概念から考えると理解しやすかったので、この記事ではこの3つを起点に内容をまとめていきます。&lt;/p&gt;
&lt;h2&gt;Container, Image, Volume それぞれの役割&lt;/h2&gt;
&lt;h3&gt;Container&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Image&lt;/strong&gt;から作成されるアプリの実行環境。ホストOSから隔離され、任意に起動・停止・削除ができます。削除するとデータも消えるため、残すべきデータは&lt;strong&gt;Volume&lt;/strong&gt;に保存します。&lt;/p&gt;
&lt;h3&gt;Image&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Container&lt;/strong&gt;を作成するための「設計図」。コンテナの実行に必要なファイル群（OS・ライブラリ・アプリなど）をまとめたものです。&lt;a href=&quot;https://hub.docker.com/&quot;&gt;Docker Hub&lt;/a&gt;から公式イメージを取得することもできます。自分で作成する方法もあります（この記事では割愛します）。&lt;/p&gt;
&lt;h3&gt;Volume&lt;/h3&gt;
&lt;p&gt;コンテナを削除してもデータを残すための仕組み。コンテナ内の特定ディレクトリをMacのフォルダへ引き出すことで、投稿・テーマなど大切なデータを永続化し続けます。&lt;/p&gt;
&lt;p&gt;3つの概念の関係を図にすると次のようになります。（WordPressを例として使います）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;docker-figure-v2.png&quot; alt=&quot;Container・Image・Volumeの関係図&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;WordPressで学ぶ、Docker環境の構築手順&lt;/h2&gt;
&lt;p&gt;例として、「WordPressの環境」を作る場合の手順を整理します。&lt;/p&gt;
&lt;h3&gt;Step 1 : Container と Image を決める&lt;/h3&gt;
&lt;p&gt;WordPressを動かすために必要なものを分解し、各コンテナに対応するImageを選びます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WordPress環境に必要なもの
  ├── Webサーバー（Apache）
  ├── PHP
  ├── WordPress本体
  └── データベース（MySQL）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;公式の &lt;code&gt;wordpress&lt;/code&gt; イメージはApache + PHP + WordPress本体が1つにまとまっています。そのため必要なコンテナは以下の2つになります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wordpressコンテナ  ← wordpress 公式イメージ（Docker Hub）
mysqlコンテナ      ← mysql 公式イメージ（Docker Hub）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;自作不要で、公式Imageがそのまま使えます。&lt;/p&gt;
&lt;h3&gt;Step 2 : Volume を設計する&lt;/h3&gt;
&lt;p&gt;Containerを作り直した時、WordPressのテーマファイルや投稿データが消えてしまうと困ります。永続化したいデータはVolumeとして保存することができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テーマ・プラグイン・画像 → &lt;code&gt;wp-content/&lt;/code&gt; → 保存したい&lt;/li&gt;
&lt;li&gt;投稿・ユーザーデータ → &lt;code&gt;/var/lib/mysql&lt;/code&gt; → 保存したい&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wp-admin/&lt;/code&gt;など → WordPressコア → Imageに入っているので保存しなくていい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2つのVolumeが必要&lt;/strong&gt;とわかります。&lt;/p&gt;
&lt;h3&gt;Step 3: docker-compose.yml を書く&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; とは、複数のコンテナの構成を1つのファイルにまとめたものです。使う Image、ポート、環境変数、Volume などを書いておけば、&lt;code&gt;docker compose up&lt;/code&gt; で環境全体をまとめて起動できます。&lt;/p&gt;
&lt;p&gt;Step 1、2 で決めた内容は次のとおりです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Container&lt;/strong&gt;: wordpress と mysql の2つが必要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image&lt;/strong&gt;: 公式イメージをDocker Hubから取得して使う&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Volume&lt;/strong&gt;: wp-content とデータベースを永続化する&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;services: # 起動するコンテナ（サービス）の一覧

  wordpress: # WordPress 用コンテナの定義
    image: wordpress:latest # 使用する Docker イメージ（公式 WordPress、常に最新版）
    ports:
      - &quot;8080:80&quot; # ホストの 8080 番 → コンテナ内の 80 番（http://localhost:8080 でアクセス）
    environment: # WordPress コンテナ内の環境変数（DB 接続設定）
      WORDPRESS_DB_HOST: mysql # DB のホスト名（下の mysql サービス名と一致させる）
      WORDPRESS_DB_NAME: wordpress # 接続先データベース名
      WORDPRESS_DB_USER: wp_user # DB 接続用ユーザー名
      WORDPRESS_DB_PASSWORD: wp_pass # DB 接続用パスワード
    volumes:
      - ./wp-content:/var/www/html/wp-content # テーマ・プラグイン・アップロードをホスト側に永続化
    depends_on:
      - mysql # mysql コンテナの起動後に wordpress を起動する

  mysql: # MySQL 用コンテナの定義
    image: mysql:8.0 # 使用する Docker イメージ（MySQL 8.0 系）
    environment: # MySQL コンテナ内の環境変数（DB 初期化設定）
      MYSQL_DATABASE: wordpress # 起動時に自動作成するデータベース名
      MYSQL_USER: wp_user # 上記 DB 用に作成するユーザー名
      MYSQL_PASSWORD: wp_pass # 上記ユーザーのパスワード
      MYSQL_ROOT_PASSWORD: root_pass # MySQL 管理者（root）のパスワード
    volumes:
      - ./db-data:/var/lib/mysql # DB データをホスト側に永続化（コンテナ削除後も残る）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;※実際の運用では、環境変数は&lt;code&gt;.env&lt;/code&gt;から読み込むなどの秘匿化をします。&lt;/p&gt;
&lt;h3&gt;Step 4: Containerを起動する&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up -d #コンテナを作成して起動 -dオプションを付けるとターミナルのバックグラウンドで実行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;localhost:8080&lt;/code&gt; をブラウザで開くとWordPressのセットアップ画面が表示されます。
停止や再スタートは以下のコマンドです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose stop     # 停止（コンテナは残る）
docker-compose start    # 作成済みで停止中のコンテナを起動
docker-compose down     # 停止してコンテナを削除
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;stop&lt;/code&gt; と &lt;code&gt;down&lt;/code&gt; の違いは、コンテナを残すかどうかです。設定を変えて作り直したいときは &lt;code&gt;down&lt;/code&gt; を使います。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Container, Image, Volumeに絞って考えて理解を深めてみました。&lt;/p&gt;
&lt;p&gt;今回は &lt;code&gt;image: wordpress:latest&lt;/code&gt; のように、Docker Hubにある公式Imageをそのまま使いましたが、環境やライブラリを追加したい場合は &lt;code&gt;Dockerfile&lt;/code&gt; を作成しカスタマイズできます。&lt;/p&gt;
&lt;p&gt;Desktopアプリの導入についても省いていますし、まだまだ知らないことがたくさんあるはずです。勉強あるのみですね！&lt;/p&gt;
&lt;h2&gt;余談: Containerはなぜ作ったり削除したりするのか？&lt;/h2&gt;
&lt;p&gt;この疑問に対する回答を上手くまとめられなかったので、AIに聞いてみました。&lt;/p&gt;
&lt;p&gt;:::note[AIの回答]
Containerは起動中にファイルが書き換わったり、設定が変わったりすることがあります。しかし&lt;strong&gt;Imageという設計図があれば、いつでも同じ状態のContainerを作り直せます&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;そのため、Dockerでは「直す」より「作り直す」という考え方をとります。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;従来のサーバー管理&lt;/th&gt;
&lt;th&gt;Dockerのやり方&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;壊れたら修復する&lt;/td&gt;
&lt;td&gt;削除して作り直す&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;環境の設定が蓄積していく&lt;/td&gt;
&lt;td&gt;毎回クリーンな状態から始まる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;復旧に時間がかかる&lt;/td&gt;
&lt;td&gt;Imageがあれば数秒で再作成&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;また、設定を変えたい場合も同様です。環境変数やポート番号を変更するときは、Containerを削除して新しい設定で作り直すのが一般的です。
:::&lt;/p&gt;
&lt;p&gt;フロントエンドのみの環境だと &lt;code&gt;npm&lt;/code&gt; だけで賄えるケースも多いですが、バックエンドが絡むと環境の複雑さは一気に増えます。&lt;/p&gt;
&lt;p&gt;その複雑さをクリーンに保つために、Docker では「直す」よりゼロから「作り直す」ことを前提にしているのだな、と解釈しました。&lt;/p&gt;
</content:encoded></item><item><title>レンタルサーバーからCloudflareへ至った理由。その魅力を改めて考える。</title><link>https://stella-dev.biz/posts/cloudflare-pickup/</link><guid isPermaLink="true">https://stella-dev.biz/posts/cloudflare-pickup/</guid><description>インフラにあまり強くないフロントエンジニア向けに、Cloudflareの主要機能を「日本のレンタルサーバーと比べて何ができるか」という視点で紹介します。</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;レンタルサーバーからCloudflareへ&lt;/h1&gt;
&lt;p&gt;個人サイトの運用にはレンタルサーバーがとっても便利です。ドメイン管理もメール機能もWordPress自動インストール機能もあります。個人サイト運用者の強い味方ですね。
私も昔はレンタルサーバーを使っていました。&lt;/p&gt;
&lt;p&gt;ですが、紆余曲折経て、今は&lt;a href=&quot;https://www.cloudflare.com/ja-jp/&quot;&gt;Cloudflare&lt;/a&gt;で個人サイトをホスティングしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当初、Nuxt.jsで静的生成 → XサーバーにSFTPでアップロードしていた。（CI/CDに移行したい気持ちが高まっていた）&lt;/li&gt;
&lt;li&gt;その後、フレームワークをNext.jsに変更するタイミングでVercelへ移行。ようやくGitからデプロイできるようになった。&lt;/li&gt;
&lt;li&gt;ドメインはXサーバーのまま運用していたが、SSL証明書の更新で問題が起き、Cloudflareにドメインを移行。&lt;/li&gt;
&lt;li&gt;2024年ごろ、フレームワークをAstroに切り替え、サイトもCloudflare Pagesへ。ようやく一本化できた。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こんな流れで移行していきました。&lt;/p&gt;
&lt;p&gt;Xサーバー時代に遭遇したSSL更新のエラーを解消するために、ドメインレジストラの移管先として選んだだけだったCloudflareですが、徐々にその魅力に気づいていきました。&lt;/p&gt;
&lt;p&gt;今回は、レンタルサーバーからCloudflareに移行して&lt;strong&gt;良かったこと&lt;/strong&gt;について書きたいと思います。&lt;/p&gt;
&lt;h2&gt;Cloudflareの良かったこと&lt;/h2&gt;
&lt;h3&gt;フリープランの制限が緩い&lt;/h3&gt;
&lt;p&gt;フリープランという前提で、Cloudflare、Netlify、Vercelを比較してみます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/platform/limits/&quot;&gt;Cloudflare&lt;/a&gt;はビルド回数・ファイル数・ファイルサイズなどの上限がありますが、いずれも個人Webサイトの範疇なら十分な余裕があります。静的な軽いWebサイトなら帯域幅や転送量は無制限です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.netlify.com/pricing/&quot;&gt;Netlify&lt;/a&gt;はCloudFlareに比べて各制限が強め。&lt;a href=&quot;https://vercel.com/pricing&quot;&gt;Vercel&lt;/a&gt;は規約上、商用利用する場合は有料プラン必須となっています。&lt;/p&gt;
&lt;p&gt;どんな機能が必要なのか、どう運用するのか、有料プランはどうか、いろいろ検討事項はあるのですが、ひとまずCloudflareは始めやすい、という印象です。&lt;/p&gt;
&lt;h3&gt;CI/CDがとても簡単だった&lt;/h3&gt;
&lt;p&gt;CloudflareでGitHubのリポジトリを連携すると、pushするたびに自動でビルド・デプロイされるようになります。かなり簡単にできて驚きました。&lt;/p&gt;
&lt;p&gt;ブランチごとに自動でプレビューURLが発行されます。サブドメインとしてdevやstgを設定し、プレビューURLを割り当てると、Stg環境やDev環境を簡単に作れます。その環境にパスワード保護を付ける設定もあります。&lt;/p&gt;
&lt;p&gt;SFTPで個別の環境にファイルをアップロードしていた頃のことを思うと、隔世の感があります。&lt;/p&gt;
&lt;h3&gt;SSLの更新エラーから解放&lt;/h3&gt;
&lt;p&gt;Xサーバーで管理しているドメインに他のホスティングサービスを割り当てるとSSL証明書の更新時にエラーが発生して更新ができなくなるという事象が発生しました。&lt;/p&gt;
&lt;p&gt;具体的に何が原因なのかはわかりませんが、Xサーバー側のインフラの都合だろうと想像はつきます。解決方法を探るよりもCloudflareにドメイン移管してしまう方を選び解決しました。これは間接的な恩恵ですが、一元管理はやはり強いですね。&lt;/p&gt;
&lt;h3&gt;エッジ配信でサイトが速い&lt;/h3&gt;
&lt;p&gt;世界中にエッジサーバーがあり、ユーザーの近くのサーバーから配信されます。日本国内なら大阪、東京、福岡、那覇と4箇所。後述で考察を書きますが、CDNとエッジサーバーの組み合わせがCloudflareの大きな魅力だと考えています。&lt;/p&gt;
&lt;h2&gt;考察: SSG とCDNとエッジ配信&lt;/h2&gt;
&lt;p&gt;Cloudflareはデフォルト設定ではSSG, SSRを問わずhtmlをキャッシュしないそうです。（画像やJSなどのアセットはキャッシュします）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cache/concepts/default-cache-behavior/&quot;&gt;Default Cache Behavior · Cloudflare Cache (CDN) docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CloudflareといえばCDNでキャッシュ、というイメージが強いので意外でした。&lt;/p&gt;
&lt;p&gt;なぜhtmlをデフォルトでキャッシュしないのか、その理由を考察してみました。観点は2つ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;エッジ配信&lt;/strong&gt;：ユーザーに地理的に近いサーバーからコンテンツを返す&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;キャッシュ&lt;/strong&gt;：一度処理した結果を保存しておき、次のリクエストから使い回す&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;キャッシュが特に威力を発揮するのは、オリジンサーバーの処理が重い場合です。SSRでDBクエリや外部APIの呼び出しが走るような場合、初回の処理結果をキャッシュしておくことで、2回目以降は処理を丸ごとスキップできます。数百msかかる処理が一瞬になる、という効果です。&lt;/p&gt;
&lt;p&gt;ではSSGの場合はどうでしょう。SSGはビルド時にすべてのHTMLを生成します。つまり「サーバーサイドの処理」はありません。キャッシュで省くべき処理が最初から存在しないので、HTMLをキャッシュしてもあまり速度は変わらないのかもしれません。むしろエッジサーバーの数、つまりユーザーに地理的に近い場所に配信サーバーを多く設置することの方が重要なのでは？と思いました。&lt;/p&gt;
&lt;p&gt;加えて、キャッシュにはデメリットもあります。
コンテンツが更新されたとき、古いキャッシュをいつ・どうやって削除するかの設計や運用を誤ると、ユーザーに古い情報を表示し続けることになります。&lt;/p&gt;
&lt;p&gt;CloudflareがデフォルトでHTMLをキャッシュしないのは、こうしたリスクを避けつつ、エッジ配信だけで十分な速度を実現できる、という判断なのだと思います。SSGサイトとは相性が良さそうです。&lt;/p&gt;
&lt;h2&gt;ちょっと面倒なこと&lt;/h2&gt;
&lt;p&gt;レンタルサーバーであれば、ドメインに紐づいたメールアドレスを作って運用することができますが、Cloudflareにはメールサーバーやメール管理機能がありません。ここが国内のレンタルサーバーと考え方が違うところですね。&lt;/p&gt;
&lt;p&gt;独自ドメインのメールアドレスを使いたい場合は、別途用立てする必要があり、私はさくらのメールとZoho Mailを試しています。&lt;/p&gt;
&lt;p&gt;自分で使う分には用途に合ったものを選べばよいのですが、クライアントワークの場合はドメインを移管するか、メールアドレスとサイトを分けて運用するか、なんらか検討が必要です。&lt;/p&gt;
&lt;h2&gt;Cloudflareへの移行でよかったことまとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;フリープランの制限が緩い&lt;/strong&gt; 転送量・ビルド回数など個人サイトには十分な上限で、商用利用もOK&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI/CDがとても簡単&lt;/strong&gt; GitHubと連携するだけで自動デプロイできる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stg/Dev環境を手軽に構築できる&lt;/strong&gt; プレビューURLをサブドメインに割り当てるだけで環境が作れる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSLの管理が楽になった&lt;/strong&gt; ドメインをCloudflareに一元化したことでSSL更新エラーから解放された&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;エッジ配信でサイトが速い&lt;/strong&gt; 世界中のエッジサーバーからユーザーに近い場所で配信される&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CI/CDに関して言えば、レンタルサーバーでもGitHub ActionsからSSH経由でrsyncするという手がありますが、自前で実装する必要があるので、最初から環境があるCloudflareはやっぱり楽ですね。&lt;/p&gt;
&lt;p&gt;AstroなどでSSGで個人サイトを作成しているなら、Cloudflareは有力な選択肢だと思います。&lt;/p&gt;
&lt;h3&gt;補足&lt;/h3&gt;
&lt;p&gt;今回の記事ではCloudflare PagesとCloudflare Workersの違いについては触れませんでした。
今の段階では私はCloudflare Pagesを使用していますが、ゆくゆくはCloudflare Workersに統合されます。これについてはまた別の記事を書きたいと思います。&lt;/p&gt;
</content:encoded></item><item><title>Webサイトを作るなら、Astroがかなり良いと思う理由。</title><link>https://stella-dev.biz/posts/why-astro-is-great-for-websites/</link><guid isPermaLink="true">https://stella-dev.biz/posts/why-astro-is-great-for-websites/</guid><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Next.jsでWebサイトを作ったときの違和感&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;を使い始める前、私はNext.jsでいくつかのWebサイトを実装していました。Next.jsはReactのメタフレームワークとして圧倒的なシェアを持ち、機能も豊富で、技術選定で迷ったらNext.jsを使っておけば問題ない、と考えていました。&lt;/p&gt;
&lt;p&gt;ところが実際に「コーポレートサイト」「テキスト主体のページ」「ブログ」といったコンテンツ中心のWebサイトを作ってみると、どうにも噛み合わない感覚が残りました。&lt;/p&gt;
&lt;p&gt;構成によっては、ほぼ静的なページでも数百KBのJavaScriptが配信されることがある。API RoutesもMiddlewareもISRも使っていないのに、フレームワーク全体がアプリケーション寄りの機能を前提に設計されているので、静的サイトとして出力するために、デフォルトの機能をオプトアウトする前提で実装する場面がちらほら。&lt;/p&gt;
&lt;p&gt;使わない設定を把握するための調査をしているうちに、「そもそもNext.jsを使う意味は何だろう」という気持ちになってきました。&lt;/p&gt;
&lt;p&gt;やはりNext.jsはWebアプリケーション寄りのフレームワークで、コンテンツ中心のWebサイトを作るには、ややオーバースペックだと感じるようになりました。&lt;/p&gt;
&lt;h2&gt;Astroはコンテンツ主導型Webサイトのためのフレームワーク&lt;/h2&gt;
&lt;p&gt;Webアプリは状態管理・認証・サーバー処理・リアルタイム性など高度なJavaScriptの実装が必要なので、フレームワークの基盤としてJavaScriptありきで設計されます。
一方、コンテンツ配信メインのWebサイトはページの表示速度やSEOなどが大切で、JavaScriptは「必要なUI表現が実装できれば十分」という感覚がしっくり来ます。&lt;/p&gt;
&lt;p&gt;この違いを真正面から受け止めて設計されているのが、Astroというフレームワークです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://astro.build/&quot;&gt;Astroの公式サイト&lt;/a&gt;には、&lt;strong&gt;The web framework for content-driven websites&lt;/strong&gt;（コンテンツ主導型ウェブサイトのためのWebフレームワーク）と書かれています。&lt;/p&gt;
&lt;p&gt;マーケティングサイト、ドキュメント、ブログ、ポートフォリオ、コーポレートサイト、ECのブランドサイト、これらがAstroの主戦場と言えるでしょう。&lt;/p&gt;
&lt;p&gt;では、具体的にAstroにはどんな機能があるのでしょうか？
設計思想を交えて、私が気に入っているポイントを順に紹介します。&lt;/p&gt;
&lt;h3&gt;1. 「JavaScriptを送らない」がデフォルト&lt;/h3&gt;
&lt;p&gt;Astroの最も特徴的な思想は、&lt;strong&gt;デフォルトでクライアントJavaScriptをゼロにする&lt;/strong&gt;ことです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.astro&lt;/code&gt;ファイルのフロントマターに書いたJavaScriptは、ビルド時にサーバー側で実行されHTMLに変換されます。クライアントにはHTMLだけが届きます。&lt;/p&gt;
&lt;h3&gt;2. UIライブラリを自由に選べる&lt;/h3&gt;
&lt;p&gt;クリックやスクロールで動作する動的なUIはどう実装するか？AstroはReact・Vue・Svelte・Solidなど、お好みのUIライブラリをコンポーネント単位で組み込むことが可能です。&lt;/p&gt;
&lt;p&gt;これを支えているのが&lt;strong&gt;アイランドアーキテクチャ&lt;/strong&gt;という仕組みです。静的なHTMLという「海」の中に、インタラクティブな「島」が浮かんでいるイメージで、Next.jsのように「ページ全体がReactアプリ」という構造ではなく、「ページはHTMLで、必要な部分だけがUIコンポーネントの島」という構造になっています。&lt;/p&gt;
&lt;p&gt;インタラクティブなUI部品が必要になったら、その箇所だけ&lt;code&gt;client:*&lt;/code&gt;ディレクティブを付けてオプトインします。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
import Counter from &apos;../components/Counter.jsx&apos;;
---
&amp;lt;Counter client:load /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;client:load&lt;/code&gt;（即時ハイドレーション）、&lt;code&gt;client:idle&lt;/code&gt;（ページの初期読み込みが終わり、ブラウザが待機状態になったとき）、&lt;code&gt;client:visible&lt;/code&gt;（ビューポートに入ったら）、&lt;code&gt;client:media&lt;/code&gt;（メディアクエリが一致したら）など、どのタイミングでハイドレーションするかまで宣言的に指定できます。&lt;/p&gt;
&lt;p&gt;実用上、1サイトで複数のUIライブラリを混ぜることは稀ですが、「自分の好きなUIライブラリを持ち込める」「フレームワークの将来的な乗り換えが楽」という意味で大きな安心感があります。&lt;/p&gt;
&lt;h3&gt;3. &lt;code&gt;.astro&lt;/code&gt;テンプレート構文が書きやすい&lt;/h3&gt;
&lt;p&gt;Astro独自の&lt;code&gt;.astro&lt;/code&gt;構文も気に入っているポイントです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
// フロントマター（サーバーサイドJS）
import { getCollection } from &apos;astro:content&apos;;
const posts = await getCollection(&apos;blog&apos;);
---

&amp;lt;ul&amp;gt;
  {posts.map(post =&amp;gt; &amp;lt;li&amp;gt;{post.data.title}&amp;lt;/li&amp;gt;)}
&amp;lt;/ul&amp;gt;

&amp;lt;style&amp;gt;
  /* スコープ付きCSS */
  ul { padding: 0; }
&amp;lt;/style&amp;gt;

&amp;lt;script&amp;gt;
  // クライアントサイドJS
  console.log(&apos;Hello from the browser&apos;);
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ポイントは3つあります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JSX（TSX）に似た構文で、Next.jsから移行しやすい&lt;/strong&gt;。&lt;code&gt;{...}&lt;/code&gt;の式展開やコンポーネントの書き方はReact経験者なら違和感なく書けます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTML・スコープ付きCSS・クライアントサイドJSを1ファイルにまとめられる&lt;/strong&gt;。VueのSFCやSvelteのように、CSSもJSもページ内に閉じるべき処理をまとめて書けるのが嬉しいですね。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「サーバー側で動くJS」と「クライアントで動くJS」が構文レベルで明確に分かれている&lt;/strong&gt;。フロントマター(&lt;code&gt;---&lt;/code&gt; で囲まれた部分)に書いたJavaScriptはビルド時に実行され、クライアントには送られないため、配信されるJavaScriptが削減されます。DOMの操作やブラウザイベントに対する処理は&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;タグに書くか、前述のようにUIコンポーネントを&lt;code&gt;client:*&lt;/code&gt;付きで配置します。&lt;/p&gt;
&lt;p&gt;テンプレートエンジンとUIライブラリのように、役割を明確に分けている。ここもAstroならではの発想が垣間見えます。&lt;/p&gt;
&lt;h3&gt;4. Webサイトを作るための機能が揃っている&lt;/h3&gt;
&lt;p&gt;コンテンツ駆動サイトに特化しているだけあって、Webサイト制作に必要な機能が公式で揃っています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Content Collections + Content Layer API&lt;/strong&gt;: ローカルのMarkdown / MDX / JSON / YAMLをZodスキーマで型安全に扱える仕組み。社員紹介ページの一覧やブログ記事のような、CMSを導入するほどではないが構造化したいコンテンツに最適です。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式のRSS・sitemapパッケージ&lt;/strong&gt;: 別途ライブラリを探して組む必要がない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View Transitions&lt;/strong&gt;: MPAでありながらSPA風の滑らかなページ遷移を後付けできる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown/MDXでのページ作成&lt;/strong&gt;: &lt;code&gt;src/pages&lt;/code&gt;に&lt;code&gt;.md&lt;/code&gt;を置けばそのままページになる。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;歴史あるNext.jsやNuxt.jsには一歩及ばないかもしれませんが、それでも必要十分なパッケージが揃っている実感があります。Webサイトを作る分には困ることがない、という印象です。&lt;/p&gt;
&lt;h3&gt;5. ホスティング環境に合わせたアダプタ&lt;/h3&gt;
&lt;p&gt;アダプタとは、デプロイ先の環境に合わせてAstroの出力を最適化するプラグインです。&lt;/p&gt;
&lt;p&gt;Astroは基本的にビルド時に静的HTMLを生成する設計です。生成された成果物は、Cloudflare Pages・Netlify・Vercel・S3 など、静的ホスティングならどこにでも置けます。何なら国産レンタルサーバーも大丈夫！
サーバー機能が必要になっても、Node.js・Vercel・Netlify・Cloudflare Workers・Denoなど、アダプタを切り替えればホスティング先を変えられます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;静的HTMLの生成がビルド時に完結する設計なので、ホスティング側の制約を気にせず作れる&lt;/strong&gt;。これはWebサイト制作で意外と効いてきます。このサイトはホスティング先としてCloudflare Pagesを採用していますが、別環境への移行が必要になっても、コードベースを大きく書き換えずに対応できる安心感があります。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;紹介した内容はAstroの魅力のほんの一部ですが、伝わったでしょうか？&lt;/p&gt;
&lt;p&gt;Next.jsは「Webアプリを作る」ために、多くの強力な機能を内蔵しています。&lt;/p&gt;
&lt;p&gt;Astroは「コンテンツ駆動Webサイトを作れる」ことを目指していて、そのために必要なものを揃え、不要なものを削ぎ落とし、Webサイトとしての性能向上や実装体験の良さを追求しています。&lt;/p&gt;
&lt;p&gt;それぞれのフレームワークに特長があり、適切な技術選択が必要です。将来的に、Next.jsがパワーアップするかもしれないし、新たなプロダクトが台頭してくるかもしれません。&lt;/p&gt;
&lt;p&gt;エンジニアとして、これからもキャッチアップを続けていこうと思います！&lt;/p&gt;
&lt;h2&gt;Link&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;withastro/astro&quot;}&lt;/p&gt;
</content:encoded></item><item><title>Astroのテーマ「Fuwari」の紹介とカスタマイズ</title><link>https://stella-dev.biz/posts/fuwari-theme-customize/</link><guid isPermaLink="true">https://stella-dev.biz/posts/fuwari-theme-customize/</guid><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;このサイトはテンプレートテーマ「Fuwari」とフレームワーク「Astro」で作りました。&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;は、静的（SSG）サイトやコンテンツ中心のWebサイトの作成に適したフレームワークです。魅力的な機能満載で、筆者はサイト制作はもっぱらAstroを使っています。&lt;/p&gt;
&lt;p&gt;いつもはデフォルトの状態から作成を始めるのですが、このブログでは既存のテンプレートテーマを使用させていただきました。&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;Fuwari&lt;/a&gt;というテーマです。&lt;/p&gt;
&lt;h2&gt;Fuwariについて&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;fuwari-theme-img.png&quot; alt=&quot;Fuwariのデモサイトのスクリーンショット&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://fuwari.vercel.app/&quot;&gt;Fuwari デモサイト&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;かわいいイラスト、角丸で統一されたあしらい、抑えたカラートーンが目を引きますが、それだけではありません。機能開発の側面でも便利な実装が標準装備されていました。&lt;/p&gt;
&lt;p&gt;特に良いと思った機能をご紹介します。&lt;/p&gt;
&lt;h3&gt;ページ遷移アニメーション&lt;/h3&gt;
&lt;p&gt;ページ遷移時にふわっとしたアニメーションが自動的に適用されます。画面が一瞬で切り替わるのではなく、前のページがフェードアウトし、新しいページがフェードインするような効果が心地よいですね。&lt;/p&gt;
&lt;p&gt;この遷移アニメーションは、&lt;code&gt;@swup/astro&lt;/code&gt;パッケージを使うことで実装されています。特別な設定なしに使い始められるのが嬉しいポイントです。&lt;/p&gt;
&lt;h3&gt;MDファイルでページ作成&lt;/h3&gt;
&lt;p&gt;ブログ記事や固定ページをMarkdown形式で書くことが出来ます。この仕組みは、Astro標準機能の&lt;a href=&quot;https://docs.astro.build/ja/guides/content-collections/&quot;&gt;Content Collections&lt;/a&gt;を利用した実装です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/content/posts/&lt;/code&gt; ディレクトリ下にMDファイルを作成し、YAMLフロントマター（タイトルや公開日などのメタデータ）とMarkdown本文を書くだけで公開ページが生成されます。&lt;/p&gt;
&lt;p&gt;これも追加実装無しですぐに使えるのがありがたいですね！&lt;/p&gt;
&lt;h3&gt;サイト内検索&lt;/h3&gt;
&lt;p&gt;静的サイトなのに検索ができちゃいます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pagefind.app/&quot;&gt;Pagefind&lt;/a&gt;は静的サイト向けの全文検索ライブラリで、データベースを必要とせず、静的ファイルのみで検索機能を実現します。&lt;/p&gt;
&lt;p&gt;AstroでビルドしたHTMLから検索インデックスを自動生成します。検索に必要なJavaScriptやインデックスファイルはすべてビルド成果物に含まれるため、CDNやホスティングサービスにそのままデプロイできます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pagefind.app/&quot;&gt;公式サイト&lt;/a&gt;によると、10,000ページ規模のサイトでも検索に必要なネットワーク転送量は300kB以下（多くの場合100kB前後）に抑えられるそうで、パフォーマンス面でも優秀です。&lt;/p&gt;
&lt;p&gt;すごいですね〜！&lt;/p&gt;
&lt;h3&gt;sitemap.xmlとrss.xmlとrobots.txtを自動生成&lt;/h3&gt;
&lt;p&gt;SEOやブログ読者向けに欠かせない3つのファイルが自動生成されます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sitemap.xml&lt;/strong&gt; は&lt;code&gt;@astrojs/sitemap&lt;/code&gt;で実装。&lt;code&gt;astro.config.mjs&lt;/code&gt;に設定を追記するだけで、ビルド時にサイト内の全ページを収録した&lt;code&gt;sitemap-index.xml&lt;/code&gt;が自動的に出力されます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;rss.xml&lt;/strong&gt; は&lt;code&gt;@astrojs/rss&lt;/code&gt;パッケージを利用した&lt;code&gt;src/pages/rss.xml.ts&lt;/code&gt;で生成されます。記事タイトル・公開日・説明文、Markdownで書いた本文など、RSSに表示させたいものをカスタマイズできます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;robots.txt&lt;/strong&gt; は&lt;code&gt;src/pages/robots.txt.ts&lt;/code&gt;で生成されます。全クローラーに対してAstroの内部ディレクトリ（&lt;code&gt;/_astro/&lt;/code&gt;）へのアクセスを禁止と、sitemapのURLの明示がデフォルトで書かれています。&lt;/p&gt;
&lt;h3&gt;その他&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ライト/ダークモード対応&lt;/li&gt;
&lt;li&gt;カスタマイズ可能なテーマカラーとヘッダーバナー&lt;/li&gt;
&lt;li&gt;ブログ記事の見出しリンク自動生成&lt;/li&gt;
&lt;li&gt;ブログのページネーション&lt;/li&gt;
&lt;li&gt;アーカイブページはタイムライン構成&lt;/li&gt;
&lt;li&gt;RemarkプラグインでMD記法を拡張&lt;/li&gt;
&lt;li&gt;Faviconの初期設定&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fuwari未実装の機能を追加&lt;/h2&gt;
&lt;p&gt;以下、すこしだけ追加で機能実装、設定調整しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サイトのURLを&lt;code&gt;.env&lt;/code&gt;に記載し&lt;code&gt;astro.config.mjs&lt;/code&gt;にimportするように変更。&lt;code&gt;loadEnv&lt;/code&gt;を使用。&lt;/li&gt;
&lt;li&gt;RSSフィードで生成するサイトのURLを&lt;code&gt;astro.config.mjs&lt;/code&gt;から取得するように変更。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;canonical&lt;/code&gt;を自動生成する機能を追加。&lt;/li&gt;
&lt;li&gt;404ページを追加。&lt;/li&gt;
&lt;li&gt;faviconにtype属性を設定できるよう拡張。&lt;/li&gt;
&lt;li&gt;投稿内のlicense表示をoffに変更。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rehype-external-links&lt;/code&gt; を導入し、MD記法で外部リンクに&lt;code&gt;target=&quot;_blank&quot;&lt;/code&gt;を自動追加するように拡張。&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Fuwariはかわいい見た目と必要十分な機能が最初から備わっている、完成度の高いテーマだと思いました。特に、作るのが億劫になりがちなsitemap.xmlやrss.xml、robots.txtがデフォルトで生成可能になっているのは良いですね。&lt;/p&gt;
&lt;p&gt;Astroでブログを始めたい方にはぜひ試してみてほしいテーマだと思います！&lt;/p&gt;
&lt;h2&gt;Link&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;saicaca/fuwari&quot;}
::github{repo=&quot;withastro/astro&quot;}&lt;/p&gt;
</content:encoded></item></channel></rss>