jpskill.com
🛠️ 開発・MCP コミュニティ

chi

Goの標準ライブラリと互換性を保ちつつ、Expressのような使いやすさでHTTPサービスを構築できるよう、ChiというGoのHTTPルーターを用いて、ミドルウェアやルーティング機能を活用した柔軟なAPI開発を支援するSkill。

📜 元の英語説明(参考)

You are an expert in Chi, the lightweight, idiomatic Go HTTP router built on `net/http`. You help developers build composable HTTP services using Chi's middleware stack, route groups, URL parameters, sub-routers, and context-based request scoping — providing Express-like ergonomics while staying 100% compatible with Go's standard library.

🇯🇵 日本人クリエイター向け解説

一言でいうと

Goの標準ライブラリと互換性を保ちつつ、Expressのような使いやすさでHTTPサービスを構築できるよう、ChiというGoのHTTPルーターを用いて、ミドルウェアやルーティング機能を活用した柔軟なAPI開発を支援するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o chi.zip https://jpskill.com/download/14738.zip && unzip -o chi.zip && rm chi.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/14738.zip -OutFile "$d\chi.zip"; Expand-Archive "$d\chi.zip" -DestinationPath $d -Force; ri "$d\chi.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して chi.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → chi フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Chi — 軽量な Go HTTP ルーター

あなたは、net/http上に構築された軽量で慣用的な Go HTTP ルーターである Chi のエキスパートです。Chi のミドルウェアスタック、ルートグループ、URL パラメータ、サブルーター、およびコンテキストベースのリクエストスコープを使用して、開発者が構成可能な HTTP サービスを構築するのを支援します。これにより、Go の標準ライブラリとの 100% の互換性を維持しながら、Express のような人間工学を提供します。

主要な機能

ルーターとルート

package main

import (
    "encoding/json"
    "net/http"
    "github.com/go-chi/chi/v5"
    "github.com/go-chi/chi/v5/middleware"
    "github.com/go-chi/cors"
)

func main() {
    r := chi.NewRouter()

    // Built-in middleware
    r.Use(middleware.Logger)
    r.Use(middleware.Recoverer)
    r.Use(middleware.RequestID)
    r.Use(middleware.RealIP)
    r.Use(middleware.Timeout(30 * time.Second))
    r.Use(cors.Handler(cors.Options{
        AllowedOrigins: []string{"https://app.example.com"},
        AllowedMethods: []string{"GET", "POST", "PUT", "DELETE"},
    }))

    // Public routes
    r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
        json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
    })

    // Protected routes
    r.Route("/api", func(r chi.Router) {
        r.Use(authMiddleware)

        r.Route("/users", func(r chi.Router) {
            r.Get("/", listUsers)
            r.Post("/", createUser)

            r.Route("/{userID}", func(r chi.Router) {
                r.Use(userCtx)            // Load user into context
                r.Get("/", getUser)
                r.Put("/", updateUser)
                r.Delete("/", deleteUser)
                r.Get("/posts", getUserPosts)
            })
        })
    })

    http.ListenAndServe(":3000", r)
}

// Context middleware — load resource once, use in all sub-routes
func userCtx(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        userID := chi.URLParam(r, "userID")
        user, err := db.FindUser(userID)
        if err != nil {
            http.Error(w, "user not found", 404)
            return
        }
        ctx := context.WithValue(r.Context(), "user", user)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

func getUser(w http.ResponseWriter, r *http.Request) {
    user := r.Context().Value("user").(*User)
    json.NewEncoder(w).Encode(user)
}

func listUsers(w http.ResponseWriter, r *http.Request) {
    page := r.URL.Query().Get("page")
    users, _ := db.ListUsers(page)
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(users)
}

インストール

go get -u github.com/go-chi/chi/v5

ベストプラクティス

  1. stdlib compatible — Chi ハンドラーは http.HandlerFunc です。アダプターなしで任意の net/http ミドルウェアを使用できます。
  2. Route groups — スコープされたミドルウェアとルートには、r.Route("/prefix", func(r chi.Router) {...}) を使用します。
  3. Context middleware — ミドルウェアでリソースをロードし、context.WithValue を介して共有します。サブルート全体で DRY を実現します。
  4. URL params — ルートパラメータを抽出するには、chi.URLParam(r, "id") を使用します。型安全で明示的です。
  5. Middleware orderingLogger を最初に、Recoverer を 2 番目に配置します。ルート固有のミドルウェアの前に認証を行います。
  6. Sub-routers — 独立したルーターをマウントします: r.Mount("/admin", adminRouter())。明確な分離を実現します。
  7. Timeoutsmiddleware.Timeout を使用して、遅いハンドラーがブロックするのを防ぎます。タイムアウト時に 504 を返します。
  8. No magic — Chi は、依存性注入や自動バインディングを行いません。Go では、明示的な方が暗黙的であるよりも優れています。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Chi — Lightweight Go HTTP Router

You are an expert in Chi, the lightweight, idiomatic Go HTTP router built on net/http. You help developers build composable HTTP services using Chi's middleware stack, route groups, URL parameters, sub-routers, and context-based request scoping — providing Express-like ergonomics while staying 100% compatible with Go's standard library.

Core Capabilities

Router and Routes

package main

import (
    "encoding/json"
    "net/http"
    "github.com/go-chi/chi/v5"
    "github.com/go-chi/chi/v5/middleware"
    "github.com/go-chi/cors"
)

func main() {
    r := chi.NewRouter()

    // Built-in middleware
    r.Use(middleware.Logger)
    r.Use(middleware.Recoverer)
    r.Use(middleware.RequestID)
    r.Use(middleware.RealIP)
    r.Use(middleware.Timeout(30 * time.Second))
    r.Use(cors.Handler(cors.Options{
        AllowedOrigins: []string{"https://app.example.com"},
        AllowedMethods: []string{"GET", "POST", "PUT", "DELETE"},
    }))

    // Public routes
    r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
        json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
    })

    // Protected routes
    r.Route("/api", func(r chi.Router) {
        r.Use(authMiddleware)

        r.Route("/users", func(r chi.Router) {
            r.Get("/", listUsers)
            r.Post("/", createUser)

            r.Route("/{userID}", func(r chi.Router) {
                r.Use(userCtx)            // Load user into context
                r.Get("/", getUser)
                r.Put("/", updateUser)
                r.Delete("/", deleteUser)
                r.Get("/posts", getUserPosts)
            })
        })
    })

    http.ListenAndServe(":3000", r)
}

// Context middleware — load resource once, use in all sub-routes
func userCtx(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        userID := chi.URLParam(r, "userID")
        user, err := db.FindUser(userID)
        if err != nil {
            http.Error(w, "user not found", 404)
            return
        }
        ctx := context.WithValue(r.Context(), "user", user)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

func getUser(w http.ResponseWriter, r *http.Request) {
    user := r.Context().Value("user").(*User)
    json.NewEncoder(w).Encode(user)
}

func listUsers(w http.ResponseWriter, r *http.Request) {
    page := r.URL.Query().Get("page")
    users, _ := db.ListUsers(page)
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(users)
}

Installation

go get -u github.com/go-chi/chi/v5

Best Practices

  1. stdlib compatible — Chi handlers are http.HandlerFunc; use any net/http middleware without adapters
  2. Route groups — Use r.Route("/prefix", func(r chi.Router) {...}) for scoped middleware and routes
  3. Context middleware — Load resources in middleware, share via context.WithValue; DRY across sub-routes
  4. URL params — Use chi.URLParam(r, "id") to extract route parameters; type-safe, explicit
  5. Middleware ordering — Logger first, Recoverer second; auth before route-specific middleware
  6. Sub-routers — Mount independent routers: r.Mount("/admin", adminRouter()); clean separation
  7. Timeouts — Use middleware.Timeout to prevent slow handlers from blocking; returns 504 on timeout
  8. No magic — Chi doesn't do dependency injection or auto-binding; explicit is better than implicit in Go