• Golang Web框架还在用Gin吗,快试试全新框架Bud吧


    一、背景

    在搭建Go语言的项目时,我们可能会习惯gin-gonic这样的框架。

    这里来介绍一款目前简单易用,功能强大的开源框架 Bud。项目开源不到一年的时间,但是目前已经3.9K+ star,发展势头非常好。

     

    Bud的地址:github.com/livebud/bud

    Bud这个名字的由来是Buddy(伙伴)的缩写。作者希望好的框架就像安静的技术伙伴,可以提供很大的帮助。

    二、使用教程

    创建一个Bud项目非常简单。

    环境配置

    Node v14+ (官方会在v0.3版本的时候去除node js依赖)
    // mac的话可以直接 brew install node

    Go v1.17+
    // 可以参考 Go语言安装和配置

    首先执行这个命令。会远程拉一个脚本并执行 Bud 的安装

    1. curl -sf https://raw.githubusercontent.com/livebud/bud/main/install.sh | sh
    2. 复制代码

    然后使用命令 bud -h 验证安装是否成功。

    创建项目

    用 bud create 来创建一个项目,参数是指定的当前路径下的项目目录。

    1. # 在 blog/ 目录下创建一个新的bud项目
    2. bud create blog
    3. 复制代码

    会生成这样的目录和文件

    1. $ ls
    2. go.mod node_modules/ package-lock.json package.json
    3. 复制代码

    目录结构

    Bud的标准目录结构如下所示:

    1. $YOUR_APP
    2. ├─ bud
    3. ├─ controller
    4. ├─ internal
    5. ├─ public
    6. └─ view
    7. 复制代码

    bud 目录包含框架生成的代码。偶尔会需要从这个目录导入生成的包,但在大多数情况下可以忽略它的内容。 建议将此目录置于源代码控制之外。

    controller 目录用于放置响应请求的代码。可用于为视图获取动态数据或提供 API。

    internal 目录用于放置项目自身的代码,bud框架永远不会用到这个目录。

    public 目录用于放置静态资源,比如图片和视频。

    view 目录用于存储 Svelte 文件以显示给您的访问者。视图通常与控制器配对。

    运行bud run可以启动项目。

    1. # 在默认的 3000 端口启动 bud server
    2. bud run
    3. # 在指定端口启动 bud server
    4. bud run --port=8080
    5. # 以非热加载模式启动 bud server
    6. bud run --hot=false
    7. 复制代码

    三、功能与使用

    ###1. 网络路由

    后端模块的请求处理逻辑,都是从controller开始。

    当我们需要创建controller的时候,可以直接通过命令的方式创建。

    1. # 创建一个叫作post的controller
    2. bud new controller post
    3. # 创建一个叫作post的controller,有index和show的function
    4. bud new controller post index show
    5. # 创建一个指定路由路径的controller
    6. bud new controller post:/
    7. 复制代码

    Bud框架的controller目录结构示例如下所示:

    1. $YOUR_APP
    2. └─ controller
    3. ├─ controller.go -> root controller
    4. ├─ posts
    5. │ ├─ posts.go -> posts controller
    6. │ └─ comments
    7. │ └─ comments.go -> comments controller
    8. └─ users
    9. └─ users.go -> users controller
    10. 复制代码

    users controller的示例如下,Bud框架对于controller的方法,都有对应的默认url路径。

    1. package users
    2. // Controller for /users
    3. type Controller struct {}
    4. // User type
    5. type User struct {
    6. ID int
    7. Name string
    8. Age int
    9. }
    10. // Index shows a list of users
    11. // GET /users
    12. func (c *Controller) Index() ([]*User, error) {}
    13. // New user page
    14. // GET /users/new
    15. func (c *Controller) New() {}
    16. // Create a new user
    17. // POST /users
    18. func (c *Controller) Create(name string, age int) (*User, error) {}
    19. // Show a user
    20. // GET /users/:id
    21. func (c *Controller) Show(id int) (*User, error) {}
    22. // Update a user
    23. // PATCH /users/:id
    24. func (c *Controller) Update(id int, name string, age int) error {}
    25. // Delete a user
    26. // DELETE /users/:id
    27. func (c *Controller) Delete(id int) error {}
    28. // Edit user page
    29. // GET /users/:id/edit
    30. func (c *Controller) Edit(id int) (*User, error) {}
    31. 复制代码

    例如一个这样的请求

    对于路径 /posts/:id/comments?order=xx&author=xx

    1. GET /posts/10/comments?order=asc&author=Alice
    2. 复制代码

    那么实际的GET请求参数是这样的:

    1. {
    2. "id": 10,
    3. "order": "asc",
    4. "author": "Alice"
    5. }
    6. 复制代码
    1. POST /posts/10/comments?author=Alice
    2. {
    3. "email": "alice@livebud.com"
    4. }
    5. 复制代码

    那么实际的POST请求参数是这样的:

    1. {
    2. "id": 10,
    3. "author": "Alice",
    4. "email": "alice@livebud.com"
    5. }
    6. 复制代码

    对于path参数和query参数有冲突的情况,例如:

    1. POST /posts/10/comments?id=20&author=Alice
    2. {
    3. "id": 30,
    4. "author": "Bob"
    5. }
    6. 复制代码

    那这时候,参数生效的优先级是这样的

    1.路径值(最高优先级)
    2.query参数
    3.请求正文(最低优先级)

    那么,最后生效的参数是这样的:

    1. {
    2. "id": 10,
    3. "author": "Bob"
    4. }
    5. 复制代码

    bud框架对这一类的功能,已经有处理的逻辑了。并且对于错误参数的处理也已经有一套逻辑,不需要用户再去写这类逻辑。

    2. 前端框架

    bud使用的前端框架是Svelte.JS,当如1中所示创建controller和action之后,可以生成对应的svelte文件

    1. $YOUR_APP
    2. └─ view
    3. ├─ index.svelte -> Root index page
    4. ├─ posts
    5. │ ├─ edit.svelte -> Edit post page
    6. │ ├─ index.svelte -> Post index page
    7. │ ├─ new.svelte -> New post page
    8. │ ├─ show.svelte -> Show post page
    9. │ └─ Post.svelte -> Post component (not rendered)
    10. └─ users
    11. ├─ edit.svelte -> Edit user page
    12. ├─ index.svelte -> User index page
    13. └─ show.svelte -> Show user page
    14. 复制代码

    例如可以这样让controller和view交互:

    controller/users/users.go

    1. package users
    2. type Controller struct {}
    3. type User struct {
    4. Name string
    5. Age int
    6. }
    7. func (c *Controller) Index() []*User {
    8. return []*User{
    9. {"Matt", 32},
    10. {"Mia", 31},
    11. {"Mike", 26},
    12. }
    13. }
    14. 复制代码

    view/users/index.svelte

    1. <script>
    2. export let users = []
    3. </script>
    4. <h1>Users</h1>
    5. <ul>
    6. {#each users as user}
    7. <li>{user.name} is {user.age} years old</li>
    8. {/each}
    9. </ul>
    10. 复制代码

    3. 扩展插件

    插件以 bud- 前缀开头,看起来像任何其他 Bud 应用程序。例如,让我们创建一个插件来服务 Tailwind 的 preflight.css 文件

    1. bud-tailwind/
    2. ├── public
    3. │ └── preflight.css
    4. ├── go.mod
    5. └── go.sum
    6. 复制代码

    如果Bud项目的目录如下所示

    1. $YOUR_APP
    2. ├── controller
    3. │ └── post.go
    4. ├── public
    5. │ └── favicon.ico
    6. ├── view
    7. │ ├── index.svelte
    8. │ └── show.svelte
    9. ├── go.mod
    10. └── go.sum
    11. 复制代码

    那通过执行命令 go get
    github.com/livebud/bud-tailwind之后,preflight.css就会安装到该bud项目中。

    1. $YOUR_APP
    2. ├── controller
    3. │ └── post.go
    4. ├── public
    5. │ ├── favicon.ico
    6. + │ └── preflight.css
    7. ├── view
    8. │ ├── index.svelte
    9. │ └── show.svelte
    10. ├── go.mod
    11. └── go.sum
    12. 复制代码

    四、总结

    Bud的特点:

    • Bud 使用静态分析生成代码。这允许 Bud 提供更高级别的 API,这些 API 可以被编译成低级的高性能 Go 代码。
    • 越来越多的捆绑代码生成器提供了特定于框架的功能。这些代码生成器与您可以自己编写的代码生成器没有什么不同。通过添加、自定义甚至丢弃这些代码生成器,让 Bud 成为您自己的。
    • Bud 带来了它自己的依赖注入框架,它减少了你需要做的手动连接,并标准化了你开发模块化、可测试和可交换依赖项的方式。

    但是目前Bud框架并没有自己的ORM,用户需要自行选择orm框架,通过依赖注入在控制器中使用。

    另外,还有全栈框架包含的特性,如错误处理、依赖注入、数据验证及安全、文件与存储等都可以在官方文档上找到。

  • 相关阅读:
    基于 Flink CDC 高效构建入湖通道
    新时代布局新特性 -- 容器查询
    framework源码读后感
    VMware workstation的安装
    数组的reduce和reduceRight方法
    一周内快速上线!菊风联手浙银金租打造轻量化智能单向视频见证解决方案
    Java之自定义MVC(2)
    ETL性能优化
    MATLAB神经网络和优化算法
    3年测试经验,投了300多份简历,没公司要我...
  • 原文地址:https://blog.csdn.net/Cr1556648487/article/details/126816660