百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

ccwgpt 2024-09-18 12:19 25 浏览 0 评论

一、背景

在搭建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 的安装

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

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

创建项目

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

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

会生成这样的目录和文件

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

目录结构

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

$YOUR_APP
├─ bud
├─ controller
├─ internal
├─ public
└─ view
复制代码

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

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

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

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

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

运行bud run可以启动项目。

# 在默认的 3000 端口启动 bud server
bud run

# 在指定端口启动 bud server
bud run --port=8080

# 以非热加载模式启动 bud server
bud run --hot=false
复制代码

三、功能与使用

###1. 网络路由

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

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

# 创建一个叫作post的controller
bud new controller post

# 创建一个叫作post的controller,有index和show的function
bud new controller post index show

# 创建一个指定路由路径的controller
bud new controller post:/
复制代码

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

$YOUR_APP
└─ controller
    ├─ controller.go        -> root controller
    ├─ posts
    │  ├─ posts.go          -> posts controller
    │  └─ comments
    │     └─ comments.go    -> comments controller
    └─ users
       └─ users.go          -> users controller
复制代码

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

package users

// Controller for /users
type Controller struct {}

// User type
type User struct {
   ID int
   Name string
   Age int
}

// Index shows a list of users
// GET /users
func (c *Controller) Index() ([]*User, error) {}

// New user page
// GET /users/new
func (c *Controller) New() {}

// Create a new user
// POST /users
func (c *Controller) Create(name string, age int) (*User, error) {}

// Show a user
// GET /users/:id
func (c *Controller) Show(id int) (*User, error) {}

// Update a user
// PATCH /users/:id
func (c *Controller) Update(id int, name string, age int) error {}

// Delete a user
// DELETE /users/:id
func (c *Controller) Delete(id int) error {}

// Edit user page
// GET /users/:id/edit
func (c *Controller) Edit(id int) (*User, error) {}
复制代码

例如一个这样的请求

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

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

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

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

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

{
  "id": 10,
  "author": "Alice",
  "email": "alice@livebud.com"
}
复制代码

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

POST /posts/10/comments?id=20&author=Alice
{
   "id": 30,
   "author": "Bob"
}
复制代码

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

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

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

{
   "id": 10,
   "author": "Bob"
}
复制代码

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

2. 前端框架

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

$YOUR_APP
└─ view
   ├─ index.svelte     -> Root index page
   ├─ posts
   │  ├─ edit.svelte   -> Edit post page
   │  ├─ index.svelte  -> Post index page
   │  ├─ new.svelte    -> New post page
   │  ├─ show.svelte   -> Show post page
   │  └─ Post.svelte   -> Post component (not rendered)
   └─ users
      ├─ edit.svelte   -> Edit user page
      ├─ index.svelte  -> User index page
      └─ show.svelte   -> Show user page
复制代码

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

controller/users/users.go

package users

type Controller struct {}

type User struct {
  Name string
  Age int
}

func (c *Controller) Index() []*User {
  return []*User{
    {"Matt", 32},
    {"Mia", 31},
    {"Mike", 26},
  }
}
复制代码

view/users/index.svelte

<script>
  export let users = []
</script>

<h1>Users</h1>

<ul>
   {#each users as user}
   <li>{user.name} is {user.age} years old</li>
   {/each}
</ul>
复制代码

3. 扩展插件

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

bud-tailwind/
├── public
│   └── preflight.css
├── go.mod
└── go.sum
复制代码

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

$YOUR_APP
├── controller
│   └── post.go
├── public
│   └── favicon.ico
├── view
│   ├── index.svelte
│   └── show.svelte
├── go.mod
└── go.sum
复制代码

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

  $YOUR_APP
  ├── controller
  │   └── post.go
  ├── public
  │   ├── favicon.ico
+ │   └── preflight.css
  ├── view
  │   ├── index.svelte
  │   └── show.svelte
  ├── go.mod
  └── go.sum
复制代码

四、总结

Bud的特点:

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

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

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


作者:张醒言
链接:https://juejin.cn/post/7125382825229942814

相关推荐

5 分钟搭建 Node.js 微服务原型(node 微服务架构)

微服务已成为在Node.js中构建可扩展且强大的云应用的主流方法。同时也存在一些门槛,其中一些难点需要你在以下方面做出决策:组织项目结构。将自定义服务连接到第三方服务(数据库,消息代理等)处理微服...

当前的前端,真的不配叫程序员吗?

今天看到一个比较令人震惊的帖子,说前端不配叫程序员,令我很吃鲸,是谁我就不说了,帖子出处是一个大龄程序员组里面的,想想也不觉得奇怪了,毕竟对于年龄比较大的程序员来说,前端起步比较晚,最开始就是一个切图...

聊聊asp.net中Web Api的使用(asp.net core web api教程)

扯淡随着app应用的崛起,后端服务开发的也越来越多,除了很多优秀的nodejs框架之外,微软当然也会在这个方面提供更便捷的开发方式。这是微软一贯的作风,如果从开发的便捷性来说的话微软是当之无愧的老大哥...

NodeJS中,listen Access:permission denied解决办法

错误描述:Win10系统,NodeJS程序。使用express框架开发的http服务器,启动时出现错误提示“listenAccess:permissiondenied"。错误原因:这是由于...

Hono — 下一代高性能web框架(天融信下一代vnp)

最近公司可能要有变革,要统计我们的技能。真的是很无语,但是有没有办法。哎,问豆包吧提起Hono大家可能很陌生,这是什么?但是我提到Expressjs、nodejs想必前端小伙伴很熟悉啊。那么Hon...

生活例子说明线程,简单明了(列举一个日常生活中的例子以程序的形式表示)

1.程序设计的目标在我看来单从程序的角度来看,一个好的程序的目标应该是性能与用户体验的平衡。当然一个程序是否能够满足用户的需求暂且不谈,这是业务层面的问题,我们仅仅讨论程序本身。围绕两点来展开,性能...

Node实战006:自定义模块的创建和使用详解

Node的应用是由模块组成的,每个文件的定义都是一个模块(module变量代表当前模块)并有自己的作用域。Node遵循commonjs的模块规范,用来隔离每个模块的作用域,使每一个模块在自身的命名空间...

Node.js基本内容和知识点(node.js的概念)

简单的说Node.js就是运行在服务端的JavaScript,起初段定位是后端开发语言,由于技术的不够成熟,一般小型项目会完全使用node.js作为后台支撑,大项目中,运行不够稳定,不会轻易使用...

干货 | 如何利用Node.js 构建分布式集群

引言在软件定义的世界里,企业通过Web应用和移动应用程序来提供大部分的服务,Node.js迅速成为时下最为流行的一个平台之一,就和它可以搭建响应速度快、易于扩展的web应用和移动应用有很大关系,并凭...

nodejs mongodb 实现简易留言板(node.js留言板)

一个朋友问了一下mongodb的一些操作问题我就做了下面这个简单的留言板给他做一个实例希望能帮助到他express的框架就不说了express的问题请移步nodejs之expressht...

nodejs mqtt 智能售货机系统物联网控制系统源码分享

智能售货机系统(Moleintelligentvendingmachinesystem)是一套物联网控制系统性的解决方案。主要涉及到的语言和库有c,c++,js,nodejs,vue.js,...

为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?

说nodejs只是靠营销的是否太天真了些?当初nodejs出来的时候各种BUG,我简单的测试其大文件传输都会出现各种问题。而同時期的其他阵营早就甩其几条街了。但是为什么却能一直不断发展壮大?...

2020年14个最有用的NodeJS库(node用什么数据库)

Express快速,简单,极简的节点Web框架对…有好处·易于处理多种类型的请求,例如GET,PUT,POST和DELETE请求·快速构建单页,多页和混合Web应用程序每周下载1100万Lice...

连载:2016年最好的JS框架和库(下)

继续上一期的介绍:Agility.jsAgility.js是专为JS服务的MVC库,你可以免费编写可再用和可维护的浏览器代码,Agility支持Js,样式(CSS)、内容(HTML)和行为(JS)。C...

awesome-nodejs 终极资源库:60K+星标的开发者宝藏

Node.js终极资源库:60K+星标的开发者宝藏引言在GitHub上,有一个备受瞩目的Node.js资源仓库,以其惊人的60.6k星标量和6kfork量,成为了Node.js开发者的必备参考。这个...

取消回复欢迎 发表评论: