embed_frontend.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package server
  2. import (
  3. "embed"
  4. "io/fs"
  5. "net/http"
  6. "github.com/labstack/echo/v4"
  7. "github.com/labstack/echo/v4/middleware"
  8. "github.com/usememos/memos/common/util"
  9. )
  10. //go:embed dist
  11. var embeddedFiles embed.FS
  12. func getFileSystem(path string) http.FileSystem {
  13. fs, err := fs.Sub(embeddedFiles, path)
  14. if err != nil {
  15. panic(err)
  16. }
  17. return http.FS(fs)
  18. }
  19. func embedFrontend(e *echo.Echo) {
  20. // Use echo static middleware to serve the built dist folder
  21. // refer: https://github.com/labstack/echo/blob/master/middleware/static.go
  22. e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
  23. Skipper: defaultAPIRequestSkipper,
  24. HTML5: true,
  25. Filesystem: getFileSystem("dist"),
  26. }))
  27. assetsGroup := e.Group("assets")
  28. assetsGroup.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
  29. return func(c echo.Context) error {
  30. c.Response().Header().Set(echo.HeaderCacheControl, "max-age=31536000, immutable")
  31. return next(c)
  32. }
  33. })
  34. assetsGroup.Use(middleware.StaticWithConfig(middleware.StaticConfig{
  35. Skipper: defaultAPIRequestSkipper,
  36. HTML5: true,
  37. Filesystem: getFileSystem("dist/assets"),
  38. }))
  39. }
  40. func defaultAPIRequestSkipper(c echo.Context) bool {
  41. path := c.Request().URL.Path
  42. return util.HasPrefixes(path, "/api", "/memos.api.v2")
  43. }