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 コマンドを実行
# プロジェクトを作成(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!コード解説
npx sv create my-app
npx:npmパッケージを一時的に実行するコマンドsv:SvelteKit公式のCLIツールcreate:新規プロジェクト作成my-app:プロジェクト名(フォルダ名になる)
2 依存関係のインストールと起動
npm installと開発サーバー起動
プロジェクトフォルダに移動して実行
# プロジェクトフォルダに移動
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ブラウザで確認
http://localhost:5173/ をブラウザで開くと、SvelteKitのウェルカムページが表示されます!
コマンド解説
cd my-app:my-appフォルダに移動(change directory)
npm install:package.jsonに書かれたライブラリをダウンロード
npm run dev:開発サーバーを起動(ファイル保存で自動リロード)
3 プロジェクト構造を理解する
フォルダ構造
作成されたファイルとその役割
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/ - ページの場所
このフォルダの構造がそのままURLになります。
routes/+page.svelte→/routes/about/+page.svelte→/aboutroutes/blog/[slug]/+page.svelte→/blog/記事ID
src/lib/ - 共通部品
$libというエイリアスでインポートできます。
import Button from '$lib/components/Button.svelte';
4 Tailwind CSSが動いているか確認
app.css の確認
Tailwindの読み込み
/* src/app.css */
/* sv createで自動的に追加されている */
@import 'tailwindcss';
/* カスタムスタイルを追加する場合はここに書く */Tailwindを使ってみる
+page.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:フォントサイズ30pxfont-bold:太字text-blue-600:青色の文字mt-4:上にmargin 16pxpx-6:左右padding 24pxpy-2:上下padding 8pxbg-orange-500:オレンジ背景rounded-lg:角丸8pxhover:bg-orange-600:ホバー時に色変更transition-colors:色変化をアニメーション5 新しいページを追加する
Aboutページを作成
routes/about/+page.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>確認方法
ファイルを保存して http://localhost:5173/about にアクセス!
6 共通レイアウトを作る
+layout.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>コード解説
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セクション専用のサイドバー付きレイアウト
<!-- 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>なぜページにimportを書かなくても適用されるのか?
SvelteKitの「ファイル規約」
SvelteKitはファイル名で役割を判断します。+layout.svelteという名前を見つけると、自動的に「これはレイアウトだ」と認識し、該当フォルダのページを包み込みます。
ビルド時に自動で組み立てられる
開発者が書くのはページ(+page.svelte)だけ。SvelteKitがビルド時に以下を自動で行います:
- 親フォルダから順に
+layout.svelteを探す - 見つけたレイアウトを順番にネストする
- 最後にページコンテンツを
{@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など) |