From 46d7ecca88dbdaf6d1656d23669b7eeba625ac10 Mon Sep 17 00:00:00 2001 From: boojack Date: Sun, 10 Jul 2022 09:02:56 +0800 Subject: [PATCH] feat: use go embed --- .gitignore | 2 +- Dockerfile | 2 +- server/dist/index.html | 13 ++++++++++ server/embed_frontend.go | 37 ++++++++++++++++++++++++++++ server/server.go | 7 +----- web/index.html | 2 +- web/package.json | 1 + web/public/{logo.svg => favicon.svg} | 0 web/vite.config.ts | 6 +++++ web/yarn.lock | 5 ++++ 10 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 server/dist/index.html create mode 100644 server/embed_frontend.go rename web/public/{logo.svg => favicon.svg} (100%) diff --git a/.gitignore b/.gitignore index bdf7a603..0f555301 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,7 @@ tmp .air # Frontend asset -dist +web/dist # Dev database data diff --git a/Dockerfile b/Dockerfile index cd6de175..460e44c8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,6 +15,7 @@ RUN apk update RUN apk --no-cache add gcc musl-dev COPY . . +COPY --from=frontend /frontend-build/dist ./server/dist RUN go build \ -o memos \ @@ -25,7 +26,6 @@ FROM alpine:3.16.0 AS monolithic WORKDIR /usr/local/memos COPY --from=backend /backend-build/memos /usr/local/memos/ -COPY --from=frontend /frontend-build/dist /usr/local/memos/web/dist # Directory to store the data, which can be referenced as the mounting point. RUN mkdir -p /var/opt/memos diff --git a/server/dist/index.html b/server/dist/index.html new file mode 100644 index 00000000..04197732 --- /dev/null +++ b/server/dist/index.html @@ -0,0 +1,13 @@ + + + + + + + + Memos + + +

No frontend embeded.

+ + diff --git a/server/embed_frontend.go b/server/embed_frontend.go new file mode 100644 index 00000000..3efc4e95 --- /dev/null +++ b/server/embed_frontend.go @@ -0,0 +1,37 @@ +package server + +import ( + "embed" + "io/fs" + "net/http" + + "github.com/labstack/echo/v4" +) + +//go:embed dist +var embeddedFiles embed.FS + +//go:embed dist/index.html +var indexContent string + +func getFileSystem() http.FileSystem { + fs, err := fs.Sub(embeddedFiles, "dist") + if err != nil { + panic(err) + } + + return http.FS(fs) +} + +func embedFrontend(e *echo.Echo) { + // Catch-all route to return index.html, this is to prevent 404 when accessing non-root url. + // See https://stackoverflow.com/questions/27928372/react-router-urls-dont-work-when-refreshing-or-writing-manually + e.GET("/*", func(c echo.Context) error { + return c.HTML(http.StatusOK, indexContent) + }) + + assetHandler := http.FileServer(getFileSystem()) + e.GET("/assets/*", echo.WrapHandler(assetHandler)) + e.GET("/icons/*", echo.WrapHandler(assetHandler)) + e.GET("/favicon.svg", echo.WrapHandler(assetHandler)) +} diff --git a/server/server.go b/server/server.go index d99617a7..6b72d965 100644 --- a/server/server.go +++ b/server/server.go @@ -38,12 +38,7 @@ func NewServer(profile *profile.Profile) *Server { Timeout: 30 * time.Second, })) - e.Use(middleware.StaticWithConfig(middleware.StaticConfig{ - Skipper: middleware.DefaultSkipper, - Root: "web/dist", - Browse: true, - HTML5: true, - })) + embedFrontend(e) // In dev mode, set the const secret key to make signin session persistence. secret := []byte("usememos") diff --git a/web/index.html b/web/index.html index 66590404..c7714cfe 100644 --- a/web/index.html +++ b/web/index.html @@ -2,7 +2,7 @@ - + Memos diff --git a/web/package.json b/web/package.json index 3d3c3426..b3a202dc 100644 --- a/web/package.json +++ b/web/package.json @@ -18,6 +18,7 @@ }, "devDependencies": { "@types/lodash-es": "^4.17.5", + "@types/node": "^18.0.3", "@types/qs": "^6.9.7", "@types/react": "^18.0.9", "@types/react-dom": "^18.0.4", diff --git a/web/public/logo.svg b/web/public/favicon.svg similarity index 100% rename from web/public/logo.svg rename to web/public/favicon.svg diff --git a/web/vite.config.ts b/web/vite.config.ts index 314b4280..d89f16f3 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,5 +1,6 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; +import { resolve } from "path"; // https://vitejs.dev/config/ export default defineConfig({ @@ -17,4 +18,9 @@ export default defineConfig({ }, }, }, + resolve: { + alias: { + "@/": `${resolve(__dirname, "src")}/`, + }, + }, }); diff --git a/web/yarn.lock b/web/yarn.lock index f80e741b..8bba99a1 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -374,6 +374,11 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== +"@types/node@^18.0.3": + version "18.0.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.3.tgz#463fc47f13ec0688a33aec75d078a0541a447199" + integrity sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ== + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"