📖 通过示例了解 Go Fiber:Fiber Web 框架如何发挥作用?
介绍
大家好,欢迎各位 DEV 朋友们!👋
您可能知道,我们计划与Packt出版商合作出版的名为《使用 GoFiber 轻松开发》的印刷书籍现已取消。
🤯 造成这种情况的原因有很多,既有我的原因,也有这位受人尊敬的出版商的原因,我不会关注这一点。
因此,我决定将我所有的写作材料以系列文章的形式发布在我的Dev.to博客上,供大家免费阅读!😉
今天,我开始了一系列名为“Go Fiber 示例”的新文章,这将成为那些想要在开发真实 Web 应用程序时快速有效地学习Fiber Web 框架的人的手册。
第一章计划
在第一篇文章(或章节)中,我们将回顾Fiber Web 框架的历史,找出最适合它的程序员群体,并通过真实的例子看看它与Node.js框架Express有多么相似。
我们将讨论以下主要主题👇
📝 目录
来自其他编程语言或 Golang Web 框架
如果您来自其他语言(例如Python、Ruby或JavaScript),Fiber Web 框架将帮助您顺利进入Go编程语言。
它具有非常熟悉的元素,旨在使来自其他编程语言的不同技能水平的开发人员能够尽可能轻松地完成产品开发过程。
对于已经使用其他Go Web 框架或 API 工具的开发人员,Fiber可以提供以下好处:
- 极致性能和低内存占用
- 快速服务器端编程
- 适用于大多数任务的内置中间件
- 丰富而强大的路由
- 轻松提供静态文件并使用数据库
- 支持所有流行的模板引擎
- ...本系列还有更多内容要讨论!
全球友好且支持的Fiber社区已经将基本文档翻译成15 种不同的语言,并准备在GitHub上的项目存储库问题上为您提供支持。
希望将 NodeJS 替换为 Go
从Node.js转换到Golang的新 Gopher在开始构建他们的 Web 应用程序、API 或微服务之前需要处理学习曲线。
Fiber 的灵感来源于互联网上最流行的 Web 框架Express 。它的作者结合了Express的易用性和Go的原始性能。
我们会惊讶地发现,只需学习Fiber Web 框架,就能轻松地从一种语言转换到另一种完全不同的语言!
🌐注:另外,我建议您访问Miguel Mota 的GitHub仓库“面向Node.js 开发者的 Golang” 。它以一种相当直接的方式描述了如何将后端从JavaScript平滑过渡到Go的基本原则。
因此,如果您曾经在Node.js中实现过 Web 应用程序(使用Express或类似程序),那么许多方法和原理对您来说会显得非常常见。
我们将在本文结尾处更详细地讨论这一点。
使用 Fiber Web 框架背后的哲学
Fiber作为一个 Web 框架,秉承极简主义的理念,遵循UNIX 风格,旨在让 Go 新手能够快速进入 Go 世界,并感受到热情友好的欢迎。正因如此,Fiber才是一个非常通用的Go框架。
但其应用的主要重点是创建完整的一体化 Web 应用程序,如Python中的Django或Ruby中的Ruby on Rails,以及高效的高性能 REST API,如Python的FastAPI。
这并不意味着您无法为您的基础设施、桌面网络应用或Fiber创建微服务或适配器。绝对不行!这些领域根本不是该框架作者的优先事项。但他们始终在GitHub仓库、Discord 频道以及整个互联网上倾听用户的意见。
作者希望创建一个快速、灵活且友好的Golang Web 框架,适用于任何任务、任何期限、任何开发人员技能。就像Express框架在JavaScript世界中所做的那样。
与 Express 的简要比较
受Express的启发,Fiber Web 框架可能对你来说非常熟悉。我们将在接下来的章节中分解最基本的内容,让你能够亲眼看到它们。
👌注意:如果您从未使用过Go或JavaScript,请不要担心,我们在下面的代码示例中留下了全面的注释,以帮助您了解情况。
你好世界
每种编程语言或 Web 框架都有一个经典的例子,那就是极简版的Hello World程序。好吧,我们可别否认这一点!
首先,我们来看一下Express:
// ./js/hello_world.js
const express = require("express"); // add Express library
const app = express(); // create a new Express instance
// Create a new endpoint
app.get("/", (req, res) => {
res.send("Hello World!"); // send text
});
// Start server on port 3000
app.listen(3000);
很简单,不是吗?只需几行代码,一个功能齐全的 Web 服务器就可以在端口上的指定端点上接收用户3000
。
以下是使用Fiber实现相同功能的方法:
// ./go/hello_world.go
package main
import "github.com/gofiber/fiber/v2" // add Fiber package
func main() {
app := fiber.New() // create a new Fiber instance
// Create a new endpoint
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World!") // send text
})
// Start server on port 3000
app.Listen(":3000")
}
除了程序开头一些JavaScript或Go特有的代码块外,代码的阅读、感觉和工作方式都基本相同。并且这种状态将贯穿本系列几乎所有的代码示例。
基本路由和端点
如您所知,任何 Web 应用程序、微服务或 API 都包含一个基于端点的路由系统,该系统描述HTTP 方法和处理程序函数,只有在此端点收到来自客户端的请求后才会执行。
在前面的Hello World程序中,我们已经接触过(对于Expressapp.get(path, () => {})
来说)和(对于Fiber来说)端点,它们提供 HTTP GET 方法并在请求时返回纯字符串。app.Get(path, func() error {})
让我们看一下在 Web 应用程序中可以用来描述端点的其他 HTTP 方法。按照惯例,我们先从Express开始:
// ./js/routing.js
// Endpoint for POST method
app.post("/", (req, res) => {
// function that stores a new data
});
// Endpoint for PUT method
app.put("/", (req, res) => {
// function that replaces the existing data
});
// Endpoint for PATCH method
app.patch("/", (req, res) => {
// function that replaces part of the existing data
});
// Endpoint for DELETE method
app.delete("/", (req, res) => {
// function that deletes the data
});
看起来这些 HTTP 方法不足以描述 Web 应用程序的端点,但实际上,Express和Fiber支持更多的请求 HTTP 方法。
☝️注意:我们只描述了最基本的!
现在让我们看一下Fiber中相同的基本 HTTP 方法的样子:
// ./go/routing.go
// Endpoint for Post method
app.Post("/", func(c *fiber.Ctx) error {
// function that stores a new data
})
// Endpoint for PUT method
app.Put("/", func(c *fiber.Ctx) error {
// function that replaces the existing data
})
// Endpoint for PATCH method
app.Patch("/", func(c *fiber.Ctx) error {
// function that replaces part of the existing data
})
// Endpoint for DELETE method
app.Delete("/", func(c *fiber.Ctx) error {
// function that deletes the data
})
同样,除了每种编程语言特有的一些块之外,代码的读取和工作方式都相同。
使用中间件
中间件函数可以访问 HTTP 请求和响应对象以及下一个中间件函数。它们可以执行以下任务:
- 执行我们需要的任何代码
- 对请求和响应对象进行任何更改和修改
- 完成请求-响应循环
- 调用堆栈中的下一个中间件函数
我们现在不打算深入研究中间件。我们的目标只是比较这些 Web 框架的技术设计。
👌注意:我们将在本系列的后续文章中再次讨论中间件。
因此,这里有一个Express框架中间件函数的示例,它将当前日期和时间输出到浏览器控制台,并将请求简单地传递到下一个端点:
// ./js/middleware.js
// Middleware function
app.use(function (req, res, next) {
// print current date and time to console
console.log("Date:", Date.now());
// passing the request to the next endpoint
next();
});
这就是同一个中间件与Fiber一起工作的方式,但日期和时间将输出到普通终端而不是浏览器控制台:
// ./go/middleware.go
// Middleware function
app.Use(func(c *fiber.Ctx) error {
// print current date and time to console
fmt.Println("Date:", time.Now())
// passing the request to the next endpoint
return c.Next()
})
我们再次看到了这些 Web 框架之间的相似之处。
提供静态文件
如果我们想要创建一个单页应用程序而不是普通的 Web 应用程序,我们将需要能够请求包含静态文件的目录。
这些文件通常是:
- 图片
- CSS 文件
- JavaScript 文件
- HTML 文件
- 模板和其他可下载文件
与他们合作的过程基于以下方案:
- 定义一个文件夹来存储静态文件。
- 将其指定为 Web 应用程序中的挂载点。
- 在 HTML 文件(或模板)中,我们引用了这个挂载点。
让我们看一个小例子来理解一下。
如果我们将静态数据存储在./public
目录根目录的文件夹中,那么使用 Express 内置express.static()
函数,我们可以将其挂载到/static
以下地址:
// ./js/static.js
app.use(
"/static", // mount address
express.static("public") // path to the file folder
);
下面是Fiber的示例代码,它可以为我们做同样的事情:
// ./go/static.go
app.Static(
"/static", // mount address
"./public", // path to the file folder
)
因此,Express和Fiber的所有静态文件都将在以下地址提供:
http://localhost:3000/static/images/background.jpg
http://localhost:3000/static/css/style.css
http://localhost:3000/static/js/app.js
http://localhost:3000/static/index.html
通过这种方式,我们可以轻松设置代理服务器,例如NGINX,以更高效地发送静态文件。
使用模板
当我们构建一个 Web 应用程序时,它不仅要以 JSON 格式返回内容,而且还必须能够使用该内容呈现模板,这时模板引擎就可以提供帮助。
这两个 Web 框架都支持大量现成的模板引擎:Pug、Jade、Mustache、Handlebars等等。让我们来看看Pug引擎,看看Express中的模板渲染是如何工作的:
// ./js/templates.js
// Initialize Pug template engine for rendering
app.set("view engine", "pug");
// Initialize templates folder
app.set("views", "./views");
// Create a new endpoint
app.get("/", (req, res) => {
// rendering the "index" template with content passing
res.render("index", {
title: "Hey!",
message: "This is the index template.",
});
});
对于Fiber来说,同样的例子会稍微复杂一些,但仍然很熟悉。这是因为Fiber实例创建后,应用程序的配置就无法更改了。它是只读的。
// ./go/templates.go
// Initialize Pug template engine in ./views folder
engine := pug.New("./views", ".pug")
// Create a new Fiber instance
app := fiber.New(fiber.Config{
Views: engine, // set template engine for rendering
})
// Create a new endpoint
app.Get("/", func(c *fiber.Ctx) error {
// rendering the "index" template with content passing
return c.Render("index", fiber.Map{
"Title": "Hey!",
"Message": "This is the index template.",
})
})
⚙️注意:这两个框架只会在当前目录的文件夹
*.pug
中查找带有 扩展名的模板./views
。如果该文件夹不存在或不包含名为 的文件index.pug
,则会出错。
Express 和Fiber虽然由不同的编程语言和团队开发,但它们的内置函数技术设计和工作原理却非常相似,这也是Fiber在众多基于Go语言的 Web 框架中脱颖而出的原因。
我们将在以后的文章中更详细地解释这一点。
概括
如果您以前只用JavaScript为 Web 应用程序编写过代码,我们希望本系列文章能够向您展示Go语言的另一面。
此外,我们还做了很多新的事情:
- 我们了解了Fiber的用途以及它可以在哪里有效使用。
- 我们比较了 Express 和Fiber Web 框架的基本功能。
- 通过简单的例子拆解了Web框架的路由系统。
- 了解中间件是什么以及如何在 Fiber 中使用它。
- 我们看了一个Fiber如何处理静态文件的示例。
- 我们发现了Fiber支持哪些流行的模板引擎以及如何使用它们。
在接下来的文章中,我们将更加深入地了解Fiber Web 框架的内部工作原理、其内置组件和方法。
照片和视频来自
- 扬科·费利奇壮举。维克·肖斯塔克https://unsplash.com/photos/sfL_QOnmy00
聚苯乙烯
如果你想在本博客上看到更多类似的文章,请在下方留言并订阅我。谢谢!😻
❗️ 您可以在Boosty上支持我,可以是永久支持,也可以是一次性支持。所有收益都将用于支持我的开源项目,并激励我为社区创作新的产品和文章。
当然,你也可以帮助我改善开发者的生活!只需以贡献者的身份连接到我的一个项目即可。非常简单!
我的主要项目需要您的帮助(和星星)👇
- 🔥 gowebly:下一代 CLI 工具,可轻松使用 Go 在后端创建出色的 Web 应用程序,使用 htmx、hyperscript 或 Alpine.js 以及前端最流行的 CSS 框架。
- ✨ create-go-app:通过运行一个 CLI 命令,创建一个具有 Go 后端、前端和部署自动化的新的生产就绪项目。
我的其他小项目:yatr、gosl、json2csv、csv2api。
链接:https://dev.to/koddr/go-fiber-by-examples-how-can-the-fiber-web-framework-be-useful-487a