[Ruby on Rails 相关] Camille:让前端和 Rails 进行类型安全的通信 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
mizuhashi
V2EX    分享创造

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

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

    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  
    P
       2023-03-20 10:45:51 +08:00 via iPhone
    @mywaiting 确实有受 trpc 启发,开发体验估计还是 trpc 更好
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5193 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 08:01 PVG 16:01 LAX 00:01 JFK 03:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86