本目录当前提供的是静态资源能力的说明文档,用来帮助选择不同入口的使用场景。
如果你更关注完整框架说明,可同时参考:
适合“明确挂一个目录或文件”的场景。
r.Static("/assets", "./public")
r.StaticFS("/downloads", http.Dir("./files"))
r.StaticFile("/favicon.ico", "./public/favicon.ico")
r.EmbedFS("/static", embedFS, "dist")
r.EmbedFile("/robots.txt", embedFS, "dist/robots.txt")
特点:
适合“希望静态资源只在路由未命中时兜底,但不要影响普通路由和 regex 路由”的场景。
r.Assets("/assets", "./public")
r.AssetsFS("/files", http.Dir("./uploads"))
特点:
NoRoute 受控兜底,不注册 catch-all 普通路由适合前端站点、SPA、后台控制台。
r.Site("/app", "./dist")
e.FallbackSite("./dist")
特点:
index.htmlWithNotFoundFile("404.html") 提供自定义 404 页面新的 Assets* / Site* / FallbackSite* 入口不会和普通路由、正则路由冲突,顺序固定为:
NoRoute这意味着:
/api/ping 这种普通业务路由始终优先/orders/{id:[0-9]+} 这种 regex 路由也会优先于站点兜底FallbackSite("./dist") 更像“最后一层前端接管”,而不是“注册一个全局 catch-all 路由”e := gin.New()
r := e.Router()
r.Assets("/assets", "./public")
e := gin.New()
r := e.Router()
r.Site("/app", "./dist")
e := gin.New()
e.GET("/api/ping", func(c *gin.Context) {
c.Success(gin.H{"ok": true})
})
e.FallbackSite("./dist")
e := gin.New()
r := e.Router()
if err := r.SiteZip("/admin", "./admin.zip"); err != nil {
panic(err)
}
package main
import (
"embed"
gin "github.com/darkit/gin"
)
//go:embed ui/app.zip
var assets embed.FS
func main() {
e := gin.New()
if err := e.FallbackSiteEmbeddedZip(assets, "ui/app.zip"); err != nil {
panic(err)
}
}
r.Site(
"/app",
"./dist",
static.WithIndexFile("index.html"),
static.WithHistoryFallback(),
static.WithNotFoundFile("404.html"),
)
ZIP / 嵌入式 ZIP 额外支持:
cfg := static.NewZipFSConfig(
"./app.zip",
"/app",
static.WithPassword("secret"),
static.WithSubPaths("admin/"),
static.WithHotReload(3*time.Second),
)
Static*EmbedFS / EmbedFilepkg/static.RegisterZipFS 时,可以继续保留,当前仍兼容Site / FallbackSiteAssets/app、/admin