Go 默认只会编译当前目录下同一个 package 的 Go 文件,以及被 import 引用到的其他 package。像 static 这种普通静态资源目录,默认不会被 go build 打包进去,所以不用担心它自动进入二进制。
方式 1:外挂资源
将前端作为外挂资源,放置到和后端打包后的二进制程序同一目录下。
这种方式的特点是:后端程序运行时会从磁盘读取前端文件。
所以后端打包部署到服务器后,还需要把前端构建产物一起复制到旁边的 static/fe-project/dist 目录里。
例如:
需要注意,如果你的前端是 React / Vue / Vite 这类 SPA 应用,只配置 StaticFile("/", ".../index.html") 只能处理首页访问。
如果用户直接刷新 /dashboard、/user/list 这类前端路由,后端可能会返回 404。此时需要额外做前端路由兜底,把未命中的 GET 请求返回到 index.html。
方式 2:直接打包进去
把前端构建产物直接嵌入到 Go 二进制里。Go 可以用标准库 embed 实现。
这样部署时只需要发布一个后端可执行文件,不需要额外复制 static/fe-project/dist 目录。
项目结构示例:
示例代码:
这里的核心是:
它会在 go build 时,把 static/fe-project/dist 目录嵌入到最终的二进制文件中。
所以流程一般是:
需要注意:
embed嵌入的是编译时已经存在的文件,所以必须先执行前端构建。- 前端文件变更后,需要重新执行
go build,否则二进制里还是旧的前端资源。 - 这种方式部署简单,只需要一个二进制文件,但二进制体积会变大。
- 如果前端资源很大,直接
fs.ReadFile会每次把文件读入内存;普通后台管理系统、小型前端项目通常没问题。