V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
mizuhashi
V2EX  ›  分享创造

[Ruby on Rails 相关] Camille:让前端和 Rails 进行类型安全的通信

  •  
  •   mizuhashi · 2023-03-20 09:06:46 +08:00 · 1073 次点击
    这是一个创建于 401 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Github Repo: https://github.com/onyxblade/camille

    用 Rails 做 API server 的时候,我们返回的 json 是没有经过类型检查的,这样即使前端用上了 typescript ,我们也不能保证 Rails 返回的 JSON 是预期的结构和类型。于是我做了这个 gem 来在 Rails 端定义 API 接口的类型,并生成 ts 的调用函数,这样调用的参数和返回就都是类型安全的了。

    简而言之它的作用就是可以给 controller action 的 params 和 response 加上类型,例如对一个books#create action ,可以通过下面的代码加上类型:

    using Camille::Syntax
    
    class Camille::Schemas::Books < Camille::Schema
      include Camille::Types
    
      post :create do
        params(
          book: {
            name: String,
            author: String,
            retail_price: Decimal
          }
        )
        response(Boolean)
      end
    end
    

    然后可以生成前端的调用函数:

    // This file is automatically generated.
    import request from './request'
    
    export type DateTime = string
    export type Decimal = number
    
    export default {
      books: {
        create(params: {book: {name: string, author: string, retailPrice: Decimal}}): Promise<boolean>{ return request('post', '/books/create', params) },
      },
    }
    

    这样前端可以通过下面的方式调用:

    const bool = await endpoints.books.create({
      book: {
        name: 'Metaprogramming Ruby',
        author: 'Paolo Perrotta',
        retailPrice: 27.95
      }
    })
    

    这个调用的参数和返回值都是类型安全的,如果前端出错了 TS 会给出提示,后端出错则会被运行时检查查出来。同时请求的 path 也是不需要程序员管理的,程序员只要调用函数就好,Camille 会确保请求被正确的 action 处理。

    https://github.com/onyxblade/camille-tutorial 这里有一个 step by step 的 tutorial ,感兴趣的也可以看看。

    Camille 目前做到了支持 typescript 的除了 enum 和 utility types 的绝大部分类型语法( utility types 支持 omit 和 pick ),基本是一模一样的,在这个过程中用到了至今还没见有人用过的 refinement ,算是比较好玩的一点。具体的语法列表可以参见 https://github.com/onyxblade/camille#available-syntax-for-types

    欢迎试用和反馈,如果有需要的 feature requests 也可以加上。

    5 条回复    2023-03-20 10:45:51 +08:00
    tonyrft
        1
    tonyrft  
       2023-03-20 09:58:32 +08:00
    这和 protobuf 及 openapi 一流有什么区别么
    mywaiting
        2
    mywaiting  
       2023-03-20 10:00:49 +08:00
    这算是 Rails 版本的 tRPC.io 吗?
    liubaicai
        3
    liubaicai  
       2023-03-20 10:07:27 +08:00   ❤️ 1
    难得见一个用 ror 的
    mizuhashi
        4
    mizuhashi  
    OP
       2023-03-20 10:45:27 +08:00 via iPhone
    @tonyrft 不太了解这两个,能做的事估计差不多,可能比较简洁
    mizuhashi
        5
    mizuhashi  
    OP
       2023-03-20 10:45:51 +08:00 via iPhone
    @mywaiting 确实有受 trpc 启发,开发体验估计还是 trpc 更好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2841 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:37 · PVG 23:37 · LAX 08:37 · JFK 11:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.