さとまたwiki

Tailwind導入

SvelteKit + Tailwind CSSの環境構築とプロジェクト作成

このページで作るもの

🔥 + 💨

SvelteKit(Webアプリフレームワーク)とTailwind CSS(CSSフレームワーク)を組み合わせた、モダンな開発環境を構築します。

必要なもの

  • Node.js(v18以上)- 公式サイトからダウンロード
  • テキストエディタ - VS Code がおすすめ
  • ターミナル - コマンドを実行するために必要

Node.jsがインストールされているか確認

ターミナルで以下を実行:

node -v

バージョン番号(v18.x.x など)が表示されればOK

1 プロジェクト作成

SvelteKitプロジェクトの作成

npx sv create コマンドを実行

bash
# プロジェクトを作成(my-appは好きな名前に変更可能)
npx sv create my-app

# 質問に答える:
# ┌  Welcome to the Svelte CLI!
# │
# ◆  Which template would you like?
# │  ● SvelteKit minimal(これを選択)
# │  ○ SvelteKit demo
# │  ○ Svelte library
# │
# ◆  Add type checking with Typescript?
# │  ● Yes, using Typescript syntax(TypeScriptを使う場合)
# │  ○ Yes, using JSDoc comments
# │  ○ No
# │
# ◆  What would you like to add to your project?
# │  ◻ prettier(コード整形)
# │  ◻ eslint(コード検査)
# │  ☑ tailwindcss(これを選択!)  ← 重要
# │  ◻ drizzle
# │  ◻ lucia
# │  ◻ mdsvex
# │
# ◆  tailwindcss: Which plugins would you like to add?
# │  ◻ typography(文章向けスタイル)
# │  ◻ forms(フォーム向けスタイル)
# │  ◻ container-queries
# │  (必要なものを選択、なくてもOK)
# │
# └  Your project is ready!
プレビュー
✓ プロジェクト作成完了
my-app/
├── src/
├── tailwind.config.ts
└── package.json

コード解説

npx sv create my-app

  • npx:npmパッケージを一時的に実行するコマンド
  • sv:SvelteKit公式のCLIツール
  • create:新規プロジェクト作成
  • my-app:プロジェクト名(フォルダ名になる)

2 依存関係のインストールと起動

npm installと開発サーバー起動

プロジェクトフォルダに移動して実行

bash
# プロジェクトフォルダに移動
cd my-app

# 依存関係をインストール
npm install

# 開発サーバーを起動
npm run dev

# 表示される内容:
#   VITE v5.x.x  ready in xxx ms
#
#   ➜  Local:   http://localhost:5173/
#   ➜  Network: use --host to expose
#
#   ➜  press h + enter to show help
プレビュー
VITE ready
➜ Local: http://localhost:5173/
ブラウザでこのURLを開く!

ブラウザで確認

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

コマンド解説

cd my-app:my-appフォルダに移動(change directory)

npm install:package.jsonに書かれたライブラリをダウンロード

npm run dev:開発サーバーを起動(ファイル保存で自動リロード)

3 プロジェクト構造を理解する

フォルダ構造

作成されたファイルとその役割

text
my-app/
├── src/
│   ├── routes/              ← ページを置く場所(重要!)
│   │   └── +page.svelte     ← トップページ(/)
│   ├── lib/                 ← 共通コンポーネントやユーティリティ
│   ├── app.html             ← HTMLテンプレート
│   └── app.css              ← グローバルCSS(Tailwind読み込み済み)
│
├── static/                  ← 画像などの静的ファイル
│   └── favicon.png
│
├── tailwind.config.ts       ← Tailwindの設定
├── svelte.config.js         ← SvelteKitの設定
├── vite.config.ts           ← ビルドツールの設定
├── package.json             ← 依存関係とスクリプト
└── tsconfig.json            ← TypeScript設定
プレビュー
src/routes/
ここにページを作る
src/lib/
共通パーツを置く

重要なフォルダの解説

src/routes/ - ページの場所

このフォルダの構造がそのままURLになります。

  • routes/+page.svelte/
  • routes/about/+page.svelte/about
  • routes/blog/[slug]/+page.svelte/blog/記事ID

src/lib/ - 共通部品

$libというエイリアスでインポートできます。

import Button from '$lib/components/Button.svelte';

4 Tailwind CSSが動いているか確認

app.css の確認

Tailwindの読み込み

css
/* src/app.css */
/* sv createで自動的に追加されている */
@import 'tailwindcss';

/* カスタムスタイルを追加する場合はここに書く */
プレビュー
/* @import 'tailwindcss' で
Tailwindの全機能が使える */

Tailwindを使ってみる

+page.svelte を編集

svelte
<!-- src/routes/+page.svelte -->
<h1 class="text-3xl font-bold text-blue-600">
  Hello SvelteKit + Tailwind!
</h1>

<p class="mt-4 text-gray-600">
  Tailwind CSSが正常に動作しています。
</p>

<button class="mt-4 px-6 py-2 bg-orange-500 text-white rounded-lg hover:bg-orange-600 transition-colors">
  ボタン
</button>
プレビュー

Hello SvelteKit + Tailwind!

Tailwind CSSが正常に動作しています。

クラスの解説

text-3xl:フォントサイズ30px
font-bold:太字
text-blue-600:青色の文字
mt-4:上にmargin 16px
px-6:左右padding 24px
py-2:上下padding 8px
bg-orange-500:オレンジ背景
rounded-lg:角丸8px
hover:bg-orange-600:ホバー時に色変更
transition-colors:色変化をアニメーション

5 新しいページを追加する

Aboutページを作成

routes/about/+page.svelte を作成

svelte
<!-- src/routes/about/+page.svelte -->
<svelte:head>
  <title>About | My App</title>
</svelte:head>

<div class="max-w-2xl mx-auto py-12 px-4">
  <h1 class="text-3xl font-bold mb-6">About</h1>

  <p class="text-gray-600 leading-relaxed">
    このサイトはSvelteKitとTailwind CSSで作られています。
  </p>

  <a
    href="/"
    class="inline-block mt-6 text-blue-600 hover:underline"
  >
    ← ホームに戻る
  </a>
</div>
プレビュー

About

このサイトはSvelteKitとTailwind CSSで作られています。

← ホームに戻る

確認方法

ファイルを保存して http://localhost:5173/about にアクセス!

6 共通レイアウトを作る

+layout.svelte

全ページ共通のヘッダー・フッター

svelte
<!-- src/routes/+layout.svelte -->
<script>
  import '../app.css';
  let { children } = $props();
</script>

<div class="min-h-screen flex flex-col">
  <!-- ヘッダー -->
  <header class="bg-white border-b sticky top-0 z-50">
    <div class="max-w-6xl mx-auto px-4 py-4 flex items-center justify-between">
      <a href="/" class="text-xl font-bold text-orange-500">
        My App
      </a>
      <nav class="flex gap-6">
        <a href="/" class="hover:text-orange-500 transition-colors">ホーム</a>
        <a href="/about" class="hover:text-orange-500 transition-colors">About</a>
      </nav>
    </div>
  </header>

  <!-- メインコンテンツ -->
  <main class="flex-1">
    {@render children()}
  </main>

  <!-- フッター -->
  <footer class="bg-gray-100 border-t">
    <div class="max-w-6xl mx-auto px-4 py-6 text-center text-gray-600">
      © 2024 My App. All rights reserved.
    </div>
  </footer>
</div>
プレビュー
My App
ホームAbout
ページ内容
© 2024 My App

コード解説

import '../app.css':Tailwindを全ページで読み込む

let { children } = $props():各ページの内容を受け取る

{@render children()}:ページの内容をここに表示

レイアウトの仕組み(重要!)

自動適用される

+layout.svelte を作成するだけで、同階層と全ての子ページに自動で適用されます。インポートは不要です。

配置場所による適用範囲

src/routes/+layout.svelte → 全ページに適用(ルートレイアウト)

src/routes/blog/+layout.svelte → /blog 以下のみに適用

src/routes/admin/+layout.svelte → /admin 以下のみに適用

レイアウトのネスト(入れ子)

子フォルダにも+layout.svelteを作ると、レイアウトが入れ子になります。

例: /blog/hello にアクセスすると...

1. routes/+layout.svelte(ルートレイアウト:ヘッダー・フッター)

↓ この中に

2. routes/blog/+layout.svelte(blogレイアウト:サイドバー等)

↓ この中に

3. routes/blog/[slug]/+page.svelte(実際のページ内容)

セクション別レイアウトの例

blogセクション専用のサイドバー付きレイアウト

svelte
<!-- src/routes/blog/+layout.svelte -->
<script>
  let { children } = $props();
</script>

<!-- ルートレイアウト(ヘッダー・フッター)の中に表示される -->
<div class="flex max-w-6xl mx-auto">
  <!-- サイドバー -->
  <aside class="w-64 p-4 border-r">
    <h3 class="font-bold mb-4">カテゴリ</h3>
    <ul class="space-y-2">
      <li><a href="/blog?cat=tech">技術</a></li>
      <li><a href="/blog?cat=life">生活</a></li>
    </ul>
  </aside>

  <!-- 記事コンテンツ -->
  <main class="flex-1 p-6">
    {@render children()}
  </main>
</div>
プレビュー
← ルートレイアウト(ヘッダー)
カテゴリ
技術
生活
記事内容
(+page.svelte)
← ルートレイアウト(フッター)

なぜページにimportを書かなくても適用されるのか?

SvelteKitの「ファイル規約」

SvelteKitはファイル名で役割を判断します。+layout.svelteという名前を見つけると、自動的に「これはレイアウトだ」と認識し、該当フォルダのページを包み込みます。

ビルド時に自動で組み立てられる

開発者が書くのはページ(+page.svelte)だけ。SvelteKitがビルド時に以下を自動で行います:

  1. 親フォルダから順に+layout.svelteを探す
  2. 見つけたレイアウトを順番にネストする
  3. 最後にページコンテンツを{@render children()}の位置に挿入

ページ側でやることは「何もない」

<h1>Aboutページ</h1>

<p>これだけでOK。レイアウトは自動で適用される。</p>

↑ このシンプルなコードだけで、ヘッダー・フッター付きで表示されます。

図解:レイアウト自動適用の流れ

例: /about にアクセスした時

1. SvelteKitが routes/+layout.svelte を見つける

2. SvelteKitが routes/about/+page.svelte を見つける

3. 自動で以下のように組み立てる:

<!-- +layout.svelte の内容 -->

<Header />

<main>

<!-- ここに +page.svelte が自動挿入 -->

<h1>Aboutページ</h1>

<p>これだけでOK...</p>

</main>

<Footer />

従来のフレームワークとの違い

従来の方法(React等)

import Layout from '../Layout';

function About() {

return (

<Layout>

<h1>About</h1>

</Layout>

);

}

毎回importして囲む必要がある

SvelteKitの方法

<h1>About</h1>

// これだけ!

// importもラップも不要

ファイル名規約で自動適用

まとめ

  • +layout.svelteを置くだけで自動適用(ページ側でimport不要)
  • SvelteKitがファイル名規約で役割を判断する
  • ビルド時に自動でレイアウトとページを組み立てる
  • 開発者はページの中身だけに集中できる

よく使うコマンド

コマンド説明
npm run dev開発サーバーを起動(ホットリロード付き)
npm run build本番用にビルド
npm run previewビルド結果をプレビュー
npm install パッケージ名パッケージを追加
npx sv add機能を追加(Tailwind, Drizzle, Luciaなど)

次のステップ