它叫Tealina, 不用tRPC, 仅需Typescript, 实现端到端类型, 不用Swagger, 一行命令从代码提取类型和注释, 生成API文档.
效果展示: 手机端可能会卡, 建议查看视频
Tealina 是开源的, 并且已发布npm, 不建议直接安装使用, 因为Tealina依赖于特定的文件结构和类型别名, 更多细节请查看实现原理, 推荐通过官方脚手架快速开始.
1. 使用 create-tealina 创建一个开箱即用的项目,
以pnpm为例, 其他包管理器请查看文档,
pnpm create tealina demo
跟随提示, 一个全栈项目就准备好了
3. 按照提示 初始化项目
4. 启动 (cd 到 server 目录)
pnpm dev
浏览器打开文档页面 (http://localhost:5000/api-doc/index.html), 整个文档页面是根据 gdoc 命令生成的 json 渲染的. 文件保存在server/docs/api-v1.json.
至此, 你已经有了一个自带文档的API服务, 远不止如此,
cd 到 web 项目
执行 pnpm i
打开 App.tsx 试试 输入 req, 感受下端到端类型的快乐.
如果想要第一张动图一样的效果, 复制下面的Models定义, 粘贴到 server/schema.prisma文件,
1. 重新初始化
node init-dev.mjs
2. 启动并打开文档页即可.
Models
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
model Category {
id Int @id @default(autoincrement())
categoryName String
description String
products Product[]
}
model Product {
id Int @id @default(autoincrement())
productName String
description String
price Float
stockQuantity Int
categoryId Int
orderDetails OrderDetail[]
category Category @relation(fields: [categoryId], references: [id])
Comment Comment[]
}
model User {
id Int @id @default(autoincrement())
username String
password String
email String
address String
phoneNumber String
orders Order[]
Comment Comment[]
}
model Order {
id Int @id @default(autoincrement())
orderDate DateTime
orderStatus String
userId Int
user User @relation(fields: [userId], references: [id])
orderDetails OrderDetail[]
Payment Payment[]
}
model OrderDetail {
id Int @id @default(autoincrement())
quantity Int
unitPrice Float
orderId Int
order Order @relation(fields: [orderId], references: [id])
productId Int
product Product @relation(fields: [productId], references: [id])
}
model Payment {
id Int @id @default(autoincrement())
amount Float
paymentDate DateTime
paymentStatus String
orderId Int
order Order @relation(fields: [orderId], references: [id])
}
model Comment {
id Int @id @default(autoincrement())
text String
createdAt DateTime @default(now())
userId Int
user User @relation(fields: [userId], references: [id])
productId Int
product Product @relation(fields: [productId], references: [id])
}