SvelteKitで作るフルスタック個人ブログ | 第1回: SvelteKitの紹介とプロジェクトのセットアップ

こんにちは！このシリーズでは、**SvelteKit**を使って個人ブログをゼロから構築する方法をステップごとに解説します。SvelteKitは、モダンなフルスタックフレームワークで、シンプルな記述と高いパフォーマンスが魅力です。ReactやNext.jsを使った経験がある方にも、SvelteKitの違いや魅力を感じていただけるよう、適宜比較を交えながら進めます。

第1回では、SvelteKitの概要を紹介し、ブログプロジェクトの基本的なセットアップを行います。**Skeleton UI**と**Tailwind CSS**を使って、モダンなUIの土台を作りましょう。さあ、始めましょう！

---

## SvelteとSvelteKitとは？

### Svelteの特徴
Svelteは、**コンパイラベース**のJavaScriptフレームワークです。ReactやVueのような仮想DOMを使わず、ビルド時に純粋なJavaScriptに変換されます。これにより、ランタイムのオーバーヘッドが減り、パフォーマンスが向上します。

例えば、Reactでカウンターを作る場合、以下のように`useState`が必要です：

```jsx
// React
import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);
  return (
    <button onClick={() => setCount(count + 1)}>
      Count: {count}
    </button>
  );
}
```

一方、Svelteでは以下のようにシンプルに書けます：

```svelte
<!-- Svelte -->
<script>
  let count = 0;
</script>

<button on:click={() => count++}>
  Count: {count}
</button>
```

`count`が変更されると、Svelteが自動でUIを更新します。この**直感的な記述**が、Svelteの開発体験（DX）の魅力です。

### SvelteKitとは？
SvelteKitは、Svelteをベースにしたフルスタックフレームワークで、Next.jsに似た機能を提供します。以下のような特徴があります：
- **ファイルベースのルーティング**：フォルダ構造でページやAPIを定義。
- **SSR/SSG対応**：サーバーサイドレンダリングや静的サイト生成が簡単。
- **APIルート**：バックエンドAPIを同じプロジェクト内で構築可能。

このシリーズでは、SvelteKitを使ってブログのフロントエンドとバックエンドを構築し、**Skeleton UI**で美しいUIを、**TypeScript**で型安全性を確保します。

---

## プロジェクトのセットアップ

それでは、ブログプロジェクトを始めましょう！以下の手順で環境を整えます。

### 1. SvelteKitプロジェクトの作成
SvelteKitのプロジェクトは、以下のコマンドで簡単に作成できます：

```bash
npm create svelte@latest my-blog
```

実行後、以下の選択肢を選びます：
- テンプレート：`Skeleton project`
- TypeScript：`Yes`
- ESLint/Prettier：`Yes`（コード品質のため）

セットアップ後、プロジェクトに移動して依存パッケージをインストールします：

```bash
cd my-blog
npm install
```

開発サーバーを起動して、初期状態を確認しましょう：

```bash
npm run dev
```

ブラウザで`http://localhost:5173`を開くと、SvelteKitのウェルカムページが表示されます。

### 2. Skeleton UIとTailwind CSSのインストール
ブログのUIをモダンにするため、**Skeleton UI**を導入します。Skeleton UIは、Svelte向けの軽量なコンポーネントライブラリで、Tailwind CSSと相性が良いです。

以下のコマンドでインストールします：

```bash
npm install @skeletonlabs/skeleton @skeletonlabs/tw-plugin --save-dev
```

次に、Tailwind CSSをプロジェクトに追加します。`tailwind.config.js`を以下のように設定：

```js
/** @type {import('tailwindcss').Config} */
export default {
  content: ['./src/**/*.{html,js,svelte,ts}', './node_modules/@skeletonlabs/skeleton/**/*.{html,js,svelte,ts}'],
  theme: { extend: {} },
  plugins: [require('@skeletonlabs/tw-plugin')]
};
```

`src/app.css`にSkeleton UIのスタイルを追加：

```css
@import '@skeletonlabs/skeleton/styles/skeleton.css';
@import './skeleton-theme.css';
@tailwind base;
@tailwind components;
@tailwind utilities;
```

Skeleton UIのテーマをカスタマイズするために、`skeleton-theme.css`を作成（`src/`下）：

```css
:root {
  --theme-font-family-base: system-ui;
  --on-primary: 0 0 0;
  --on-secondary: 255 255 255;
  --color-primary-500: 59 130 246;
  --color-secondary-500: 17 24 39;
}
```

これで、Skeleton UIのコンポーネントがTailwindのスタイルと連動します。

### 3. 基本レイアウトの作成
ブログの基本レイアウト（ナビゲーションとフッター）を作ります。SvelteKitでは、`src/routes/+layout.svelte`が全ページに適用されるレイアウトファイルです。

`+layout.svelte`を以下のように編集：

```svelte
<script>
  import { AppBar, AppShell } from '@skeletonlabs/skeleton';
</script>

<AppShell>
  <svelte:fragment slot="header">
    <AppBar background="bg-primary-500">
      <svelte:fragment slot="lead">
        <h1 class="text-2xl font-bold text-white">My Blog</h1>
      </svelte:fragment>
      <svelte:fragment slot="trail">
        <a href="/" class="btn variant-ghost-surface">Home</a>
        <a href="/blog" class="btn variant-ghost-surface">Blog</a>
        <a href="/about" class="btn variant-ghost-surface">About</a>
      </svelte:fragment>
    </AppBar>
  </svelte:fragment>

  <slot />

  <svelte:fragment slot="footer">
    <footer class="bg-surface-900 text-white p-4 text-center">
      <p>&copy; 2025 My Blog. All rights reserved.</p>
    </footer>
  </svelte:fragment>
</AppShell>
```

- **解説**：
  - `<AppBar>`はSkeleton UIのナビゲーションバーコンポーネントです。
  - `<AppShell>`は、ヘッダー、コンテンツ、フッターを構造化します。
  - `<slot />`は、各ページのコンテンツを挿入する場所です。

### 4. ホームページの作成
ホームページを作成するため、`src/routes/+page.svelte`を編集：

```svelte
<script>
  import { Avatar, Card } from '@skeletonlabs/skeleton';
</script>

<div class="container mx-auto p-8">
  <Card>
    <div class="p-4 space-y-4">
      <h2 class="h2">Welcome to My Blog!</h2>
      <p class="text-lg">This is a personal blog built with SvelteKit.</p>
      <Avatar src="https://via.placeholder.com/150" width="w-24" />
      <p>Follow along as we build this blog from scratch!</p>
    </div>
  </Card>
</div>
```

ここでは、Skeleton UIの`Card`と`Avatar`を使ってシンプルなウェルカムメッセージを表示します。

---

## 動作確認
プロジェクトを起動して確認しましょう：

```bash
npm run dev
```

ブラウザで`http://localhost:5173`を開くと、以下のようなページが表示されます：
- 上部にナビゲーションバー（Home, Blog, About）。
- 中央にウェルカムメッセージとアバター画像。
- 下部にフッター。

ReactやNext.jsでは、同様のレイアウトを作るのに`useState`や`useEffect`で状態管理が必要になる場合がありますが、SvelteKitではこの段階では状態管理が不要で、**記述量が少ない**のが魅力です。

---

## やってみよう！（チャレンジ）
Skeleton UIのテーマをカスタマイズしてみましょう！例えば、`skeleton-theme.css`で`--color-primary-500`を別の色（例：`#f43f5e`）に変更して、ナビゲーションバーの雰囲気を変えてみてください。また、Skeleton UIのドキュメント[公式サイト](https://www.skeleton.dev/)を見て、別のコンポーネント（例：`Button`や`Modal`）を試してみるのもおすすめです！

---

## まとめ
この記事では、SvelteKitの基本を紹介し、ブログプロジェクトのセットアップを行いました。**Skeleton UI**と**Tailwind CSS**を使って、モダンなレイアウトを簡単に構築できました。次回は、ブログの記事一覧や詳細ページをSvelteコンポーネントで作り、データを動的に表示する方法を解説します。お楽しみに！

この記事が役に立ったと思ったら、**LGTM**や**ストック**していただけると嬉しいです！質問や改善アイデアがあれば、コメントで教えてください。次の記事でまたお会いしましょう！