首頁  >  文章  >  後端開發  >  在 golang 二進位檔案中嵌入 sveltekit

在 golang 二進位檔案中嵌入 sveltekit

PHPz
PHPz轉載
2024-02-09 17:36:19651瀏覽

在 golang 二进制文件中嵌入 sveltekit

php小編草今天要為大家介紹一個有趣的技術-在golang二進位檔案中嵌入SvelteKit。隨著前端技術的不斷發展,越來越多的框架和工具湧現。而SvelteKit作為一個新興的框架,透過編譯時建構應用程序,提供了更快的載入速度和更高的效能。本文將向大家展示如何將SvelteKit應用程式嵌入到golang的二進位檔案中,以實現更方便的部署和分發,讓我們一起來了解一下吧!

問題內容

我正在嘗試使用 embedd 提供單一二進位檔案以包含 sveltekit 網站。我使用 chi 作為我的路由器。但我無法讓它發揮作用。我得到下面這些選項之一。據我了解, embedd all: 選項可確保包含以 _ 為前綴的檔案。我還嘗試了主v1中stripprefix方法的變體:/uibuild/uibuild/等...

有人可以照亮它嗎?

範例儲存庫

  1. 目錄列表,在我的例子中為「uibuild」
  2. 「/」處有空白頁,但在 chrome 控制台中,巢狀檔案出現 404 錯誤
  3. 主頁「/」上出現 404。

精簡設定:

#
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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除