Fiber
Fiber是一个受到Express启发的Web框架,基于使用Go语言编写的最快的HTTP引擎Fasthttp构建。旨在通过零内存分配和高性能服务,使快速开发更加简便。
Fiber是一个受到Express启发的Web框架,基于使用Go语言编写的最快的HTTP引擎Fasthttp构建。旨在通过零内存分配和高性能服务,使快速开发更加简便。
package main
import "github.com/gofiber/fiber/v2"
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World 👋!")
})
app.Listen(":3000")
}
这些测试由TechEmpower和Go Web 完成。如果您想查看所有结果,请访问我们的Wiki 。
确保已安装 1.14
或更高版本的 Go(下载)。
通过创建文件夹并在文件夹内运行 go mod init github.com/your/repo
(了解更多) 来初始化项目,然后使用 go get
命令安装 Fiber:
go get -u github.com/gofiber/fiber/v2
从Node.js切换到Go的新 gopher
在开始构建 Web
应用程序或微服务之前需要经历一段艰难的学习过程。 而 Fiber
,一个遵循极简主义和UNIX 方式创建的Web 框架,使新的 gopher
可以在热烈和可信赖的欢迎中迅速进入 Go
的世界。
Fiber
受到了互联网上最流行的 Web
框架 Express
的启发 。我们结合了 Express
的易用性和 Go
的原始性能 。如果您曾经使用 Node.js
构建 Web
应用程序(使用 Express 或类似框架),那么许多方法和原理对您来说应该非常易懂。
我们会倾听用户在issues和 Discord channel和在互联网上的所有诉求,为了创建一个能让有着任何技术栈的开发者都能在deadline前完成任务的迅速,灵活以及友好的 Go web
框架,就像 Express
在 JavaScript
世界中一样。
下面列出了一些常见示例。如果您想查看更多代码示例,请访问我们的Recipes代码库或API 文档 。
func main() {
app := fiber.New()
// GET /api/register
app.Get("/api/*", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("✋ %s", c.Params("*"))
return c.SendString(msg) // => ✋ register
})
// GET /flights/LAX-SFO
app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to"))
return c.SendString(msg) // => 💸 From: LAX, To: SFO
})
// GET /dictionary.txt
app.Get("/:file.:ext", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext"))
return c.SendString(msg) // => 📃 dictionary.txt
})
// GET /john/75
app.Get("/:name/:age/:gender?", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age"))
return c.SendString(msg) // => 👴 john is 75 years old
})
// GET /john
app.Get("/:name", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
return c.SendString(msg) // => Hello john 👋!
})
log.Fatal(app.Listen(":3000"))
}
func main() {
app := fiber.New()
// GET /api/register
app.Get("/api/*", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("✋ %s", c.Params("*"))
return c.SendString(msg) // => ✋ register
}).Name("api")
data, _ := json.MarshalIndent(app.GetRoute("api"), "", " ")
fmt.Print(string(data))
// Prints:
// {
// "method": "GET",
// "name": "api",
// "path": "/api/*",
// "params": [
// "*1"
// ]
// }
log.Fatal(app.Listen(":3000"))
}
func main() {
app := fiber.New()
app.Static("/", "./public")
// => http://localhost:3000/js/script.js
// => http://localhost:3000/css/style.css
app.Static("/prefix", "./public")
// => http://localhost:3000/prefix/js/script.js
// => http://localhost:3000/prefix/css/style.css
app.Static("*", "./public/index.html")
// => http://localhost:3000/any/path/shows/index/html
log.Fatal(app.Listen(":3000"))
}
func main() {
app := fiber.New()
// Match any route
app.Use(func(c *fiber.Ctx) error {
fmt.Println("🥇 First handler")
return c.Next()
})
// Match all routes starting with /api
app.Use("/api", func(c *fiber.Ctx) error {
fmt.Println("🥈 Second handler")
return c.Next()
})
// GET /api/register
app.Get("/api/list", func(c *fiber.Ctx) error {
fmt.Println("🥉 Last handler")
return c.SendString("Hello, World 👋!")
})
log.Fatal(app.Listen(":3000"))
}
如果未设置模版引擎,则 Fiber
默认使用html/template。
如果您要执行部分模版或使用其他引擎,例如amber,handlebars,mustache或者pug等等...
请查看我们的Template包,该包支持多个模版引擎。
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/pug"
)
func main() {
// You can setup Views engine before initiation app:
app := fiber.New(fiber.Config{
Views: pug.New("./views", ".pug"),
})
// And now, you can call template `./views/home.pug` like this:
app.Get("/", func(c *fiber.Ctx) error {
return c.Render("home", fiber.Map{
"title": "Homepage",
"year": 1999,
})
})
log.Fatal(app.Listen(":3000"))
}
📖 路由分组
func middleware(c *fiber.Ctx) error {
fmt.Println("Don't mind me!")
return c.Next()
}
func handler(c *fiber.Ctx) error {
return c.SendString(c.Path())
}
func main() {
app := fiber.New()
// Root API route
api := app.Group("/api", middleware) // /api
// API v1 routes
v1 := api.Group("/v1", middleware) // /api/v1
v1.Get("/list", handler) // /api/v1/list
v1.Get("/user", handler) // /api/v1/user
// API v2 routes
v2 := api.Group("/v2", middleware) // /api/v2
v2.Get("/list", handler) // /api/v2/list
v2.Get("/user", handler) // /api/v2/user
// ...
}
📖 Logger
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/logger"
)
func main() {
app := fiber.New()
app.Use(logger.New())
// ...
log.Fatal(app.Listen(":3000"))
}
📖 CORS
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
)
func main() {
app := fiber.New()
app.Use(cors.New())
// ...
log.Fatal(app.Listen(":3000"))
}
通过在请求头中设置 Origin
传递任何域来检查 CORS:
curl -H "Origin: http://example.com" --verbose http://localhost:3000
func main() {
app := fiber.New()
app.Static("/", "./public")
app.Get("/demo", func(c *fiber.Ctx) error {
return c.SendString("This is a demo!")
})
app.Post("/register", func(c *fiber.Ctx) error {
return c.SendString("Welcome!")
})
// Last middleware to match anything
app.Use(func(c *fiber.Ctx) error {
return c.SendStatus(404)
// => 404 "Not Found"
})
log.Fatal(app.Listen(":3000"))
}
📖 JSON
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
app := fiber.New()
app.Get("/user", func(c *fiber.Ctx) error {
return c.JSON(&User{"John", 20})
// => {"name":"John", "age":20}
})
app.Get("/json", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{
"success": true,
"message": "Hi John!",
})
// => {"success":true, "message":"Hi John!"}
})
log.Fatal(app.Listen(":3000"))
}
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/websocket"
)
func main() {
app := fiber.New()
app.Get("/ws", websocket.New(func(c *websocket.Conn) {
for {
mt, msg, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
log.Printf("recv: %s", msg)
err = c.WriteMessage(mt, msg)
if err != nil {
log.Println("write:", err)
break
}
}
}))
log.Fatal(app.Listen(":3000"))
// ws://localhost:3000/ws
}
import (
"github.com/gofiber/fiber/v2"
"github.com/valyala/fasthttp"
)
func main() {
app := fiber.New()
app.Get("/sse", func(c *fiber.Ctx) error {
c.Set("Content-Type", "text/event-stream")
c.Set("Cache-Control", "no-cache")
c.Set("Connection", "keep-alive")
c.Set("Transfer-Encoding", "chunked")
c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
fmt.Println("WRITER")
var i int
for {
i++
msg := fmt.Sprintf("%d - the time is %v", i, time.Now())
fmt.Fprintf(w, "data: Message: %s\n\n", msg)
fmt.Println(msg)
w.Flush()
time.Sleep(5 * time.Second)
}
}))
return nil
})
log.Fatal(app.Listen(":3000"))
}
📖 Recover
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("normally this would crash your app")
})
log.Fatal(app.Listen(":3000"))
}
以下为包含在Fiber框架中的中间件列表.
中间件 | 描述 |
---|---|
basicauth | 基本身份验证中间件提供HTTP基本身份验证。 它为有效凭证调用下一个处理程序,为丢失或无效凭证调用401 Unauthorized. |
cache | 拦截和缓存响应. |
compress | Fiber的压缩中间件,默认支持' deflate ', ' gzip '和' brotli '. |
cors | 使用各种选项启用跨源资源共享(CORS). |
csrf | 保护来自CSRF的漏洞. |
encryptcookie | 加密 cookie 值的加密中间件. |
envvar | 通过提供可选配置来公开环境变量。. |
etag | 让缓存更加高效并且节省带宽,让web服务不再需要重新响应整个响应体如果响应内容未变更. |
expvar | 通过其HTTP服务器运行时间提供JSON格式的暴露变体. |
favicon | 如果提供了文件路径,则忽略日志中的图标或从内存中服务. |
filesystem | Fiber文件系统中间件,特别感谢 Alireza Salary. |
limiter | 用于Fiber的限速中间件。 用于限制对公共api和/或端点的重复请求,如密码重置. |
logger | HTTP请求/响应日志. |
monitor | 报告服务器指标,受Express-status-monitor启发. |
pprof | 特别感谢 Matthew Lee(@mthli) |
proxy | 允许您将请求proxy到多个服务器 |
recover | 恢复中间件从堆栈链中的任何位置的恐慌中恢复,并将控制处理到集中式. ErrorHandler. |
requestid | 为每个请求添加一个requesttid. |
session | Session 中间件. 注意: 此中间件使用了我们的存储包. |
skip | Skip middleware that skips a wrapped handler is a predicate is true. |
timeout | 添加请求的最大时间,如果超过了,则发送给ErrorHandler. |
以下为外部托管的中间件列表,由Fiber团队维护。
中间件 | 描述 |
---|---|
adaptor | net/http处理程序与Fiber请求处理程序之间的转换器,特别感谢 @arsmn! |
helmet | 通过设置各种HTTP头帮助保护您的应用程序。 |
jwt | JWT返回一个JSON Web Token(JWT)身份验证中间件。 |
keyauth | Key auth中间件提供基于密钥的身份验证。 |
redirect | Redirect middleware |
rewrite | Rewrite中间件根据提供的规则重写URL路径。它有助于向后兼容或者创建更清晰、更具描述性的链接。 |
storage | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
template | 该软件包包含8个模板引擎,可与Fiber v1.10.x Go 1.13或更高版本一起使用。 |
websocket | 基于 Fasthttp WebSocket for Fiber与Locals支持! |
For more articles, middlewares, examples or tools check our awesome list.
如果想感谢我们或支持 Fiber
的积极发展:
Fiber
是一个开源项目,依靠捐赠来支付账单,例如我们的域名,gitbook
,netlify
和无服务器托管。如果要支持 Fiber
,可以 ☕ 在这里买一杯咖啡
User | Donation | |
---|---|---|
@destari | ☕ x 10 | |
@dembygenesis | ☕ x 5 | |
@thomasvvugt | ☕ x 5 | |
@hendratommy | ☕ x 5 | |
@ekaputra07 | ☕ x 5 | |
@jorgefuertes | ☕ x 5 | |
@candidosales | ☕ x 5 | |
@l0nax | ☕ x 3 | |
@bihe | ☕ x 3 | |
@justdave | ☕ x 3 | |
@koddr | ☕ x 1 | |
@lapolinar | ☕ x 1 | |
@diegowifi | ☕ x 1 | |
@ssimk0 | ☕ x 1 | |
@raymayemir | ☕ x 1 | |
@melkorm | ☕ x 1 | |
@marvinjwendt | ☕ x 1 | |
@toishy | ☕ x 1 |
Copyright (c) 2019-present Fenny and Contributors. Fiber
is free and open-source software licensed under the MIT License. Official logo was created by Vic Shóstak and distributed under Creative Commons license (CC BY-SA 4.0 International).
Third-party library licenses
package main
import "github.com/gofiber/fiber/v2"
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World 👋!")
})
app.Listen(":3000")
}
这些测试由TechEmpower和Go Web 完成。如果您想查看所有结果,请访问我们的Wiki 。
确保已安装 1.14
或更高版本的 Go(下载)。
通过创建文件夹并在文件夹内运行 go mod init github.com/your/repo
(了解更多) 来初始化项目,然后使用 go get
命令安装 Fiber:
go get -u github.com/gofiber/fiber/v2
从Node.js切换到Go的新 gopher
在开始构建 Web
应用程序或微服务之前需要经历一段艰难的学习过程。 而 Fiber
,一个遵循极简主义和UNIX 方式创建的Web 框架,使新的 gopher
可以在热烈和可信赖的欢迎中迅速进入 Go
的世界。
Fiber
受到了互联网上最流行的 Web
框架 Express
的启发 。我们结合了 Express
的易用性和 Go
的原始性能 。如果您曾经使用 Node.js
构建 Web
应用程序(使用 Express 或类似框架),那么许多方法和原理对您来说应该非常易懂。
我们会倾听用户在issues和 Discord channel和在互联网上的所有诉求,为了创建一个能让有着任何技术栈的开发者都能在deadline前完成任务的迅速,灵活以及友好的 Go web
框架,就像 Express
在 JavaScript
世界中一样。
下面列出了一些常见示例。如果您想查看更多代码示例,请访问我们的Recipes代码库或API 文档 。
func main() {
app := fiber.New()
// GET /api/register
app.Get("/api/*", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("✋ %s", c.Params("*"))
return c.SendString(msg) // => ✋ register
})
// GET /flights/LAX-SFO
app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to"))
return c.SendString(msg) // => 💸 From: LAX, To: SFO
})
// GET /dictionary.txt
app.Get("/:file.:ext", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext"))
return c.SendString(msg) // => 📃 dictionary.txt
})
// GET /john/75
app.Get("/:name/:age/:gender?", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age"))
return c.SendString(msg) // => 👴 john is 75 years old
})
// GET /john
app.Get("/:name", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
return c.SendString(msg) // => Hello john 👋!
})
log.Fatal(app.Listen(":3000"))
}
func main() {
app := fiber.New()
// GET /api/register
app.Get("/api/*", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("✋ %s", c.Params("*"))
return c.SendString(msg) // => ✋ register
}).Name("api")
data, _ := json.MarshalIndent(app.GetRoute("api"), "", " ")
fmt.Print(string(data))
// Prints:
// {
// "method": "GET",
// "name": "api",
// "path": "/api/*",
// "params": [
// "*1"
// ]
// }
log.Fatal(app.Listen(":3000"))
}
func main() {
app := fiber.New()
app.Static("/", "./public")
// => http://localhost:3000/js/script.js
// => http://localhost:3000/css/style.css
app.Static("/prefix", "./public")
// => http://localhost:3000/prefix/js/script.js
// => http://localhost:3000/prefix/css/style.css
app.Static("*", "./public/index.html")
// => http://localhost:3000/any/path/shows/index/html
log.Fatal(app.Listen(":3000"))
}
func main() {
app := fiber.New()
// Match any route
app.Use(func(c *fiber.Ctx) error {
fmt.Println("🥇 First handler")
return c.Next()
})
// Match all routes starting with /api
app.Use("/api", func(c *fiber.Ctx) error {
fmt.Println("🥈 Second handler")
return c.Next()
})
// GET /api/register
app.Get("/api/list", func(c *fiber.Ctx) error {
fmt.Println("🥉 Last handler")
return c.SendString("Hello, World 👋!")
})
log.Fatal(app.Listen(":3000"))
}
如果未设置模版引擎,则 Fiber
默认使用html/template。
如果您要执行部分模版或使用其他引擎,例如amber,handlebars,mustache或者pug等等...
请查看我们的Template包,该包支持多个模版引擎。
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/pug"
)
func main() {
// You can setup Views engine before initiation app:
app := fiber.New(fiber.Config{
Views: pug.New("./views", ".pug"),
})
// And now, you can call template `./views/home.pug` like this:
app.Get("/", func(c *fiber.Ctx) error {
return c.Render("home", fiber.Map{
"title": "Homepage",
"year": 1999,
})
})
log.Fatal(app.Listen(":3000"))
}
📖 路由分组
func middleware(c *fiber.Ctx) error {
fmt.Println("Don't mind me!")
return c.Next()
}
func handler(c *fiber.Ctx) error {
return c.SendString(c.Path())
}
func main() {
app := fiber.New()
// Root API route
api := app.Group("/api", middleware) // /api
// API v1 routes
v1 := api.Group("/v1", middleware) // /api/v1
v1.Get("/list", handler) // /api/v1/list
v1.Get("/user", handler) // /api/v1/user
// API v2 routes
v2 := api.Group("/v2", middleware) // /api/v2
v2.Get("/list", handler) // /api/v2/list
v2.Get("/user", handler) // /api/v2/user
// ...
}
📖 Logger
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/logger"
)
func main() {
app := fiber.New()
app.Use(logger.New())
// ...
log.Fatal(app.Listen(":3000"))
}
📖 CORS
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
)
func main() {
app := fiber.New()
app.Use(cors.New())
// ...
log.Fatal(app.Listen(":3000"))
}
通过在请求头中设置 Origin
传递任何域来检查 CORS:
curl -H "Origin: http://example.com" --verbose http://localhost:3000
func main() {
app := fiber.New()
app.Static("/", "./public")
app.Get("/demo", func(c *fiber.Ctx) error {
return c.SendString("This is a demo!")
})
app.Post("/register", func(c *fiber.Ctx) error {
return c.SendString("Welcome!")
})
// Last middleware to match anything
app.Use(func(c *fiber.Ctx) error {
return c.SendStatus(404)
// => 404 "Not Found"
})
log.Fatal(app.Listen(":3000"))
}
📖 JSON
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
app := fiber.New()
app.Get("/user", func(c *fiber.Ctx) error {
return c.JSON(&User{"John", 20})
// => {"name":"John", "age":20}
})
app.Get("/json", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{
"success": true,
"message": "Hi John!",
})
// => {"success":true, "message":"Hi John!"}
})
log.Fatal(app.Listen(":3000"))
}
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/websocket"
)
func main() {
app := fiber.New()
app.Get("/ws", websocket.New(func(c *websocket.Conn) {
for {
mt, msg, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
log.Printf("recv: %s", msg)
err = c.WriteMessage(mt, msg)
if err != nil {
log.Println("write:", err)
break
}
}
}))
log.Fatal(app.Listen(":3000"))
// ws://localhost:3000/ws
}
import (
"github.com/gofiber/fiber/v2"
"github.com/valyala/fasthttp"
)
func main() {
app := fiber.New()
app.Get("/sse", func(c *fiber.Ctx) error {
c.Set("Content-Type", "text/event-stream")
c.Set("Cache-Control", "no-cache")
c.Set("Connection", "keep-alive")
c.Set("Transfer-Encoding", "chunked")
c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
fmt.Println("WRITER")
var i int
for {
i++
msg := fmt.Sprintf("%d - the time is %v", i, time.Now())
fmt.Fprintf(w, "data: Message: %s\n\n", msg)
fmt.Println(msg)
w.Flush()
time.Sleep(5 * time.Second)
}
}))
return nil
})
log.Fatal(app.Listen(":3000"))
}
📖 Recover
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("normally this would crash your app")
})
log.Fatal(app.Listen(":3000"))
}
以下为包含在Fiber框架中的中间件列表.
中间件 | 描述 |
---|---|
basicauth | 基本身份验证中间件提供HTTP基本身份验证。 它为有效凭证调用下一个处理程序,为丢失或无效凭证调用401 Unauthorized. |
cache | 拦截和缓存响应. |
compress | Fiber的压缩中间件,默认支持' deflate ', ' gzip '和' brotli '. |
cors | 使用各种选项启用跨源资源共享(CORS). |
csrf | 保护来自CSRF的漏洞. |
encryptcookie | 加密 cookie 值的加密中间件. |
envvar | 通过提供可选配置来公开环境变量。. |
etag | 让缓存更加高效并且节省带宽,让web服务不再需要重新响应整个响应体如果响应内容未变更. |
expvar | 通过其HTTP服务器运行时间提供JSON格式的暴露变体. |
favicon | 如果提供了文件路径,则忽略日志中的图标或从内存中服务. |
filesystem | Fiber文件系统中间件,特别感谢 Alireza Salary. |
limiter | 用于Fiber的限速中间件。 用于限制对公共api和/或端点的重复请求,如密码重置. |
logger | HTTP请求/响应日志. |
monitor | 报告服务器指标,受Express-status-monitor启发. |
pprof | 特别感谢 Matthew Lee(@mthli) |
proxy | 允许您将请求proxy到多个服务器 |
recover | 恢复中间件从堆栈链中的任何位置的恐慌中恢复,并将控制处理到集中式. ErrorHandler. |
requestid | 为每个请求添加一个requesttid. |
session | Session 中间件. 注意: 此中间件使用了我们的存储包. |
skip | Skip middleware that skips a wrapped handler is a predicate is true. |
timeout | 添加请求的最大时间,如果超过了,则发送给ErrorHandler. |
以下为外部托管的中间件列表,由Fiber团队维护。
中间件 | 描述 |
---|---|
adaptor | net/http处理程序与Fiber请求处理程序之间的转换器,特别感谢 @arsmn! |
helmet | 通过设置各种HTTP头帮助保护您的应用程序。 |
jwt | JWT返回一个JSON Web Token(JWT)身份验证中间件。 |
keyauth | Key auth中间件提供基于密钥的身份验证。 |
redirect | Redirect middleware |
rewrite | Rewrite中间件根据提供的规则重写URL路径。它有助于向后兼容或者创建更清晰、更具描述性的链接。 |
storage | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
template | 该软件包包含8个模板引擎,可与Fiber v1.10.x Go 1.13或更高版本一起使用。 |
websocket | 基于 Fasthttp WebSocket for Fiber与Locals支持! |
For more articles, middlewares, examples or tools check our awesome list.
如果想感谢我们或支持 Fiber
的积极发展:
Fiber
是一个开源项目,依靠捐赠来支付账单,例如我们的域名,gitbook
,netlify
和无服务器托管。如果要支持 Fiber
,可以 ☕ 在这里买一杯咖啡
User | Donation | |
---|---|---|
@destari | ☕ x 10 | |
@dembygenesis | ☕ x 5 | |
@thomasvvugt | ☕ x 5 | |
@hendratommy | ☕ x 5 | |
@ekaputra07 | ☕ x 5 | |
@jorgefuertes | ☕ x 5 | |
@candidosales | ☕ x 5 | |
@l0nax | ☕ x 3 | |
@bihe | ☕ x 3 | |
@justdave | ☕ x 3 | |
@koddr | ☕ x 1 | |
@lapolinar | ☕ x 1 | |
@diegowifi | ☕ x 1 | |
@ssimk0 | ☕ x 1 | |
@raymayemir | ☕ x 1 | |
@melkorm | ☕ x 1 | |
@marvinjwendt | ☕ x 1 | |
@toishy | ☕ x 1 |
Copyright (c) 2019-present Fenny and Contributors. Fiber
is free and open-source software licensed under the MIT License. Official logo was created by Vic Shóstak and distributed under Creative Commons license (CC BY-SA 4.0 International).
Third-party library licenses