本文介绍一种 Go 后端(Gin 框架) + Node.js 前端(Vite + Vue3) 的全栈开发方案,能够实现前端静态资源嵌入 Go 可执行文件,从而生成单文件部署的生产版本。项目支持开发模式热更新和生产模式打包发布,适合需要统一管理前后端、快速构建可执行程序的场景。
项目目录结构
根目录/
├─ backend/ # Go 后端完整项目
│ ├─ cmd/
│ │ ├─ dev/ # 开发模式入口,只注册 API
│ │ └─ prod/ # 生产模式入口,嵌入前端静态资源
│ ├─ go.mod
│ └─ ... # 后端源代码
├─ frontend/ # Node.js 前端完整项目
│ ├─ index.html
│ ├─ src/
│ ├─ vite.config.ts
│ └─ package.json
├─ .gitignore # 根目录忽略规则
├─ Makefile # 项目管理命令
└─ build/ # 构建输出目录
backend/和frontend/内部可自带各自的.gitignore文件,根目录的.gitignore只需排除通用文件或构建产物。build/用于存放最终生成的可执行文件。
前端初始化
- 初始化项目
bash
cd frontend
npm create vite@latest .
- 选择框架:Vue3
- 选择语言:TypeScript 或 JavaScript
- 配置 Vite 代理
在 vite.config.ts 中添加后端 API 代理:
ts
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
export default defineConfig({
plugins: [vue()],
server: {
port: 5173,
proxy: {
"/api": {
target: "http://localhost:8080",
changeOrigin: true,
rewrite: p => p.replace(/^\/api/, "")
}
}
}
});
- 开发模式下,前端请求
/api/...将代理到 Go 后端。
后端初始化
- 初始化 Go 模块
bash
cd backend
go mod init yourmodule
- 目录结构
cmd/dev:开发模式入口,只提供 API 服务。cmd/prod:生产模式入口,嵌入前端构建产物并提供静态文件服务。
- 开发模式示例 (
cmd/dev/main.go)
go
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
gin.SetMode(gin.DebugMode)
r := gin.Default()
r.GET("/api/hello", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "hello from dev mode"})
})
r.Run(":8080")
}
- 生产模式示例 (
cmd/prod/main.go)
go
package main
import (
"bytes"
"embed"
"io"
"io/fs"
"net/http"
"strings"
"github.com/gin-gonic/gin"
)
//go:embed web/*
var embeddedWebFS embed.FS
func main() {
gin.SetMode(gin.ReleaseMode)
r := gin.Default()
// API 路由
r.GET("/api/hello", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "hello from prod"})
})
// 所有未匹配路由处理前端页面
r.NoRoute(func(c *gin.Context) {
path := strings.TrimPrefix(c.Request.URL.Path, "/")
if strings.HasPrefix(path, "api") {
c.JSON(404, gin.H{"error": "API not found"})
return
}
if path == "" {
path = "index.html"
}
fsys, _ := fs.Sub(embeddedWebFS, "web")
f, err := fsys.Open(path)
if err != nil {
c.JSON(404, gin.H{"error": "File not found"})
return
}
defer f.Close()
data, _ := io.ReadAll(f)
info, _ := f.Stat()
modTime := info.ModTime()
http.ServeContent(c.Writer, c.Request, path, modTime, bytes.NewReader(data))
})
r.Run(":8080")
}
Makefile 工作流
Makefile 统一管理安装、开发、构建和清理命令:
makefile
BACKEND := backend
FRONTEND := frontend
PROD_CMD := $(BACKEND)/cmd/prod
PROD_WEB := $(PROD_CMD)/web
BUILD_DIR := build
APP_NAME := myapp
.PHONY: help install dev-front dev-back dev build clean
help:
@echo "可用命令:"
@echo " make install 安装前端和 Go 依赖"
@echo " make dev-front 启动前端开发服务器"
@echo " make dev-back 启动后端开发服务器"
@echo " make build 构建生产环境单文件可执行程序"
@echo " make clean 清理所有 .gitignore 排除项"
install:
@echo "📥 安装前端依赖..."
cd $(FRONTEND) && npm ci
@echo "📥 下载 Go 依赖..."
cd $(BACKEND) && go mod tidy
dev-front:
@echo "🚀 启动前端开发服务器..."
(cd $(FRONTEND) && npm run dev)
dev-back:
@echo "🚀 启动后端开发服务器..."
(cd $(BACKEND) && go run ./cmd/dev)
build:
@echo "🧹 清理旧构建..."
rm -rf $(PROD_WEB) $(BUILD_DIR)
@echo "📦 构建前端..."
cd $(FRONTEND) && npm ci && npm run build
@echo "📥 临时复制到 prod/web ..."
cp -r $(FRONTEND)/dist $(PROD_WEB)
@echo "🔨 构建 Go 后端..."
cd $(BACKEND) && CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o ../$(BUILD_DIR)/$(APP_NAME) ./cmd/prod
@echo "🧽 清理临时前端文件..."
rm -rf $(PROD_WEB)
@echo "🎉 构建完成 → $(BUILD_DIR)/$(APP_NAME)"
clean:
@echo "🧹 根据 .gitignore 清理项目排除项..."
git clean -fdX
@echo "✅ 清理完成"
Prompt
你是一位资深全栈工程师,熟悉 Go(Gin 框架)和现代前端技术栈(Vite + Vue 3)。请基于以下项目架构规范,清晰、结构化地生成项目:
- 项目采用 前后端分离开发、生产环境融合部署 的模式。
- 开发阶段:前端(Node.js + Vite + Vue3)通过代理访问独立运行的 Go 后端(Gin),支持热更新。
- 生产阶段:前端构建产物(dist 目录)被嵌入到 Go 可执行文件中(使用
//go:embed),由 Go 提供 API 和静态资源服务,最终输出为 单个可执行文件。 - 项目目录严格划分为
backend/(Go 后端)、frontend/(Node.js 前端)和根目录管理文件(如 Makefile、.gitignore)。 - 使用
cmd/dev和cmd/prod分别处理开发与生产入口逻辑。 - 构建流程由 Makefile 统一管理,包括依赖安装、前后端独立启动、前端构建、资源嵌入、Go 编译及清理。
总结
该架构采用 Go(Gin 框架)作为后端、Node.js + Vite + Vue3 作为前端,通过"开发分离、生产融合"的策略实现高效全栈开发。开发阶段,前后端独立运行:前端通过 Vite 的代理将 /api 请求转发至本地 Go 服务,支持热更新和快速调试;后端仅提供 API 接口。生产阶段,前端构建产物(dist 目录)被嵌入到 Go 可执行文件中(利用 Go 1.16+ 的 //go:embed 特性),由 Gin 统一处理 API 请求和前端路由(未匹配路径回退至 index.html),最终输出为单个可执行二进制文件。整个流程通过 Makefile 自动化管理依赖安装、开发启动与生产构建。
本方案既保留了前后端独立开发的灵活性与热更新体验,又实现了生产环境的零依赖、单文件部署,极大简化了交付与运维,特别适合需要快速迭代并打包为独立应用的中小型全栈项目。