#SvelteKit#Cloudflare#TypeScript#TailwindCSS

SvelteKit + Cloudflare Workers で技術ブログを作った話

👻
管理人: miyabitti
📅 2025年12月6日 ⏱️ 読了まで: 約3分

📖 もくじ

ここに広告とか
置きたい
SPONSOR

はじめに

「自分だけのブログが欲しい!」

そう思い立って、折角Cloudflareでドメインを契約したのもありCloudflare Workers + Next.jsでブログを構築してみたけど、管理者ダッシュボードをサイト上に構築したら、ファイルサイズ制限が無料枠に収まらなくて、なくなく断念(ノД`)

そもそもこの程度のブログサイト構築には、Nextの勝手によしなに具合がベリースーパーオーバースペックだったので、ビルドサイズが小さくなるSvelteKit を使ってこのブログを作りました。(ほぼ静的サイトなので、Pagesにデプロイしています)

この記事では、ブログ構築の過程で使った技術スタックや、実装したこだわりの機能について紹介します。

技術スタック

このブログは以下の技術で構成されています:

カテゴリ技術
フレームワークSvelteKit
ホスティングCloudflare Workers (Pages)
スタイリングTailwindCSS v4
アニメーションThree.js, GSAP + ScrollTrigger
UIコンポーネントshadcn-svelte
マークダウン処理mdsvex, remark,rehype
画像ストレージCloudflare R2
パッケージマネージャーBun

デザインのこだわり

パステルブルーの世界観

「かわいい」けど「読みやすい」を両立したい

メインカラーには #7DD3FC (パステルブルー) を採用。背景には格子状のラインとThree.jsを使って、オブジェクトの色は薄いながらも動きを持たせて、ふわっとした印象に仕上げました。

/* メインカラーの定義の例 */
--color-main-blue: #7dd3fc;
--color-accent-pink: #f9a8d4;
--color-accent-yellow: #fde68a;

ヘッダーアニメーション

スクロールに応じてヘッダーが見え隠れするアニメーションを GSAP で実装しました。

onMount(() => {
  gsap.registerPlugin(ScrollTrigger);

  const header = document.getElementById("main-header");
  let lastScroll = 0;

  ScrollTrigger.create({
    start: "top top",
    end: 99999,
    onUpdate: (self) => {
      const currentScroll = self.scroll();
      if (currentScroll > lastScroll && currentScroll > 50) {
        header?.classList.add("hide");
      } else {
        header?.classList.remove("hide");
      }
      lastScroll = currentScroll;
    },
  });
});

Zenn風マークダウン記法

このブログでは、Zennをパクってマークダウン記法を実装しました。

メッセージボックス

:::message
これは情報メッセージです。重要なお知らせに使えます。
:::

↓実際の表示

ℹ️

これは情報メッセージです。重要なお知らせに使えます。

:::message alert
これは警告メッセージです。注意が必要な内容に使います。
:::

↓実際の表示

⚠️

これは警告メッセージです。注意が必要な内容に使います。

折りたたみセクション

:::details クリックして展開
隠れたコンテンツがここに表示されます。
長いコードブロックや補足情報を隠すのに便利です。
:::

↓実際の表示

クリックして展開

隠れたコンテンツがここに表示されます。 長いコードブロックや補足情報を隠すのに便利です。

数式サポート

$$
E = mc^2
$$

↓実際の表示

E=mc2E = mc^2

インライン数式も α+β=γ\alpha + \beta = \gamma のように書けます。

開発者ダッシュボード

執筆体験を向上させるため、開発環境専用のダッシュボードを実装しました。

記事管理機能

  • 公開記事・下書きの一覧表示
  • 各記事へのクイックアクセス
  • 公開状態のフィルタリング

メディア管理機能

画像アップロード機能では以下をサポートします。

  1. ドラッグ&ドロップでアップロード
  2. CanvasAPIを用いてクライアントサイドWebP変換でファイルサイズ削減
  3. Cloudflare R2 への自動保存
  4. ワンクリックでMarkdown形式をコピー
// WebP変換の実装例
canvas.toBlob((blob) => resolve(blob), "image/webp", quality / 100);

記事の公開フロー

記事の公開は frontmatter の published フラグで制御しています:

---
title: "記事タイトル"
published: false # true にすると公開
---

開発環境では下書き記事もプレビューでき、本番環境では自動的に非表示になります。

テンプレート生成スクリプト

新しい記事は以下のコマンドで作成できます:

bun run new-article --slug my-article-slug

これにより、デフォルトの frontmatter が含まれたテンプレートファイルが生成されます。

まとめ

初めてSvelteKitを使ってサイトを作成してみましたが、最初にNextで作ったブログより遥かに小さいビルドサイズで、より快適な執筆環境が作れました。

デザインもAIと壁打ちして作ってもらったのですが、結構気に入っています!

これからもこのブログを育てていきたいと思います。読んでくれてありがとうございました!

📝 最新の記事

👻

miyabitti

技術力が追いつかないので、雰囲気でカバーしています。

この記事、役に立った?( ˘ω˘)