ルーターのマージ
非公式ベータ版翻訳
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
すべてのAPIコードを同じファイルに記述するのは適切ではありません。ルーターを他のルーターと簡単にマージできます。
インラインサブルーターの定義
インラインサブルーターを定義する場合、ルーターをプレーンオブジェクトとして表現できます。
以下の例では、nested1 と nested2 は同等です:
server/_app.tstsimport * astrpc from '@trpc/server';import {publicProcedure ,router } from './trpc';constappRouter =router ({// Shorthand plain object for creating a sub-routernested1 : {proc :publicProcedure .query (() => '...'),},// Equivalent of:nested2 :router ({proc :publicProcedure .query (() => '...'),}),});
server/_app.tstsimport * astrpc from '@trpc/server';import {publicProcedure ,router } from './trpc';constappRouter =router ({// Shorthand plain object for creating a sub-routernested1 : {proc :publicProcedure .query (() => '...'),},// Equivalent of:nested2 :router ({proc :publicProcedure .query (() => '...'),}),});
子ルーターとのマージ
server.tsts// @filename: trpc.tsimport {initTRPC } from '@trpc/server';constt =initTRPC .create ();export constrouter =t .router ;export constpublicProcedure =t .procedure ;// @filename: routers/_app.tsimport {router } from '../trpc';import {z } from 'zod';import {userRouter } from './user';import {postRouter } from './post';constappRouter =router ({user :userRouter , // put procedures under "user" namespacepost :postRouter , // put procedures under "post" namespace});// You can then access the merged route with// http://localhost:3000/trpc/<NAMESPACE>.<PROCEDURE>export typeAppRouter = typeofappRouter ;// @filename: routers/post.tsimport {router ,publicProcedure } from '../trpc';import {z } from 'zod';export constpostRouter =router ({create :publicProcedure .input (z .object ({title :z .string (),}),).mutation ((opts ) => {const {input } =opts ;// [...]}),list :publicProcedure .query (() => {// ...return [];}),});// @filename: routers/user.tsimport {router ,publicProcedure } from '../trpc';import {z } from 'zod';export constuserRouter =router ({list :publicProcedure .query (() => {// [..]return [];}),});
server.tsts// @filename: trpc.tsimport {initTRPC } from '@trpc/server';constt =initTRPC .create ();export constrouter =t .router ;export constpublicProcedure =t .procedure ;// @filename: routers/_app.tsimport {router } from '../trpc';import {z } from 'zod';import {userRouter } from './user';import {postRouter } from './post';constappRouter =router ({user :userRouter , // put procedures under "user" namespacepost :postRouter , // put procedures under "post" namespace});// You can then access the merged route with// http://localhost:3000/trpc/<NAMESPACE>.<PROCEDURE>export typeAppRouter = typeofappRouter ;// @filename: routers/post.tsimport {router ,publicProcedure } from '../trpc';import {z } from 'zod';export constpostRouter =router ({create :publicProcedure .input (z .object ({title :z .string (),}),).mutation ((opts ) => {const {input } =opts ;// [...]}),list :publicProcedure .query (() => {// ...return [];}),});// @filename: routers/user.tsimport {router ,publicProcedure } from '../trpc';import {z } from 'zod';export constuserRouter =router ({list :publicProcedure .query (() => {// [..]return [];}),});
t.mergeRouters によるマージ
すべてのプロシージャを単一のフラットな名前空間で管理したい場合、代わりに t.mergeRouters を使用できます
server.tsts// @filename: trpc.tsimport {initTRPC } from '@trpc/server';constt =initTRPC .create ();export constrouter =t .router ;export constpublicProcedure =t .procedure ;export constmergeRouters =t .mergeRouters ;// @filename: routers/_app.tsimport {router ,publicProcedure ,mergeRouters } from '../trpc';import {z } from 'zod';import {userRouter } from './user';import {postRouter } from './post';constappRouter =mergeRouters (userRouter ,postRouter )export typeAppRouter = typeofappRouter ;// @filename: routers/post.tsimport {router ,publicProcedure } from '../trpc';import {z } from 'zod';export constpostRouter =router ({postCreate :publicProcedure .input (z .object ({title :z .string (),}),).mutation ((opts ) => {const {input } =opts ;// [...]}),postList :publicProcedure .query (() => {// ...return [];}),});// @filename: routers/user.tsimport {router ,publicProcedure } from '../trpc';import {z } from 'zod';export constuserRouter =router ({userList :publicProcedure .query (() => {// [..]return [];}),});
server.tsts// @filename: trpc.tsimport {initTRPC } from '@trpc/server';constt =initTRPC .create ();export constrouter =t .router ;export constpublicProcedure =t .procedure ;export constmergeRouters =t .mergeRouters ;// @filename: routers/_app.tsimport {router ,publicProcedure ,mergeRouters } from '../trpc';import {z } from 'zod';import {userRouter } from './user';import {postRouter } from './post';constappRouter =mergeRouters (userRouter ,postRouter )export typeAppRouter = typeofappRouter ;// @filename: routers/post.tsimport {router ,publicProcedure } from '../trpc';import {z } from 'zod';export constpostRouter =router ({postCreate :publicProcedure .input (z .object ({title :z .string (),}),).mutation ((opts ) => {const {input } =opts ;// [...]}),postList :publicProcedure .query (() => {// ...return [];}),});// @filename: routers/user.tsimport {router ,publicProcedure } from '../trpc';import {z } from 'zod';export constuserRouter =router ({userList :publicProcedure .query (() => {// [..]return [];}),});
ルーターの動的読み込み
lazy 関数を使用してルーターを動的に読み込めます。これはアプリケーションのコールドスタート時間を短縮するのに有効です。
レイジーロードされたルーターの使用方法は、通常のルーターとまったく変わりません。
ルーターのレイジーロード実装例:
ts// @filename: routers/_app.tsimport {lazy } from '@trpc/server';import {router } from '../trpc';export constappRouter =router ({// Option 1: Short-hand lazy load the greeting router if you have exactly 1 export and it is the routergreeting :lazy (() => import('./greeting.js')),// Option 2: Alternative way to lazy load if you have more than 1 exportuser :lazy (() => import('./user.js').then ((m ) =>m .userRouter )),});export typeAppRouter = typeofappRouter ;// ----------------------------------------------------// @filename: routers/greeting.tsimport {router ,publicProcedure } from '../trpc';export constgreetingRouter =router ({hello :publicProcedure .query (() => 'world'),});// ----------------------------------------------------// @filename: routers/user.tsimport {router ,publicProcedure } from '../trpc';export constuserRouter =router ({list :publicProcedure .query (() => ['John', 'Jane', 'Jim']),});
ts// @filename: routers/_app.tsimport {lazy } from '@trpc/server';import {router } from '../trpc';export constappRouter =router ({// Option 1: Short-hand lazy load the greeting router if you have exactly 1 export and it is the routergreeting :lazy (() => import('./greeting.js')),// Option 2: Alternative way to lazy load if you have more than 1 exportuser :lazy (() => import('./user.js').then ((m ) =>m .userRouter )),});export typeAppRouter = typeofappRouter ;// ----------------------------------------------------// @filename: routers/greeting.tsimport {router ,publicProcedure } from '../trpc';export constgreetingRouter =router ({hello :publicProcedure .query (() => 'world'),});// ----------------------------------------------------// @filename: routers/user.tsimport {router ,publicProcedure } from '../trpc';export constuserRouter =router ({list :publicProcedure .query (() => ['John', 'Jane', 'Jim']),});