我的编程空间,编程开发者的网络收藏夹
学习永远不晚

在 golang 二进制文件中嵌入 sveltekit

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在 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";


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)))

我用我的一款精简应用程序对此进行了测试,它运行良好。您可能需要考虑的一项改进是将不存在的文件的任何请求重定向到 / (否则,如果用户使用路径为页面添加书签,则该页面将无法加载)。请参阅此答案了解信息。

除上述内容之外 - 为了演示我在评论中所说的内容,请将 about 添加到 ui/class="lazy" data-src/routes/+page.svelte 的末尾并重建(两者都是 svelte 和然后去应用程序)。然后,您将能够导航到 about 页面(首先加载主页,然后单击“关于”)。这是由客户端路由器处理的(因此您可能不会看到任何对 go 服务器的请求)。有关如何在直接访问页面(例如 /about)时使其工作的信息,请参阅链接的答案。

这是一个快速(有点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的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

在 golang 二进制文件中嵌入 sveltekit

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

在 golang 二进制文件中嵌入 sveltekit

php小编百草今天要为大家介绍一种有趣的技术——在golang二进制文件中嵌入SvelteKit。随着前端技术的不断发展,越来越多的框架和工具涌现出来。而SvelteKit作为一个新兴的框架,通过编译时构建应用程序,提供了更快的加载速度和更
在 golang 二进制文件中嵌入 sveltekit
2024-02-09

python写入二进制文件

import structlist_dec = [1, 2, 3, 4, 53, 100, 220, 244, 255]with open('hexBin.bin', 'wb')as fp: for x in list_dec:
2023-01-31

在 golang 中创建静态二进制文件所需的标志

编程网今天将给大家带来《在 golang 中创建静态二进制文件所需的标志》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家
在 golang 中创建静态二进制文件所需的标志
2024-04-04

代码必须加载字体文件,如何嵌入到构建的二进制文件中

在PHP开发中,加载字体文件是一项常见的需求。然而,为了确保字体文件的可用性和方便性,我们可能会考虑将字体文件嵌入到构建的二进制文件中。这样一来,我们就不再需要依赖外部的字体文件,而是直接在代码中使用嵌入的字体。那么,如何实现字体文件的嵌入
代码必须加载字体文件,如何嵌入到构建的二进制文件中
2024-02-09

如何使用 Golang 读写二进制文件?

如何使用 Golang 读写二进制文件?读二进制文件package mainimport ("fmt""os")func main() {// 打开一个二进制文件file, err := os.Open("myfile.bin")if
如何使用 Golang 读写二进制文件?
2024-05-15

Golang读写二进制文件方法总结

使用 Golang 的 encoding/gob 包读写二进制文件非常方便,而且代码量也非常少,本文就来通过两个示例带大家了解一下encoding/gob的具体用法吧
2023-05-19

python3文件处理中的二进制写入的问

#之前一直没明白文件处理中的w和wb的区别到底是什么,#在看过视频后才知道,原来在linux里面是没有区别的,#但是在windows里面就能够看出区别来了#下面来个例子:with open("普通文本文件.txt", "w",encodin
2023-01-31

在Linux上如何分析二进制文件

小编给大家分享一下在Linux上如何分析二进制文件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!file它的作用:帮助确定文件类型。这将是你进行二进制分析的起点。我们每天都在与文件打交道,并非所有的文件都是可执行类型,除此
2023-06-16

C#中如何读取二进制文件

C#中如何读取二进制文件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#读取二进制文件当想到所有文件都转换为 XML时,确实是一件好事。但是,这并非事实。仍旧
2023-06-18

Golang项目在github创建release后怎么自动生成二进制文件

本文小编为大家详细介绍“Golang项目在github创建release后怎么自动生成二进制文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang项目在github创建release后怎么自动生成二进制文件”文章能帮助大家解决疑惑
2023-07-05

怎么将日志文件和二进制文件快速导入HDFS

这篇文章主要讲解了“怎么将日志文件和二进制文件快速导入HDFS”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么将日志文件和二进制文件快速导入HDFS”吧!首选数据移动方法如果在旧版Hado
2023-06-02

VB.NET中怎么对二进制文件进行操作

今天就跟大家聊聊有关VB.NET中怎么对二进制文件进行操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。VB.NET二进制文件操作主要应用的方法和函数有:Open,Close,Get
2023-06-17

Golang项目在github创建release后自动生成二进制文件的方法

这篇文章主要介绍了Golang项目在github创建release后如何自动生成二进制文件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录