现象
以嵌入式二进制方式运行(go run . 或 go build 后跑产物,即 README「跑起来」里 web/dist 被 embed 进后端的正式形态)时:
- 登录页正常,但登录成功进入认证区后整页 500(
哎呀!出了点问题)。
- 浏览器控制台报:
Failed to load module script: Expected a JavaScript-or-Wasm module script
but the server responded with a MIME type of "text/html".
Failed to fetch dynamically imported module:
http://localhost:55667/assets/_authenticated-XXXXXXXX.js
pnpm dev(Vite 5173 + 代理)分离模式下不复现,因为此时静态资源由 Vite 直接提供,没走 embed。
根因
web/web.go:
//go:embed dist/*
var Static embed.FS
Go 的 //go:embed 模式默认会跳过名字以 _ 或 . 开头的文件(见 pkg.go.dev/embed:
Patterns must not match files outside the package's module... the all: prefix ... includes files whose names begin with . or _)。
前端用 TanStack Router,src/routes/_authenticated.tsx 经 Vite 代码分割打包成 dist/assets/_authenticated-XXXXXXXX.js(下划线开头)。于是这个 chunk 没被 embed 进二进制。请求它时命中 r.NoRoute 的 SPA fallback,返回 index.html(200 text/html),浏览器按严格 MIME 拒绝加载该 module → 认证路由崩溃。
复现
cd web && pnpm install && pnpm build
cd .. && go generate ./ent && go run .
# 浏览器登录 admin/123,进入仪表盘 -> 500
# 或直接验证(文件在磁盘上存在,但 HTTP 返回 text/html):
curl -s -o /dev/null -w "%{http_code} %{content_type}\n" \
http://localhost:55667/assets/_authenticated-XXXXXXXX.js
# 期望: 200 text/javascript ;实际: 200 text/html
(XXXXXXXX 为 web/dist/assets/ 下 _authenticated-*.js 的实际哈希。)
影响
任何下划线开头的代码分割 chunk 都会丢失。当前 _authenticated 是认证后的主布局路由,等于所有登录后的页面在正式部署形态下都打不开,而开发模式正常,很容易漏测。
建议修复(一行)
//go:embed all:dist
var Static embed.FS
all: 前缀会把 _ / . 开头的文件一并嵌入,static.EmbedFolder(Static, "dist") 不受影响。本地验证:改后该 chunk 返回 200 text/javascript(~320KB 真 JS),登录后仪表盘正常渲染、控制台 0 报错。
环境:Go 1.26 / Node 24 / pnpm 11,Windows 11;上游 main 当前 web/web.go:11 仍为 dist/*。
现象
以嵌入式二进制方式运行(
go run .或go build后跑产物,即 README「跑起来」里web/dist被embed进后端的正式形态)时:哎呀!出了点问题)。pnpm dev(Vite 5173 + 代理)分离模式下不复现,因为此时静态资源由 Vite 直接提供,没走embed。根因
web/web.go:Go 的
//go:embed模式默认会跳过名字以_或.开头的文件(见 pkg.go.dev/embed:前端用 TanStack Router,
src/routes/_authenticated.tsx经 Vite 代码分割打包成dist/assets/_authenticated-XXXXXXXX.js(下划线开头)。于是这个 chunk 没被 embed 进二进制。请求它时命中r.NoRoute的 SPA fallback,返回index.html(200 text/html),浏览器按严格 MIME 拒绝加载该 module → 认证路由崩溃。复现
(
XXXXXXXX为web/dist/assets/下_authenticated-*.js的实际哈希。)影响
任何下划线开头的代码分割 chunk 都会丢失。当前
_authenticated是认证后的主布局路由,等于所有登录后的页面在正式部署形态下都打不开,而开发模式正常,很容易漏测。建议修复(一行)
all:前缀会把_/.开头的文件一并嵌入,static.EmbedFolder(Static, "dist")不受影响。本地验证:改后该 chunk 返回200 text/javascript(~320KB 真 JS),登录后仪表盘正常渲染、控制台 0 报错。环境:Go 1.26 / Node 24 / pnpm 11,Windows 11;上游
main当前web/web.go:11仍为dist/*。