본문으로 건너뛰기
cccskills
무료GitHub에 공개

go-embedded-spa

This skill provides guidance for implementing Go Embedded SPA architecture - embedding React/Vue/TSX frontend static resources into Go binary using go:embed directive. Use this skill when building self-contained single-binary applications, implementing SPA with Go backend, setting up cross-platform deployable full-stack projects, or configuring static file serving with Go standard library net/http.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(6)

  • SKILL.md5.7 KB
  • references/embed.md4.2 KB
  • references/go-dependencies.md2.1 KB
  • references/makefile.md8.5 KB
  • references/siteserver.md7.7 KB
  • references/vite-config.md3.0 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Go Embedded SPA

Overview

Go Embedded SPA is a technique that embeds frontend SPA (Single Page Application) static resources (React/Vue/TSX) into Go binary files using Go 1.16+ embed package, achieving single-binary full-stack deployment.

Core Benefits

BenefitDescription
🎯 Single File DeployOne binary contains both frontend and backend, no nginx needed
🌍 Cross-PlatformGOOS/GOARCH easily compiles for Linux/Mac/Windows
📦 Zero DependenciesTarget machine needs no Node.js/npm, uses Go standard library only
🚀 Container FriendlyDockerfile only needs COPY + ENTRYPOINT
🔒 Resource SecurityStatic resources compiled into binary, tamper-proof
⚡ Fast StartupNo disk I/O for loading static files

Project Structure

project/
├── go.mod
├── Makefile
├── site/                    # Frontend project
│   ├── embed.go             # Go embed directive
│   ├── src/                 # React/Vue source
│   ├── dist/                # Build output (embedded)
│   ├── package.json
│   ├── vite.config.ts
│   └── index.html
├── pkg/
│   └── siteserver/          # Static file server
│       └── siteserver.go
└── cmd/
    └── app/
        └── main.go

Implementation Steps

Step 1: Create embed.go

Create site/embed.go to declare embed directive. See references/embed.md for complete code.

Key points:

  • Use //go:embed all:dist to embed all files including hidden files
  • Use fs.Sub() to remove dist/ prefix

Step 2: Create Static File Server

Create pkg/siteserver/siteserver.go. See references/siteserver.md for complete implementation using Go standard net/http.

Core logic:

  1. Pre-load index.html for SPA fallback
  2. Create http.FileServer from embed.FS
  3. Detect static resources by file extension
  4. Return index.html for SPA routes (no file extension)

Step 3: Application Integration

package main

import (
    "log"
    "net/http"
    
    "your-project/pkg/siteserver"
    "your-project/site"
)

func main() {
    mux := http.NewServeMux()
    
    // 1. Register API routes FIRST
    mux.HandleFunc("/apis/v1/health", healthHandler)
    mux.HandleFunc("/apis/v1/data", dataHandler)
    
    // 2. Wrap with static file server (as fallback)
    handler := siteserver.WrapHandler(mux, site.DistDirFS)
    
    log.Println("Server starting on :8080")
    log.Fatal(http.ListenAndServe(":8080", handler))
}

Order is critical: API routes must be registered before static file server.

Step 4: Development

Recommended: Start both backend and frontend with one command:

make dev
# Backend:  http://localhost:8080 (Go)
# Frontend: http://localhost:5173 (Vite with hot reload)
# API Proxy: /api/* -> localhost:8080

Press Ctrl+C to stop both servers.

Step 5: Build for Production

Build order: frontend first, then backend

make build          # Build both (frontend + backend)
# Or separately:
make build-web      # npm run build → site/dist/
make build-backend  # go build (embeds dist/)

Step 6: Cross-Platform Build

make build-linux        # Linux amd64
make build-linux-arm64  # Linux arm64
make build-macos        # macOS Intel
make build-macos-arm64  # macOS Apple Silicon
make build-windows      # Windows amd64
make build-all          # All platforms

Request Handling Flow

Browser Request
      │
      ▼
┌─────────────────────────────────────┐
│  http.ServeMux Route Matching       │
│  ├── /apis/*  → API Handler         │
│  └── Others   → Static Handler      │
└─────────────────────────────────────┘
              │
              ▼
┌─────────────────────────────────────┐
│  Static Handler                     │
│  ├── Has extension → serve file     │
│  └── No extension → return index.html│
└─────────────────────────────────────┘

Caching Strategy

PathCache-ControlReason
/assets/*max-age=31536000, immutableFiles have hash in name
/index.htmlno-cacheEntry must be fresh

Container Deployment

Minimal Dockerfile:

FROM scratch
COPY app /app
ENTRYPOINT ["/app"]

Troubleshooting

  1. Empty dist error → Run make build-web before make build-backend
  2. Static files 404 → Check //go:embed all:dist path relative to embed.go
  3. API not matching → Register API routes BEFORE wrapping with siteserver
  4. SPA routes 404 → Verify handler returns index.html for non-file paths

References

  • go-dependencies.md - Go module dependencies (standard library only)
  • embed.md - Complete embed.go implementation
  • siteserver.md - Static file server using Go standard net/http
  • vite-config.md - Vite configuration for development proxy
  • makefile.md - Complete Makefile with cross-platform build

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

百度语音识别 - 将语音消息转换为文本。支持中文普通话、英语、粤语、四川话。专为国内服务器环境优化,自动绕过代理访问百度 API。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

castle-x/skills-x182026년 4월 16일 업데이트

You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

castle-x/skills-x182026년 4월 16일 업데이트

Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

castle-x/skills-x182026년 4월 16일 업데이트

Use when you have a written implementation plan to execute in a separate session with review checkpoints

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

castle-x/skills-x182026년 4월 16일 업데이트

帮助用户将飞书群机器人 Webhook 通知接入 Claude Code,使得每次任务完成后自动发送飞书消息卡片通知。 触发场景(当用户提到以下任意内容时激活此 skill): - "飞书通知"、"接入飞书"、"飞书提醒" - "task 完成通知"、"任务完成提醒" - "claude 完成提醒"、"claude 通知" - "Stop hook 通知"、"hook 通知" - "发飞书消息"、"飞书机器人" - "任务结束通知"、"配置通知"

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

castle-x/skills-x182026년 4월 16일 업데이트

Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

castle-x/skills-x182026년 4월 16일 업데이트

castle-x의 스킬 모두 보기

이 스킬의 문제 신고