阅读解析tRPC v10.35的最小代码(2023年7月21日)

代码库

马好在本地区以最小代码编写的trpc

 

环境

Windows10 – Windows10操作系统
VScode – VScode编程环境
Next.13 pages router – 下一页13页路由器
TypeScript >= 4.7.0 – TypeScript版本大于等于4.7.0

在tsconfig.json中设置”strict”为true。
※建议使用这个配置。

下一步。Next.13 App router已经稳定版本,但周围还在努力适应。
tRPC也不例外,根据GitHub的问题跟踪,目前正在进行适配。

Next。13 App路由器上的tRPC支持情况。
功能:支持RSC和App布局·问题#3297·trpc / trpc
https://github.com/trpc/trpc/issues/3297
问题·trpc / next-13
https://github.com/trpc/next-13/issues
trpc / next-13:tRPC + next.js 13的实验性游乐场
https://github.com/trpc/next-13
trpc / examples-next-app-dir
https://github.com/trpc/examples-next-app-dir
2023年7月21日

在预定的地方使用

使用 tRPC 的地方
数据库 — (ORM Prisma 等) — 服务器 — (tRPC) — 本地

在DB服务器之间,我们使用ORM Prisma和其他工具。而在服务器本地之间,我们使用tRPC。

tRPC (GitHub 代码库)

trpc/trpc: ?‍♀️ 快速迁移且无故障。轻松实现端到端的类型安全API。
https://github.com/trpc/trpc

GitHub 上的 Star 历史

Star History Chart

星星的数量

2023年7月21日,27,200人
2023年5月27日,25,900人
2023年1月25日,20,000人
2023年1月23日,19,800人
2023年1月15日,19,200人
2022年9月22日,13,100人

安装

我会移动到建立项目的地方。

安装 Next.js

使用最新版本的npx create-next-app命令在当前目录中创建一个新的Next.js应用程序。

应用路由不予选择。
其余所有内容都将按默认安装。

安装与tRPC相关的库。

运行以下命令安装所需的 npm 软件包:npm install @trpc/server @trpc/client @trpc/next @trpc/react-query zod @tanstack/react-query

通信プロトコル tRPC の最小コード

src\pages_app.tsx 源代码文件

import '@/styles/globals.css'
import type { AppProps } from 'next/app'
import { trpc } from "../utils/trpc"

function App({ Component, pageProps }: AppProps) {
  return <Component {...pageProps} />
}

// AppをtRPCでラップしています。
export default trpc.withTRPC(App)

src\pages\index.tsx 的原始文件

// クライアント側:サイトのトップページ
import { trpc } from "../utils/trpc"

export default function Home() {
  // CTRL+Click で `greeting` をクリックすると関数の定義へ飛びます。
  const result = trpc.greeting.useQuery({ name: "VNS.BLUE" })

  // データが取得できない場合は Loadingが表示されます。
  if (!result.data) return <h1>Loading...</h1>

  return (
    <div>
      {/* 型が定義されており、オートコンプリートも可能です。
      下記のdataにマウスカーソルを乗せるとresultの型が見えます。
      下記のtextをマウスでCTRL+Clickすると、定義されている場所へ飛びます
      下記のtextをマウス右クリックしてメニューのシンボルの名前変更(F2キー)で、
      クラアントとサーバーの両方の名前を同時に変更します。
      (要:VScode) */}
      <h1>{result.data.text}</h1>
    </div>
  )
}

src\utils\trpc.ts的原始文件

// クライアント側
// Next.jsのAPI エンドポイントに接続を通すための設定です
import { httpBatchLink } from "@trpc/client"
import { createTRPCNext } from "@trpc/next"
import type { AppRouter } from "../pages/api/trpc/[trpc]"

function getBaseUrl() {
  // ブラウザか、そうでないかの判断します。
  if (typeof window !== "undefined") {
    //  ブラウザでは、相対URLを返します。
    return ""
  }
  // サーバーでレンダリングする場合は、絶対的なURLを返します。
  // 例:vercelを利用している場合
  if (process.env.VERCEL_URL) {
    return `https://${process.env.VERCEL_URL}`
  }

  // 上記のURLが設定されていない場合localhostを返します。
  return `http://localhost:${process.env.PORT ?? 3000}`
}

// Next.jsで使うtRPCクライアントを作ります
export const trpc = createTRPCNext<AppRouter>({
  config() {
    return {
      links: [
        // バッチリンクは処理をまとめてしまうことです。
        // データローダパターンの一種で、
        // 通信負荷を軽くします。
        httpBatchLink({
          // [tRPC].tsの設定場所
          url: getBaseUrl() + "/api/trpc",
        }),
      ],
    }
  },
})


源码\页面\api\trpc[trpc].ts

// サーバー側
// これはアプリのAPIハンドラですべてのAPIルートを含んでいます。
// 大きなアプリではこのファイルを複数のファイルに分割するとよいでしょう。
// initTRPC関数は、TRPCサーバーのインスタンスを作成するために使用されます。
import { initTRPC } from "@trpc/server"
// trpcNextはNext.jsアプリケーションでTRPCサーバーを使用するためのアダプターです。
import * as trpcNext from "@trpc/server/adapters/next"
// 入力スキーマを定義するために使用されるスキーマ定義言語
import { z } from "zod"

const t = initTRPC.create()

// TRPCルーターを作成します。
// appRouterは、t.router()関数を使用して作成されます。
const appRouter = t.router({
  // greetingという名前のプロシージャが定義されます。
  greeting: t.procedure
    // これはプロシージャの入力スキーマです。
    // これを変更すると、クライアントの型エラーがすぐに表示されます。
    // inputオブジェクトを受け取り、textプロパティを持つオブジェクトを返します。
    // inputオブジェクトは、zodを使用して定義された入力スキーマに従います。
    .input(
      z
        .object({
          // nameプロパティは、文字列またはnullを持つことができます。
          // nullish()メソッドは、nullまたはundefinedを許容します。
          name: z.string().nullish(),
        })
        .nullish(),
    )
    .query(({ input }) => {
      // これをクライアントに返します
      return {
        text: `hello ${input?.name ?? "world"}`,
      }
    }),
})

// エクスポートAPIハンドラ
// API の型定義のみエクスポートします。
// 実際の実装は一切クライアントに公開されません。
export type AppRouter = typeof appRouter

// エクスポートAPIハンドラ
export default trpcNext.createNextApiHandler({
  // routerオプションには、appRouterオブジェクトが渡されます。
  router: appRouter,
  // createContextオプションは、APIリクエストごとに呼び出される関数を指定します。
  // この例では、空のオブジェクトを返します。
  createContext: () => ({}),
})

在本地服务器上进行功能检查。

在完成复制源代码后,要运行本地服务器。

请进行 npm run dev 命令操作。

http://localhost:3000/ 只需要一個選項,請用中文來解釋。

你好VNS.BLUE 如果显示成功就好了。

杂学

这只是一份备忘录,没有必要特别阅读。
关于远程过程调用(RPC)的历史等。

杂学 RPC相关
REST、RPC的历史
基本上是关于服务器和客户端之间通过网络进行通信的历史
这被称为API,为了实现API所需的技术有以下5个(虽然还有很多但这里省略)
这些技术按照以下顺序诞生:
RPC(1970年代〜)

REST(2000年代〜)

GraphQL(2015年)、gRPC(2016年)

tRPC(2020年)架构
RPC和REST的架构稍有不同,各有优缺点。
简单地说。

RPC
可以通过在独立的计算机之间通过网络来执行函数来操作数据。

REST
确定了通信手段(协议)为HTTP,并通过HTTP方法(GET,PUT,POST,DELETE)来访问和操作数据。

GraphQL
可以通过一次请求获取复杂的数据。

gRPC
采用二进制格式,相比文本格式的JSON,可以更快地获取数据。

tRPC
使用TypeScript可以安全地执行函数并获取数据。
※在使用网站操作数据库时,可以在服务器和数据库之间放置Prisma(ORM)等,也可以直接使用Supabase等来操作数据库。

选择tRPC还是选择GraphQL?
(当然也可以选择REST等其他选项…)

tRPC是…
使服务器和客户端之间能够执行函数的方式。
迄今为止,REST和GraphQL一直担任着这个角色,
但是如果可以直接执行函数,那么这些角色就不再需要了。
(执行函数会返回一个返回值。)

应选择tRPC的场景
享受tRPC的好处有一些限制。
只有满足这些条件的项目才应选择tRPC。
服务器端和客户端都使用TypeScript。
而且,两者都可以看到其内部内容,并且可以修改其源代码。
对于小型项目,tRPC是合适的。
例如,
当您希望在个人开发中轻松实现时,
用于公司内部工具。

应选择GraphQL的场景
如果其中一方的内部内容不可知,则更适合使用GraphQL。
如果数据非常复杂,则更适合使用GraphQL。
此外,如果一方不使用TypeScript,则尽管可以运行,但需要自己编写客户端。
对于注重安全性的项目,GraphQL更适合。
对于大型项目,GraphQL更适合。
例如,
当使用公共API等进行开发时。
当有其他人要使用的项目时。
当开发大型项目时。

其他
tRPC不依赖于React。
GraphQL的实现很复杂,需要定义模式和在解析器中操作数据等。
在学习tRPC之前,
我认为最好了解一下RPC是什么。
基本上,RPC是从客户端调用服务器函数的方法。
基本上,您可以以更一体化的方式编写后端和前端。
基本上,您在后端编写函数,
并且可以在前端推断出所有tRPC函数的类型。
稍后从tRPC迁移到GraphQL很容易。
只需复制解析器就行了。没有与堆栈中的其他内容锁定的情况。
GraphQL和tRPC的主要区别实际上并不重要,但使用GraphQL API需要更多的工作。
但是,注意,一旦获得了GraphQL API,也可以公开它。
没有API的版本管理概念。
这是因为它就像函数返回的数据一样。
请求的批处理
这样可以将一定时间内的多个相同处理合并为一个,从而减轻负载。
客户端通过网络执行的工作较少。
而服务器只接收到一个HTTP请求,
每个请求都可以创建一个与该请求相关的上下文对象之类的东西,
从而减少服务器的工作量。
然后,将所有这些作为一个大的JSON主体返回。
如果使用jsDoc,它将用于客户端的推断。

术语

zod
以Typescript为主的验证库

tRPC方程

tRPC – 快速高效且无破坏。轻松创建安全的端到端API。| tRPC
https://trpc.io/

例子 (lì zi)

公式示例应用程序 | tRPC
https://trpc.io/docs/v10/example-apps

下一篇文章

 

请提供更多上下文。

一起来学习 tRPC 吧!
https://www.learnwithjason.dev/let-s-learn-trpc

第21集:亚历克斯·乔汉森 – tRPC,Zart
https://devtools.fm/episode/21?view=TRANSCRIPT

第21集的主题是亚历克斯·乔汉森 – tRPC,Zart。链接为https://devtools.fm/episode/21?view=TRANSCRIPT。

广告
将在 10 秒后关闭
bannerAds