tRPC 与 REST 对比
tRPC(类型安全的 RPC,TypeScript 全栈方案)对比 REST API(语言无关、标准方案)——API 设计比较,涵盖类型安全、生态系统与可扩展性。
零代码生成,端到端 TypeScript 类型安全
模式优先,面向多客户端的通用查询语言
要看具体场景,'类型安全'本身不是选择 GraphQL 的理由。如果你只有一个 TypeScript monorepo 加一个 Web 客户端,tRPC 几乎总能带来更少的工作量——零代码生成,服务端一改动客户端立刻报 TS 错误。如果你有移动端应用、需要对外开放的公共 API,或者需要多团队联邦架构,GraphQL 的语言无关模式契约和 Apollo Federation 生态会带来结构性优势。
| 分类 | tRPC | GraphQL |
|---|---|---|
| 性能 | 7/10 | 6/10 |
| 学习难易度 | 8/10 | 5/10 |
| 生态系统 | 6/10 | 9/10 |
| 社区 | 7/10 | 8/10 |
| 就业市场 | 5/10 | 8/10 |
| 面向未来 | 7/10 | 8/10 |
// tRPC — 路由定义(服务端)
import { initTRPC } from '@trpc/server';
import { z } from 'zod';
// db = Prisma/ORM 客户端(从单独的文件导入)
const t = initTRPC.create();
export const appRouter = t.router({
getUser: t.procedure
.input(z.object({ id: z.string() }))
.query(async ({ input }) => {
return db.user.findUnique({ where: { id: input.id } });
}),
});
export type AppRouter = typeof appRouter;
// 客户端 — 服务端类型自动推导,无需 codegen
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from './server';
const client = createTRPCClient<AppRouter>({
links: [httpBatchLink({ url: 'http://localhost:3000/trpc' })],
});
const user = await client.getUser.query({ id: '1' });
// user: { id: string; name: string; ... } — 编译期完整类型安全// graphql-js + @apollo/server — 在同一文件中定义 schema、resolver 和服务器
import { ApolloServer } from '@apollo/server';
import { startStandaloneServer } from '@apollo/server/standalone';
// db = Prisma/ORM 客户端(从单独的文件导入)
const typeDefs = `#graphql
type Post {
id: ID!
title: String!
}
type User {
id: ID!
name: String!
posts: [Post!]!
}
type Query {
user(id: ID!): User
}
`;
const resolvers = {
Query: {
user: (_parent, { id }, { db }) => db.user.findUnique({ where: { id } }),
},
User: {
posts: (user, _args, { db }) =>
db.post.findMany({ where: { authorId: user.id } }),
},
};
const server = new ApolloServer({ typeDefs, resolvers });
const { url } = await startStandaloneServer(server, {
context: async () => ({ db }),
listen: { port: 4000 },
});
console.log(`服务器已就绪: ${url}`);
// 客户端查询 — 只选择需要的字段:
// query { user(id: "1") { name posts { title } } }要看具体场景,'类型安全'本身不是选择 GraphQL 的理由。如果你只有一个 TypeScript monorepo 加一个 Web 客户端,tRPC 几乎总能带来更少的工作量——零代码生成,服务端一改动客户端立刻报 TS 错误。如果你有移动端应用、需要对外开放的公共 API,或者需要多团队联邦架构,GraphQL 的语言无关模式契约和 Apollo Federation 生态会带来结构性优势。
获取免费咨询如果你在一个 TypeScript monorepo 中只服务一个 Web 客户端,tRPC 所需的代码和配置更少(零代码生成、端到端 TS 类型推导——trpc.io)。如果你有移动端应用、对外开放的公共 API,或者有多个独立服务,GraphQL 的模式契约与联邦生态(Apollo Federation)能提供更合适的抽象。