php小編草今天要為大家介紹一個有趣的技術-在golang二進位檔案中嵌入SvelteKit。隨著前端技術的不斷發展,越來越多的框架和工具湧現。而SvelteKit作為一個新興的框架,透過編譯時建構應用程序,提供了更快的載入速度和更高的效能。本文將向大家展示如何將SvelteKit應用程式嵌入到golang的二進位檔案中,以實現更方便的部署和分發,讓我們一起來了解一下吧!
我正在嘗試使用 embedd 提供單一二進位檔案以包含 sveltekit 網站。我使用 chi 作為我的路由器。但我無法讓它發揮作用。我得到下面這些選項之一。據我了解, embedd all:
選項可確保包含以 _
為前綴的檔案。我還嘗試了主v1中stripprefix
方法的變體:/uibuild/
或uibuild/
等...
有人可以照亮它嗎?
範例儲存庫
精簡設定:
#import preprocess from "svelte-preprocess"; import adapter from "@sveltejs/adapter-static"; /** @type {import('@sveltejs/kit').config} */ const config = { kit: { adapter: adapter({ pages: "./../server/uibuild", assets: "./../server/uibuild", fallback: "index.html", }), }, preprocess: [ preprocess({ postcss: true, }), ], }; export default config;
main.go v1:
這會產生錯誤 3。
package main import ( "embed" "log" "net/http" chi "github.com/go-chi/chi/v5" ) //go:embed all:uibuild var sveltestatic embed.fs func main() { r := chi.newrouter() r.handle("/", http.stripprefix("/uibuild", http.fileserver(http.fs(sveltestatic)))) log.fatal(http.listenandserve(":8082", r)) }
main.go v2:
這將給出錯誤 2。
static, err := fs.sub(sveltestatic, "uibuild") if err != nil { panic(err) } r := chi.newrouter() r.handle("/", http.fileserver(http.fs(static))) log.fatal(http.listenandserve(":8082", r))
檔案結構:
#. ├── go.mod ├── go.sum ├── main.go └── uibuild ├── _app │ ├── immutable │ │ ├── assets │ │ │ ├── 0.d7cb9c3b.css │ │ │ └── _layout.d7cb9c3b.css │ │ ├── chunks │ │ │ ├── index.6dba6488.js │ │ │ └── singletons.b716dd01.js │ │ ├── entry │ │ │ ├── app.c5e2a2d5.js │ │ │ └── start.58733315.js │ │ └── nodes │ │ ├── 0.ba05e72f.js │ │ ├── 1.f4999e32.js │ │ └── 2.ad52e74a.js │ └── version.json ├── favicon.png └── index.html
令人沮喪的是,您的「main.go v2」只能新增單一字元。您正在使用:
r.handle("/", http.fileserver(http.fs(static)))
來自文件:
func (mx *mux) 句柄(模式字串,處理程序 http.handler)
每個路由方法都接受 url 模式和處理程序鏈。 url 模式支援命名參數(即 /users/{userid})和通配符(即 /admin/)。可以在運行時透過呼叫 chi.urlparam(r, "userid")(對於命名參數)和 chi.urlparam(r, "")(對於通配符參數)來取得 url 參數。
所以你傳入“/”作為“模式”;這將匹配 /
但沒有其他內容;修復使用:
r.handle("/*", http.fileserver(http.fs(static))) // or r.mount("/", http.fileserver(http.fs(static)))
我用我的一款精簡應用程式對此進行了測試,它運作得很好。您可能需要考慮的一項改進是將不存在的文件的任何請求重定向到 /
(否則,如果使用者使用路徑為頁面添加書籤,則該頁面將無法加載)。請參閱此答案以了解資訊。
除上述內容之外- 為了演示我在評論中所說的內容,請將9ce6a1af62d5b5047a25f3a59cd1fbbcabout5db79b134e9f6b82c0b36e0489ee08ed
添加到ui /src/routes/ page.svelte
的末尾並重建(兩者都是svelte 和然後去應用程式)。然後,您將能夠導航至 about
頁面(首先載入主頁,然後按一下「關於」)。這是由客戶端路由器處理的(因此您可能不會看到任何對 go 伺服器的請求)。有關如何在直接訪問頁面(例如 /about
)時使其工作的信息,請參閱連結的答案。 p>
這是一個快速(有點hacky)的範例,它將從嵌入式檔案系統提供所需的位,並為所有其他請求返回主index.html
(以便svelte 路由器可以顯示所需的頁)。
package main import ( "embed" "fmt" "io/fs" "log" "net/http" "github.com/go-chi/chi/v5" ) //go:embed all:uibuild var svelteStatic embed.FS func main() { s, err := fs.Sub(svelteStatic, "uibuild") if err != nil { panic(err) } staticServer := http.FileServer(http.FS(s)) r := chi.NewRouter() r.Handle("/", staticServer) // Not really needed (as the default will pick this up) r.Handle("/_app/*", staticServer) // Need to serve any app components from the embedded files r.Handle("/favicon.png", staticServer) // Also serve favicon :-) r.HandleFunc("/*", func(w http.ResponseWriter, r *http.Request) { // Everything else returns the index r.URL.Path = "/" // Replace the request path staticServer.ServeHTTP(w, r) }) fmt.Println("Running on port: 8082") log.Fatal(http.ListenAndServe(":8082", r)) }
以上是在 golang 二進位檔案中嵌入 sveltekit的詳細內容。更多資訊請關注PHP中文網其他相關文章!