@
shakaraka #13 你都用 bun 了,没试过 hono/elysia 之类的框架吗。它们更加激进地采用函数式路由+中间件+RPC ,不使用 FP 去开发会极其别扭。它们的代码库本身也是实用性函数式实践的一个良好示范。
nestjs 等项目依赖装饰器和类来定义结构,而这些较为新颖的框架是 schema 第一,类型第一,函数优先。它们推荐你使用 schema ,配合 prisma/drizzle/kysely 等 ORM 可以得到最良好的体验。
以 drizzle-orm 举例,定义好表结构,使用 drizzle-zod 可以派生出相应类型,例如一个表字段定义为 varchar({ length: 50 }),派生出的 schema 会自动生成 z.string().max(50),其运行时检验保证错误参数绝不会到达 sql 层,并且建议这份 schema 同时应用在前端表单校验和路由参数校验上,而前端使用框架提供的 RPC 获得与后端接口完全一致的类型,类型是框架反射 schema 类型和当前路由返回值提取出来的,不需要开发者重新写一遍,这套做法极致地实现了 DRY 理念,只需定义一份契约,保障全链路的运行时安全和 typescript 类型安全,并且减少了一堆冗余文件。
当使用这些框架去开发,已经没必要再分什么层了,分无可分,直接在路由编写业务代码就行。
而在此之上还有一堆优化空间,多用函数式,理想情况下可以压缩 75%以上代码,并且 bug 更少类型更安全且一致。
当然要践行起来坑也是不少的,例如我正在考虑把 zod 和 drizzle 换成 arktype 和 kysely 。