Skip to content

[Bug] 嵌入式部署认证路由 500:go:embed dist/* 漏掉下划线开头的 SPA chunk(应用 all:dist) #12

@DaPengRuYi

Description

@DaPengRuYi

现象

嵌入式二进制方式运行(go run .go build 后跑产物,即 README「跑起来」里 web/distembed 进后端的正式形态)时:

  • 登录页正常,但登录成功进入认证区后整页 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.html200 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

XXXXXXXXweb/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/*

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions