当前位置: 首页 > news >正文

Gin 打包vue或react项目输出文件到程序二进制文件

Gin 打包vue或react项目输出文件到程序二进制文件

  • 背景
  • 解决方案
    • 1. 示例目录结构
    • 2. 有如下问题要解决:
    • 3. 方案探索
  • 效果

背景

前后端分离已成为行业主流,vuereact等项目生成的文件独立在一个单独目录,与后端项目无关。
实际部署中,通常前面套一个nginx,根据请求返回静态资源或者代理到后端go服务上。
安装配置一套环境繁琐,加上有时需要部署在windows上,希望借助go的夸平台编译运行+embed嵌入文件能力,实现单个文件部署即可。

Created with Raphaël 2.3.0 用户请求 nginx 是否是静态资源? dist目录文件 go-app yes no

nginx配置样例

server {listen 80;root /usr/share/nginx/html;location / {try_files $uri $uri/index.html /index.html;}location /api {proxy_pass http://localhost/to-go-app-server;proxy_set_header   X-Forwarded-Proto $scheme;proxy_set_header   X-Real-IP         $remote_addr;}
}

解决方案

1. 示例目录结构

  • app.go为代码文件,同dist一个目录
  • app-server为编译后的单个exe
.
├── app.go
├── app-server
└── dist├── assets│   ├── index-43d6e8d0.css│   └── index-f5e49ae2.js├── CNAME├── element-plus-logo-small.svg├── favicon.svg├── index.html└── vite.svg

2. 有如下问题要解决:

  • http://exmpale.com/跟路由如何定向到dist/index.html
  • http://exmpale.com/xx.svg 以及 http://exmpale.com/assets/xxxxx.js 这些动态路由如何生成
  • http://exmpale.com/正常业务路由与上面静态文件路由冲突如何处理

3. 方案探索

经过参考gin官方github.com/gin-contrib/static的插件,找出以下简单有效的解决方案

  • 使用embed将整个文件夹嵌入
  • 所有请求增加一个中间件, 判断embed.FS总是否存在url中路径的文件
  • 存在使用http.fileserver处理,并中断处理链
  • 不存在处理正常的逻辑
package mainimport ("embed""io/fs""net/http""github.com/gin-gonic/gin"
)//go:embed dist
var dist embed.FSfunc main() {r := gin.Default()r.Use(ServerStatic("dist", dist))r.GET("/ping", func(ctx *gin.Context) {ctx.String(http.StatusOK, "pong")})r.Run("localhost:81")
}/*
假设vue/react项目输出文件夹名字为dist,拷贝到该go文件所在目录下
注意"dist"前后不能有 /
r.Use(ServerStatic("dist", dist))
*/
func ServerStatic(prefix string, embedFs embed.FS) gin.HandlerFunc {return func(ctx *gin.Context) {// 去掉前缀fsys, err := fs.Sub(embedFs, prefix)if err != nil {panic(err)}fs2 := http.FS(fsys)f, err := fs2.Open(ctx.Request.URL.Path)if err != nil {// 判断文件不存在,退出交给其他路由函数ctx.Next()return}defer f.Close()http.FileServer(fs2).ServeHTTP(ctx.Writer, ctx.Request)ctx.Abort()}
}

效果

  • 访问http://localhost:81/ 返回的是vue页面
  • 访问http://localhost:81/ping 返回的是逻辑处理结果pong
http://www.lryc.cn/news/167682.html

相关文章:

  • 深度解析shell脚本的命令的原理之pwd
  • Kafka3.0.0版本——消费者(分区的分配以及再平衡)
  • Kotlin文件遍历FileTreeWalk filter
  • Activiti兼容达梦数据库
  • shell 流程控制
  • 【C++】红黑树插入操作实现以及验证红黑树是否正确
  • 学信息系统项目管理师第4版系列07_项目管理知识体系
  • Leetcode 2851. String Transformation
  • 在PHP8中对数组进行计算-PHP8知识详解
  • Android BottomSheetDialog最大展开高度问题
  • 记录Linux部署人脸修复GFPGAN项目Docker Python 使用
  • 如何编写可重入的函数?
  • 使用纯C语言定义通用型数据结构的方法和示例
  • 数据结构基础8:二叉树oj+层序遍历。
  • Spring注解家族介绍:@RestController
  • rocketmq
  • JAVA成员变量首字母小写,第二个字母大写报错问题(原因:Lombok与Spring冲突)
  • Python入门教程 |Python 错误和异常
  • API商品接口对接使用:从理论到实践
  • 解决stable diffusion webui1.6 wd1.4 tagger加载失败的问题
  • Python学习-实现简单的http服务
  • #循循渐进学51单片机#变量进阶与点阵LED#not.6
  • 访问者模式
  • epoll 的实现
  • 怎么用excel管理固定资产
  • 记录crack某IDE插件过程
  • Android DEX相关,ART加载OAT文件
  • laravel框架 - 安装初步使用学习 composer安装
  • API实战教程:使用身份证OCR识别API构建一个应用
  • 前端-layui动态渲染表格行列与复杂表头合并