知识分享之Golang——使用embed包实现静态资源打包至二进制文件中
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以州基模文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。
知识分享系列目前包含Java、Golang、Linux、Docker等等。
当我们使用Golang进行开发web程序时,无法避免的会使用到static静态资源文件(前后端分离除外),这时我们的程序打包后就会锋态产生静态资源文件夹和一个二进制执行程序,本节我们就将其静态资源也打包进去,具体方式如下:
本节使用的golang标准库import "embed" 包,需要golang版本1.16以上,小伙伴们在使用时需要注意,另外本节使用gin框架进行。
1、创建需要使用的embed.FS对象
静态资源目录如下:
这里注意,//go:embed static注释会引导Static embed.FS寻找到我们的静态资源目录,因此务必不要遗漏设置。
2、在gin初始化时进行设置静态资源
这时编辑后,我们就只会册缓产生一个二进制程序,启动后访问静态资源的地址就是 具体地址
Web项目开发为何要走前后端分离模式?
把前端与后端独立起来去开发,放在两个不同的服务器,需要独立部署,两个不唯睁同的工程,两个不同的代码库,不同的开发人员,前后端工程师需要约定交互接口,实现同步开发,开发结束后需要进行独立部署,前端通过接口来调用调用后端的API,前端只需要关注页面的样式与动态数据的解析和渲染,而后端专注于具体业务逻辑。具体好处有以下几点:
1.彻底解放前端
前端不再需要向后台提供模板或是后台在前端html中嵌入后台代
2.提高工作效率,分工更加明确
前后端分离的工作流程可以使前端只关注前端的事,后台只关心后台的活,两者开发可以同时进行,在后台还没有时间提供接口的时候,前端可以先将数据写死或者调用本地的json文件即可,页面的增加和路由的修改也不必再去麻烦后台,开发更加灵活。
3.局部性能提升
通过前端路由的配置,我们可以实现页面的按需加载,无需一开始加载首页便加载网站的所有的资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升。
4.降低维护成本
通过目前主流的前端MVC框架,我们可以非常快速的定位及发现问题的所在,客户端的问题不再需要后台人员参与及调试,代码重构及可维护性增强。
5.实现高内聚低耦合,减少后端(应用)服务器的并发/负载压力。
6.即使后端服务暂时超时或者宕机了,前端页面也会正常访问,但无法提供数据。
7.可以使后台能更好的追求高并发,高可用,高性能;使前端能更好的追求页面表现、速度流畅、兼容性、用户体验等。
我理解的前后端分离,前端是需要起服务器的,减少学习成本,可以用node,前端也要有域名的
如果是半分离, 那么前端提供js文件(css等)这个我也做过,前后端都用node就不说了,如果是两种语言,
如果一个工程文件下开发,webpack下直接打包进后台语言的静态目录下。
如果是两个工程,那么前端只提供生成的js(css)文件,git pull后台项目,扔进静态目录,这样又涉及到版本控制的问题,一般我会生滚册成一个配置文件,直接读取的,内容是xxx.hash.js这种文件名,然后document.wirte动态写入js/css
前端起服务器就不需要动态引入了,直接html插件生成文件,更好的控制版本
半分离 还有一个问题,例如首页同构,如果更改xxx.blade.php文件,这就又动了php文件,大山宏甚至包括nginx反向代理啊,ssl这种缓存啊,都比较麻烦,你要是改了点啥,自己的ok了,后台的崩了,那就挺操蛋了,大公司有专门的运维还好,小公司真的是一团糟
后台我们采取全分离,nginx前端管理,至于升级nginx版本,http2,反向代理,https证书,都是前端自己弄,毕竟小公司,每个人水平都不一致,自己负责自己的比较好
但是这个跨域又要稍微处理一下,至今我这边后台还是*,我也没法说什么
阿里云这么便宜,如果把成本浪费在人力上,会变得很贵
一个人的精力有限,前后端分离有助于我们更专注我们所要注重的技术点,俗话说:“术业有专攻”。
比如我们后端,前后端分离有助于我们把注意力放在java基础,设计模式,jvm原理,spring+springmvc原理及源码,linux,mysql事务隔离与锁机制,mongodb,http/tcp,多线程,分布式架构(dubbo,dubbox,spring cloud),弹性计算架构,微服务架构(springboot+zookeeper+docker+jenkins),java性能优化,以及相关的项目管理等等。
而前端也可以集中精力在前端的展示上。
总的来说,前后端分离利大于弊。这也是越来越少用jsp的原因。
补充两点
1.每次请求的数据量变小,也意味着更少的响应时间。
2.也不是每个应用用前后端分离都是最合适的,要根据应用规模,工期综合判断。
go语言以后会不会成为主流web开发语言?
不会,目前的趋势帆孝是前后端分别,宏枣现在很多地方,很多公司已经基本达成了这样的目标,结果是前端通过JavaScript来完成相关的所有的工作蔽轿拆,后端的实现相对比较复杂,可以通过golang或者Java或者.netcore等开发语言完成,也就是说web开发完全基于js而不是其他语言。所以相关工作可以从其他语言忽略,js变成相关领域语言
81.go + vue实现web应用程序
前端框架越来越丰富,前后端分离已经是大多数软件团队采取的模式了。vue使用的数丛场景也越来越多。
go本来使用template模板来进行前端的表现,现在可以用vue来分担很大一部分工作了。
通常直接使用go语言写后端,然后使用静态模板加载渲染前端,前端获取后端提供的数据是使用{{ }}符号,2个套在一起的花括号。这个也是vue使用的数据表现方式。
如果go+vue来协同工作的话,需要对vue进行一点设置。比如把{{ }}的方式改为[[ ]]的方式。
首先我们要知道,vue的使用,需要在页面中加载vue.js或vue.min.js
纯静态网页使用vue是这纳毕凳样的(给个html例子)
然后我们实现一个go的简单web服务和模板页面
这个go服务器通过端口 1989 展示服务器页面,提供了一个静态洞旅文件路径 htmlpage,我们把vue.js和index.html文件都放置在htmlpage路径里。
go服务器还用模板给前台页面提供了一个News结构的数据,数据包括:Title,Content,Author的值。
在index.html页面中,加载vue.js的时候需要带上静态路径 htmlpage
在 new 一个 vue 变量的时候,必须有一句来设置包裹数据的符号,我们这里设置这个符号为[[ ]]
同时,所有需要由 vue 渲染的数据,都写成类似这样的样子
在 go + vue 方式下的完整模板文件 index.html
此页面中{{ }}包裹的数据是由go从后端提供的数据( 例如:{{.Title}}),而[[ ]]包裹的数据,是vue渲染的数据。
只是把 Vue里的数据,改为由go后端提供即可。
好吧,作者已经在向月亮示爱了。呵呵 _
运行一下程序,看修改模板后的效果。
go有哪些快速开发的web框架
推荐五款开快速开发的Web框架,希望能够帮助题主,供大家一起交流学习。
1. 项目名称:基于 Go 的 Web 框架 Faygo
项目简介:Faygo 是一款快速、简洁的 Go Web 框架,可用极少的代码开发出高性能的 Web 应用程序(尤其是API接口)。只需定义 struct Handler,Faygo 就能自动绑定、验证请求参数并生成在线API文档。
2. 项目名称:基于 Go 的 Web 开发框架 essgo
项目简介:essgo 是一款 Go 语言开发的简单、稳定、高效、察姿灵活的 web 开发框架。它的项目组织形式经过精心设计,实现前后端分离、系统与业务分离,完美兼容 MVC 与 MVVC 等多种开发模式,非常利于企业级应用与 API 接口的开发。当然,最值得关注的是它突破性支持运行时路由重建,开发者可在 Admin 后台轻松配置路由,并实现启用/禁用模块或操作、添加/移除中间件等!同时,它以 ApiHandler 与 ApiMiddleware 为项目基本组成单元,可实现编译期或运行时的自由搭配组合,也令开发变得更加灵活富有趣味性。
3. 项目名称:模块化设计的 Go Web 框架 Macaron
项目简介:Macaron 是一个具有高生产力和模块化设计的 Go Web 框架。框架秉承了 Martini 的基本思想,并在此基础上做出高级扩展。
4. 项目名称:基于Go 的轻量级 Web 框架 GoInk
项目简介:HxGo 是基于我以往的 php 开发经验编写的 Go Web 框架。力求简单直接,符合大众编写习惯源搭,同时性能优良。 HxGo 基于 MVC 的结构模式,实现 REST 支持的自动路由分发,简化 HTTP 请求和视图操作。同时,HxGo 提供简易直接的数据访问层,高效直接操作数据库雹没拿内容。
5. 项目名称:简单高效的 Go web 开发框架 Baa
项目简介:Baa 是一个简单高效的 Go web 开发框架。主要有路由、中间件,依赖注入和HTTP上下文构成。Baa 不使用 反射和正则,没有魔法的实现。
特性:
支持静态路由、参数路由、组路由(前缀路由/命名空间)和路由命名;
路由支持链式操作;
路由支持文件/目录服务;
中间件支持链式操作;
支持依赖注入*;
支持 JSON/JSONP/XML/HTML 格式输出;
统一的 HTTP 错误处理;
统一的日志处理;
支持任意更换模板引擎(实现 baa.Renderer 接口即可)。