前言

上一篇文章讲了如何嵌入网页,但是在使用的时候碰到了路由冲突。

冲突

先来看下代码

1
2
3
4
5
6
7
//go:embed dist
var f embed.FS

router := gin.Default()
fp, _ := fs.Sub(f, "dist")
router.StaticFS("/", http.FS(fp))
router.Run(":8080")

我们把网页内容绑定到了 / ,内容显示正常。

但是这样做的后果就是所有的 GET 请求都会被 / 捕获,这时候使用 GET 绑定路由就会报错了。

一种解法是不使用 GET ,虽然能解决问题,但是很别扭也很不优雅。

另一种是把嵌入的网页内容绑定到一个特殊的路由,比如 public 或者 static 等等。这样就不会污染 GET 路由了。

但是这样做也会存在问题,假设我们内嵌的文件有 index.htmlindex.jsindex.css

当我们请求 public/index.html 的时候内容可以请求下来,但是 jscss 就不能请求下来了,因为我们把它们的路由改成了 public/index.jspublic/index.css 了,所以会报文件找不到。

解决冲突

找了一圈在Gin + go:embed 实现静态资源嵌入 - 两双筷子中找到一个不错办法,就是通过把 404 错误重新定位到内嵌文件中

如下所示

1
2
3
4
5
6
//go:embed dist
var f embed.FS

router := gin.Default()
r.StaticFS("/public", http.FS(dist))
r.NoRoute(gin.WrapH(http.FileServer(http.FS(dist))))

这样就能够解决问题了。

参考