久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

t3code全棧模板:用TypeScript實(shí)現(xiàn)前后端類(lèi)型安全打通

t3code全棧模板:用TypeScript實(shí)現(xiàn)前后端類(lèi)型安全打通 前陣子我在梳理全棧項(xiàng)目模板時(shí)發(fā)現(xiàn)一個(gè)很有意思的現(xiàn)象很多人把 T3 Stack 掛在嘴邊但真正能把 Next.js、TypeScript、tRPC、Prisma、Tailwind 這套組合落成一個(gè)可復(fù)用、可擴(kuò)展的代碼體系的人其實(shí)并不多。t3code 這個(gè)名字乍一看只是個(gè)簡(jiǎn)單的“代碼”集合但往深了挖它更像是一套以 TypeScript 為骨架、以類(lèi)型安全為靈魂的全棧項(xiàng)目落地模板。它能解決的是開(kāi)發(fā)團(tuán)隊(duì)在啟動(dòng)新項(xiàng)目時(shí)反復(fù)做重復(fù)選型、重復(fù)配環(huán)境、重復(fù)寫(xiě)膠水代碼的問(wèn)題也能幫助個(gè)人開(kāi)發(fā)者從零快速搭出一個(gè)結(jié)構(gòu)清晰、前后端類(lèi)型打通的應(yīng)用骨架。這篇文章不適合只想抄一段代碼就跑的人更適合真正想把全棧 TypeScript 項(xiàng)目做出“標(biāo)準(zhǔn)姿勢(shì)”的人。無(wú)論你是剛開(kāi)始接觸 T3 相關(guān)技術(shù)棧還是已經(jīng)在用 Next.js 但總感覺(jué)前后端類(lèi)型沒(méi)有打通都可以從這套代碼實(shí)踐中找到可以照搬的結(jié)構(gòu)和思路。我會(huì)直接把 t3code 在架構(gòu)選型、目錄組織、數(shù)據(jù)模型、接口封裝、前端接入、部署細(xì)節(jié)這幾個(gè)層面的實(shí)際做法拆開(kāi)來(lái)講。1. t3code 在解決什么問(wèn)題一套全棧 TypeScript 的“標(biāo)準(zhǔn)姿勢(shì)”1.1 從技術(shù)選型說(shuō)起為什么是 Next.js tRPC Prisma很多人在搭新項(xiàng)目時(shí)第一個(gè)糾結(jié)的地方就是技術(shù)選型。前端用 React 沒(méi)問(wèn)題但 Next.js 是不是過(guò)度設(shè)計(jì)后端接口用 REST 還是 GraphQL數(shù)據(jù)庫(kù) ORM 用 Prisma 還是 Drizzle這些問(wèn)題一旦在團(tuán)隊(duì)里展開(kāi)基本就是一場(chǎng)沒(méi)完沒(méi)了的討論。t3code 的選擇邏輯非常直白如果整個(gè)應(yīng)用都用 TypeScript 寫(xiě)那就讓類(lèi)型從前端一路穿透到數(shù)據(jù)庫(kù)。Next.js 負(fù)責(zé)應(yīng)用框架和應(yīng)用路由既有 SSR 能力也可以純靜態(tài)導(dǎo)出團(tuán)隊(duì)可以根據(jù)場(chǎng)景分別使用 Server Component 和 Client Component。TypeScript 負(fù)責(zé)語(yǔ)言層面的類(lèi)型約束從組件 props 到接口參數(shù)所有邊界都有類(lèi)型定義。tRPC 負(fù)責(zé)前后端接口通信它的特點(diǎn)是不需要額外定義 REST 路由也不需要寫(xiě) GraphQL Schema直接利用 TypeScript 的類(lèi)型推斷能力讓前端調(diào)用后端方法時(shí)獲得完整的自動(dòng)補(bǔ)全和類(lèi)型校驗(yàn)。Prisma 負(fù)責(zé)數(shù)據(jù)模型定義和數(shù)據(jù)庫(kù)訪問(wèn)schema 文件本身就是一份數(shù)據(jù)庫(kù)設(shè)計(jì)文檔同時(shí)生成的客戶端自帶類(lèi)型。這四樣?xùn)|西放在一起等于把“前端組件、后端邏輯、數(shù)據(jù)模型”三層的類(lèi)型全部串成一整條鏈。說(shuō)白了你在前端寫(xiě)const data await trpc.user.list.query()如果后端list方法沒(méi)寫(xiě)編輯器直接就報(bào)紅了根本不用等運(yùn)行時(shí)接口報(bào) 404。1.2 T3 理念的核心類(lèi)型安全不是口號(hào)是流程本身很多人會(huì)覺(jué)得類(lèi)型安全就是“用了 TypeScript 而已”但 t3code 做的事情不止于此。它把類(lèi)型安全延伸到了三個(gè)層面第一層是數(shù)據(jù)模型的類(lèi)型安全。Prisma Schema 里定義了User、Post這些模型字段類(lèi)型、關(guān)聯(lián)關(guān)系、索引都在這里確認(rèn)生成的 TypeScript 類(lèi)型直接成為整個(gè)應(yīng)用的唯一事實(shí)來(lái)源。第二層是接口調(diào)用的類(lèi)型安全。tRPC Router 的每個(gè) procedure 都帶有輸入輸出類(lèi)型。你在前端寫(xiě)調(diào)用時(shí)傳的參數(shù)類(lèi)型不對(duì)會(huì)立刻報(bào)錯(cuò)返回的數(shù)據(jù)結(jié)構(gòu)也是自動(dòng)推斷出來(lái)的不需要手動(dòng)維護(hù)一份接口文檔。第三層是業(yè)務(wù)狀態(tài)的類(lèi)型安全。React Query 配合 tRPC請(qǐng)求狀態(tài)、緩存 key、數(shù)據(jù)更新都能類(lèi)型化。重新取數(shù)、失效緩存、樂(lè)觀更新這些操作不再是靠字符串約定而是靠類(lèi)型系統(tǒng)約束。所以 t3code 的核心價(jià)值不是它用了多新的技術(shù)而是它把類(lèi)型安全變成了整個(gè)開(kāi)發(fā)流程的默認(rèn)行為。這就像你寫(xiě)后端代碼時(shí)函數(shù)參數(shù)不寫(xiě)類(lèi)型會(huì)渾身難受一樣t3code 讓你在寫(xiě)全棧代碼時(shí)體會(huì)一次“類(lèi)型不到處傳心里就不踏實(shí)”的狀態(tài)。2. t3code 的結(jié)構(gòu)設(shè)計(jì)與代碼組織2.1 項(xiàng)目目錄與職責(zé)劃分t3code 的目錄結(jié)構(gòu)看起來(lái)并不復(fù)雜但每個(gè)目錄的職責(zé)邊界非常清晰。我基于常見(jiàn)實(shí)踐把它整理成下面這套劃分方式新項(xiàng)目直接照抄都可以├── prisma │ ├── schema.prisma # 數(shù)據(jù)模型的唯一事實(shí)來(lái)源 │ └── migrations # 數(shù)據(jù)庫(kù)遷移記錄 ├── src │ ├── server │ │ ├── api │ │ │ ├── routers # 按業(yè)務(wù)域拆分的 tRPC Router │ │ │ │ ├── user.ts │ │ │ │ └── post.ts │ │ │ └── root.ts # 所有子 Router 匯總到根 Router │ │ ├── auth.ts # 認(rèn)證相關(guān)邏輯如果啟用了鑒權(quán) │ │ └── db.ts # Prisma Client 單例 │ ├── pages # Next.js 頁(yè)面路由 │ │ ├── _app.tsx # 全局 Provider 掛載點(diǎn) │ │ └── index.tsx │ ├── components # 通用 UI 組件 │ ├── styles # Tailwind 入口文件 │ ├── utils # 工具函數(shù) │ └── trpc │ ├── client.ts # 前端 tRPC 客戶端配置 │ └── server.ts # SSR 時(shí)的 tRPC 調(diào)用輔助 └── .env # 環(huán)境變量這個(gè)結(jié)構(gòu)的核心思想是按職責(zé)分層不按文件類(lèi)型亂堆。server 目錄只放后端相關(guān)代碼pages 目錄只負(fù)責(zé)路由入口components 目錄只放可復(fù)用 UI。真正業(yè)務(wù)相關(guān)的代碼比如查詢(xún)邏輯、數(shù)據(jù)轉(zhuǎn)換都收在 routers 和對(duì)應(yīng)的業(yè)務(wù)模塊里。2.2 最容易被忽略的配置細(xì)節(jié)目錄結(jié)構(gòu)誰(shuí)都會(huì)列真正拉開(kāi)差距的是配置細(xì)節(jié)。我見(jiàn)過(guò)不少項(xiàng)目從表面看結(jié)構(gòu)一樣但用起來(lái)就是各種不舒服問(wèn)題基本都出在下面這幾個(gè)地方。路徑別名的統(tǒng)一。tsconfig.json 里配置server/*、/*這些路徑別名本身不難難的是讓 ESLint、Prettier、Jest 這些周邊工具都認(rèn)同一套路徑。t3code 的做法是在 tsconfig 和 tailwind.config 里都顯式聲明同樣的別名確保編輯器提示、構(gòu)建解析、測(cè)試環(huán)境三者行為一致。嚴(yán)格模式必須開(kāi)滿。TypeScript 的strict: true只是底線。t3code 還會(huì)額外開(kāi)啟noUncheckedIndexedAccess這意味著arr[0]不會(huì)自動(dòng)推斷為元素類(lèi)型而是T | undefined。這個(gè)配置一開(kāi)始會(huì)覺(jué)得煩但實(shí)際上會(huì)逼你把所有數(shù)組訪問(wèn)的邊界都想清楚在寫(xiě)業(yè)務(wù)代碼時(shí)特別能預(yù)防線上才出現(xiàn)的取不到值問(wèn)題。環(huán)境變量的類(lèi)型化。項(xiàng)目啟動(dòng)時(shí)如果DATABASE_URL沒(méi)設(shè)置Prisma 會(huì)報(bào)錯(cuò)但報(bào)錯(cuò)信息有時(shí)候不夠直觀。t3code 會(huì)做一個(gè)統(tǒng)一的環(huán)境變量校驗(yàn)?zāi)K啟動(dòng)前把所有必需變量一次性檢查完缺哪個(gè)就明確提示缺哪個(gè)而不是等數(shù)據(jù)庫(kù)連接超時(shí)之后才猜原因。依賴(lài)安裝順序。先裝運(yùn)行時(shí)依賴(lài)再裝開(kāi)發(fā)依賴(lài)。因?yàn)?t3code 涉及 Next.js 的編譯、Prisma 的 generate、tRPC 的類(lèi)型生成這幾個(gè)工具的安裝順序如果不一致在某些 Node 版本下會(huì)出現(xiàn)原生模塊編譯失敗或者 Prisma Engine 下載不完整。3. 從零搭建一次 t3code 全流程實(shí)操3.1 環(huán)境準(zhǔn)備與腳手架初始化如果你要復(fù)現(xiàn) t3code 這套代碼實(shí)踐建議直接從干凈的目錄開(kāi)始。我假設(shè)你已經(jīng)裝好了 Node.js 18 LTS 以上版本的運(yùn)行環(huán)境并且本機(jī)有可用的包管理器。創(chuàng)建一個(gè)新項(xiàng)目時(shí)可以直接基于 create-t3-app 起步。執(zhí)行初始化命令之后交互式問(wèn)答里重點(diǎn)確認(rèn)幾個(gè)選項(xiàng)是否啟用 Next.js App Router、是否啟用 tRPC、是否啟用 Prisma、是否啟用 Tailwind CSS。我的建議是全選啟用因?yàn)?t3code 的完整價(jià)值就是讓這四樣?xùn)|西協(xié)同工作去掉任何一樣類(lèi)型安全鏈路都會(huì)出現(xiàn)斷點(diǎn)。完成初始化后第一件事不是寫(xiě)業(yè)務(wù)代碼而是先跑一遍npm run dev確認(rèn)基礎(chǔ)頁(yè)面能正常打開(kāi)。然后再改schema.prisma讓 Prisma 客戶端和后端類(lèi)型生成到node_modules/.prisma與src/server/db.ts能正常聯(lián)動(dòng)。這里有一個(gè)非常關(guān)鍵的細(xì)節(jié)不要一上來(lái)就用最新版 Prisma除非你已經(jīng)確認(rèn)它與 Next.js 當(dāng)前版本兼容。我在實(shí)操中遇到的多數(shù)疑難問(wèn)題都源于 Prisma 升級(jí)帶來(lái)的生成路徑變化。穩(wěn)妥做法是鎖定一個(gè)經(jīng)過(guò)驗(yàn)證的版本組合比如 Next.js 14 Prisma 5.x跑通整條鏈路后再考慮升級(jí)。3.2 數(shù)據(jù)模型設(shè)計(jì)用 Prisma 定義業(yè)務(wù)實(shí)體并生成客戶端數(shù)據(jù)模型設(shè)計(jì)是 t3code 里最需要提前想清楚的部分因?yàn)?Prisma Schema 一旦確定數(shù)據(jù)庫(kù)遷移和所有關(guān)聯(lián)類(lèi)型都會(huì)跟著確定下來(lái)。以一個(gè)簡(jiǎn)單的內(nèi)容發(fā)布系統(tǒng)為例我會(huì)在prisma/schema.prisma里定義出兩個(gè)相互關(guān)聯(lián)的模型generator client { provider prisma-client-js } datasource db { provider postgresql url env(DATABASE_URL) } model User { id String id default(cuid()) email String unique name String? posts Post[] createdAt DateTime default(now()) updatedAt DateTime updatedAt } model Post { id String id default(cuid()) title String content String published Boolean default(false) author User relation(fields: [authorId], references: [id]) authorId String createdAt DateTime default(now()) updatedAt DateTime updatedAt }一切模型設(shè)計(jì)都圍繞“關(guān)系”展開(kāi)。author和posts這兩個(gè)字段在數(shù)據(jù)庫(kù)層面對(duì)應(yīng)外鍵關(guān)系在 Prisma 層面對(duì)應(yīng)關(guān)聯(lián)查詢(xún)能力。當(dāng)你寫(xiě)好這條 schema 后執(zhí)行npx prisma migrate dev --name initPrisma 會(huì)幫你生成遷移文件并同步數(shù)據(jù)庫(kù)結(jié)構(gòu)同時(shí)自動(dòng)重新生成客戶端代碼。我使用 Prisma 客戶端時(shí)習(xí)慣在同一文件里導(dǎo)出單例避免在開(kāi)發(fā)環(huán)境下因?yàn)槟K熱更新創(chuàng)建多個(gè)連接實(shí)例import { PrismaClient } from prisma/client; const globalForPrisma globalThis as unknown as { prisma?: PrismaClient }; export const prisma globalForPrisma.prisma ?? new PrismaClient(); if (process.env.NODE_ENV ! production) { globalForPrisma.prisma prisma; }這個(gè)單例模式雖然不是 Prisma 官方文檔開(kāi)篇就講的內(nèi)容但在 Next.js 開(kāi)發(fā)模式下幾乎屬于標(biāo)配不這樣做的話每次文件改動(dòng)熱更新都可能產(chǎn)生數(shù)據(jù)庫(kù)連接堆積。3.3 接口層封裝tRPC Router 的寫(xiě)法與調(diào)用鏈數(shù)據(jù)模型就緒后接下來(lái)就是最容易寫(xiě)出“樣板代碼”的部分接口層。tRPC 的 Router 并不等同于傳統(tǒng) REST 路由它更像是一個(gè)“可遠(yuǎn)程調(diào)用的函數(shù)集合”。每個(gè) procedure 就是一個(gè)可被前端調(diào)用的函數(shù)由輸入解析、權(quán)限檢查、業(yè)務(wù)邏輯三部分組成。我先建立一個(gè)基礎(chǔ) Router 工廠import { initTRPC } from trpc/server; import { z } from zod; const t initTRPC.context{ userId: string | null }().create(); export const router t.router; export const publicProcedure t.procedure; export const protectedProcedure t.procedure.use(({ ctx, next }) { if (!ctx.userId) { throw new Error(Unauthorized); } return next({ ctx: { ...ctx, userId: ctx.userId } }); });這里有個(gè)關(guān)鍵點(diǎn)輸入校驗(yàn)用 zod而且是必選項(xiàng)。很多從 REST 轉(zhuǎn)過(guò)來(lái)的開(kāi)發(fā)者會(huì)覺(jué)得 zod 是多余的因?yàn)?TypeScript 類(lèi)型已經(jīng)定義了參數(shù)結(jié)構(gòu)。但運(yùn)行時(shí)輸入是不可信的TypeScript 類(lèi)型在編譯后會(huì)消失zod 的作用就是接管運(yùn)行時(shí)校驗(yàn)。tRPC 和 zod 是官配procedure 的輸入一旦定義好前端調(diào)用時(shí)不僅自動(dòng)獲得類(lèi)型推導(dǎo)錯(cuò)誤信息也會(huì)非常直觀。具體到業(yè)務(wù) Router我會(huì)這樣寫(xiě)import { z } from zod; import { router, publicProcedure, protectedProcedure } from ../trpc; import { prisma } from ../db; export const postRouter router({ list: publicProcedure .input(z.object({ take: z.number().min(1).max(50).default(10) })) .query(async ({ input }) { return prisma.post.findMany({ take: input.take, orderBy: { createdAt: desc }, }); }), create: protectedProcedure .input( z.object({ title: z.string().min(1), content: z.string().min(1), }) ) .mutation(async ({ ctx, input }) { return prisma.post.create({ data: { title: input.title, content: input.content, authorId: ctx.userId, }, }); }), });接著在 root Router 里合并所有子 Routerimport { router } from ./trpc; import { postRouter } from ./routers/post; import { userRouter } from ./routers/user; export const appRouter router({ post: postRouter, user: userRouter, }); export type AppRouter typeof appRouter;上面這一步最重要的東西是export type AppRouter。這個(gè)類(lèi)型導(dǎo)出之后前端可以基于它生成完整的類(lèi)型安全的 tRPC 客戶端。整個(gè)調(diào)用鏈的銜接靠的就是這個(gè)類(lèi)型定義。類(lèi)型的穿透力有多強(qiáng)前端代碼里手寫(xiě)trpc.post.create.mutate({ title: x, content: y })時(shí)title和content都是必填的參數(shù)類(lèi)型錯(cuò)誤在保存文件的那一刻就會(huì)顯示出來(lái)。整個(gè)鏈路里只要有一層類(lèi)型對(duì)不上編輯器就是一面紅色錯(cuò)誤墻這比任何接口文檔都來(lái)得可靠。3.4 前端頁(yè)面接入與樣式處理t3code 的前端接入核心工作就是把 tRPC 客戶端掛到 React 應(yīng)用上然后在組件里直接調(diào)用查詢(xún)方法。頁(yè)面入口_app.tsx要包一層 Providerimport { httpBatchLink } from trpc/client; import { QueryClient, QueryClientProvider } from tanstack/react-query; import { trpc } from ../utils/trpc; import type { AppProps } from next/app; const queryClient new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false, }, }, }); const trpcClient trpc.createClient({ links: [ httpBatchLink({ url: /api/trpc, }), ], }); export default function App({ Component, pageProps }: AppProps) { return ( trpc.Provider client{trpcClient} queryClient{queryClient} QueryClientProvider client{queryClient} Component {...pageProps} / /QueryClientProvider /trpc.Provider ); }實(shí)際業(yè)務(wù)組件里的寫(xiě)法是import { trpc } from ../utils/trpc; export default function PostList() { const { data, isLoading } trpc.post.list.useQuery({ take: 10 }); if (isLoading) return div加載中.../div; return ( ul {data?.map((post) ( li key{post.id} h2{post.title}/h2 p{post.content}/p /li ))} /ul ); }注意看調(diào)用useQuery時(shí)傳入的({ take: 10 })是有類(lèi)型檢查的data的每一項(xiàng)直接就是 Prisma 返回的Post類(lèi)型。這里不需要手寫(xiě)任何接口類(lèi)型定義也不需要在前后端之間復(fù)制 DTO。狀態(tài)管理這部分用 React Query 處理緩存、重試、加載態(tài)都不需要自己造輪子。樣式方面Tailwind 主要負(fù)責(zé)原子類(lèi)但 t3code 并不強(qiáng)制你用 Tailwind。實(shí)際用下來(lái)Tailwind 在快速搭建頁(yè)面時(shí)確實(shí)高效可一旦設(shè)計(jì)系統(tǒng)復(fù)雜到一定程度單獨(dú)抽離組件樣式反而更明智。所以我的建議是項(xiàng)目前期用 Tailwind 打通所有基礎(chǔ)樣式等出現(xiàn)重復(fù)性極高的樣式組合時(shí)再抽成組件類(lèi)不用把每個(gè)頁(yè)面都寫(xiě)成純?cè)宇?lèi)堆疊。4. 實(shí)際踩過(guò)的坑t3code 常見(jiàn)問(wèn)題與排查記錄這一部分是我最想寫(xiě)的因?yàn)?t3code 這類(lèi)全棧模板真正的門(mén)檻不是學(xué)會(huì)某個(gè)框架而是各種配置在真實(shí)開(kāi)發(fā)環(huán)境里互相作用時(shí)的那些隱藏問(wèn)題。我整理了一份速查表然后挑幾個(gè)最典型的展開(kāi)講。問(wèn)題現(xiàn)象根本原因處理方式啟動(dòng)時(shí)提示PrismaClientInitializationErrorDATABASE_URL未設(shè)置或格式不正確檢查.env文件和.env.example是否同步前端調(diào)用接口時(shí)類(lèi)型不匹配tRPC 客戶端基于的AppRouter類(lèi)型是舊版本重新跑一遍prisma generate和類(lèi)型檢查確認(rèn)根組件導(dǎo)出類(lèi)型已更新頁(yè)面顯示舊數(shù)據(jù)刷新后恢復(fù)客戶端 Query 緩存未失效在 mutation 成功回調(diào)里調(diào)用trpc.useUtils().post.list.invalidate()熱更新之后數(shù)據(jù)庫(kù)連接數(shù)暴漲Next.js dev 模式下創(chuàng)建了多個(gè) Prisma 實(shí)例使用全局單例模式復(fù)用 PrismaClientTailwind 類(lèi)名沒(méi)有生效內(nèi)容路徑配置不全新目錄未被掃描在tailwind.config.ts中顯式添加./src/**/*.{ts,tsx}tRPC procedure 調(diào)用報(bào) 500但日志不詳細(xì)異常被 tRPC 默認(rèn)處理攔截開(kāi)發(fā)環(huán)境開(kāi)啟onError日志生產(chǎn)環(huán)境使用錯(cuò)誤格式化中間件4.1 Prisma 版本升級(jí)導(dǎo)致的生成異常這個(gè)問(wèn)題我會(huì)放第一個(gè)說(shuō)因?yàn)閹缀趺總€(gè)跑了一段時(shí)間的 t3code 項(xiàng)目都會(huì)遇到。某天執(zhí)行npm update后突然發(fā)現(xiàn)prisma generate生成的結(jié)果和舊版本不兼容數(shù)據(jù)庫(kù)訪問(wèn)層報(bào)出一堆類(lèi)型錯(cuò)誤或者 Prisma Client 報(bào)“The generated client has been modified”的提示。排查思路很簡(jiǎn)單先看項(xiàng)目鎖定文件里 Prisma 和prisma/client的版本是否完全一致。這兩個(gè)包必須同步升級(jí)不能一個(gè)升一個(gè)不升。其次看 schema 文件是否有舊的生成器配置殘留。最后如果升級(jí)后實(shí)在找不到原因直接刪除node_modules、刪除生成的prisma/migrations中未提交的遷移記錄重新安裝并執(zhí)行prisma migrate dev基本都能恢復(fù)。4.2 tRPC 類(lèi)型在跨包引用時(shí)丟失tRPC 在單一代碼庫(kù)里效果最好但如果你的項(xiàng)目一開(kāi)始就設(shè)計(jì)成 monorepo或者把業(yè)務(wù)模塊抽成了多個(gè) npm 包類(lèi)型穿透的鏈路就可能斷掉。我遇到過(guò)的典型情況是后端新增了一個(gè) procedure前端包里的AppRouter類(lèi)型始終沒(méi)有同步更新不管怎么重新安裝依賴(lài)編輯器里都看不到新接口。這個(gè)問(wèn)題在 t3code 里的標(biāo)準(zhǔn)解法是確保類(lèi)型導(dǎo)出的路徑是純類(lèi)型導(dǎo)出并且業(yè)務(wù)包之間的依賴(lài)方式使用 workspace 協(xié)議。如果前端包直接依賴(lài)后端包的構(gòu)建產(chǎn)物那么每次后端代碼變更后都要重新構(gòu)建一次否則類(lèi)型就是舊的。使用 workspace 協(xié)議配合 TypeScript Project References可以讓類(lèi)型在源文件層面直接關(guān)聯(lián)省掉構(gòu)建這一步。4.3 HMR 與路由緩存帶來(lái)的“看得到舊數(shù)據(jù)”Next.js 開(kāi)發(fā)模式下熱更新有時(shí)會(huì)觸發(fā)頁(yè)面路由緩存導(dǎo)致你明明改了后端返回邏輯刷新頁(yè)面看到的還是舊數(shù)據(jù)。這種行為不一定是 tRPC 或 Prisma 的問(wèn)題而是 React Query 的緩存策略在作祟。解決方案是在 mutation 成功后主動(dòng)失效相關(guān)查詢(xún)緩存。t3code 習(xí)慣在封裝的創(chuàng)建、更新、刪除操作里統(tǒng)一調(diào)用失效方法const utils trpc.useUtils(); const createPost trpc.post.create.useMutation({ onSuccess: () { utils.post.list.invalidate(); }, });這樣每次數(shù)據(jù)變更后列表都會(huì)自動(dòng)重新請(qǐng)求頁(yè)面展示的數(shù)據(jù)和數(shù)據(jù)庫(kù)狀態(tài)保持一致不需要手動(dòng)刷新。這個(gè)細(xì)節(jié)如果沒(méi)處理用戶會(huì)反復(fù)反饋“我提交了但看不到新內(nèi)容”特別影響體驗(yàn)。4.4 環(huán)境變量缺失引發(fā)的隱蔽報(bào)錯(cuò)環(huán)境變量相關(guān)的問(wèn)題總是最隱蔽的因?yàn)楸镜亻_(kāi)發(fā)時(shí).env存在一切正常一到部署或者新成員拉代碼時(shí)缺少必要變量報(bào)錯(cuò)五花八門(mén)。我見(jiàn)過(guò)最心累的一種是DATABASE_URL寫(xiě)錯(cuò)但不是完全缺失導(dǎo)致 Prisma 能初始化但每次查詢(xún)都超時(shí)。t3code 的做法值得借鑒在服務(wù)端入口處統(tǒng)一校驗(yàn)環(huán)境變量而不是用到哪就在哪讀取。我會(huì)寫(xiě)一個(gè)簡(jiǎn)單的校驗(yàn)函數(shù)在應(yīng)用啟動(dòng)時(shí)檢查DATABASE_URL、NEXTAUTH_URL如果啟用了認(rèn)證等核心變量缺失時(shí)直接拋出帶有具體變量名的錯(cuò)誤讓排查時(shí)間縮短到一分鐘以?xún)?nèi)。5. t3code 的擴(kuò)展方向與我的個(gè)人體會(huì)5.1 從模板到業(yè)務(wù)腳手架還能往哪些方向長(zhǎng)t3code 作為一套代碼實(shí)踐它的價(jià)值不止于“創(chuàng)造一個(gè)項(xiàng)目”更在于后續(xù)可以沿著多個(gè)方向延伸成完整的業(yè)務(wù)腳手架。第一個(gè)方向是接入文件上傳與對(duì)象存儲(chǔ)。目前大多數(shù) T3 項(xiàng)目在涉及文件上傳時(shí)都會(huì)臨時(shí)找方案有的用第三方存儲(chǔ) SDK有的用云函數(shù)直傳。如果把這部分抽象成統(tǒng)一的上傳模塊配合 Prisma 保存文件元數(shù)據(jù)就會(huì)省去很多重復(fù)勞動(dòng)。第二個(gè)方向是把權(quán)限模型做進(jìn) Router 中間件。tRPC 的中間件機(jī)制非常適合做 RBAC。你可以根據(jù)業(yè)務(wù)角色封裝出一套adminProcedure、editorProcedure把權(quán)限檢查從業(yè)務(wù)代碼里完全剝離出去。到這一步t3code 就從一個(gè)技術(shù)模板變成了貼合業(yè)務(wù)的開(kāi)發(fā)框架。第三個(gè)方向是服務(wù)端渲染與 tRPC 的深度配合。t3code 的基礎(chǔ)演示大多集中在客戶端調(diào)用但在實(shí)際項(xiàng)目中很多頁(yè)面需要服務(wù)端直接取數(shù)首屏渲染或者利用 Next.js 的 Server Component 來(lái)做數(shù)據(jù)預(yù)取。tRPC 的服務(wù)端調(diào)用器和客戶端調(diào)用器可以在同一套類(lèi)型體系下工作這意味著你在服務(wù)端可以直接調(diào)用喂給組件的預(yù)取數(shù)據(jù)不需要額外維護(hù)一套數(shù)據(jù)獲取方案。這塊做深之后整個(gè)應(yīng)用的響應(yīng)速度和首屏體驗(yàn)都會(huì)明顯提升。5.2 關(guān)于 t3code 的幾句實(shí)在話根據(jù)我個(gè)人的使用經(jīng)驗(yàn)t3code 這套技術(shù)組合并不適合所有場(chǎng)景。如果你的項(xiàng)目非常簡(jiǎn)單只是一個(gè)展示頁(yè)加上一個(gè)聯(lián)系表單那完全沒(méi)有必要上 Prisma 和 tRPC直接用 Next.js 的 API Route 就夠了引入整條類(lèi)型安全鏈路反而是負(fù)擔(dān)。如果你的項(xiàng)目業(yè)務(wù)邏輯復(fù)雜、接口數(shù)量多、團(tuán)隊(duì)協(xié)作頻繁那 t3code 帶來(lái)的類(lèi)型安全收益會(huì)非??捎^。前后端類(lèi)型統(tǒng)一之后接口聯(lián)調(diào)的時(shí)間會(huì)大幅壓縮很多運(yùn)行時(shí)的“字段不存在”“類(lèi)型是 string 但實(shí)際是 number”這類(lèi)問(wèn)題會(huì)大幅減少。它不保證沒(méi)有 bug但確實(shí)能把一類(lèi)特別難排查的集成 bug 在編譯期擋在門(mén)外。另外我想特別提一點(diǎn)t3code 這種模板的價(jià)值會(huì)隨著項(xiàng)目演進(jìn)逐漸上升。剛開(kāi)始你可能不覺(jué)得類(lèi)型穿透有多重要但當(dāng)項(xiàng)目到兩萬(wàn)行代碼、幾十個(gè) Router、十幾個(gè)頁(yè)面模型時(shí)你會(huì)慶幸每一次數(shù)據(jù)結(jié)構(gòu)的改動(dòng)都有 TypeScript 替你兜底。那種“改一個(gè)字段所有引用點(diǎn)全部提示更新”的體驗(yàn)值得你為它多花點(diǎn)時(shí)間把基礎(chǔ)架構(gòu)搭穩(wěn)。最后再說(shuō)一個(gè)小技巧如果你打算把 t3code 長(zhǎng)期用在團(tuán)隊(duì)項(xiàng)目里一定要維護(hù)一份自定義的初始化文檔記錄你安裝依賴(lài)的版本、遇到過(guò)的問(wèn)題、團(tuán)隊(duì)約定的目錄職責(zé)甚至可以把初始化腳本固化下來(lái)。模板的意義在于縮短啟動(dòng)時(shí)間而不是成為團(tuán)隊(duì)里人人都不敢碰的“黑盒”。把這些過(guò)程沉淀下來(lái)新成員進(jìn)入項(xiàng)目的成本會(huì)低很多整個(gè)團(tuán)隊(duì)的開(kāi)發(fā)效率也會(huì)真正受益。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产 热久久久久国产精品| 96AV精品| 好爽视频在线观看视频| 久久亚洲色图中文字幕| 亚洲AV无码| 豆花视频操逼网址| 国产精品一区二区三区在线| 人人澡人人弄| 日韩三级久久久| 福利社区午夜一区二区| 99热这里只有精品18| 中文字幕第23区| 黄页大片在线观看| 久妇网| 香蕉热人人精品| 日本影视久久免费| 大香交| 91红杏| 男人的天堂2019AV| 少妇一区二区三区在线观看| 成人婷婷丁香| 久久免费精彩视频| 伊人五月天青青草婷婷| 67914亚洲精品| 欧美人人AAA| 99久久精品欧美国产| 黑人猛交| 蜜臀久久99精品久久久久久-DVD| 五月天AV资源| 97久操| 精品久久9| 欧美视频第二页| 91亚洲人电影| 欧洲亚洲人妻无码中字久久三区四区 | 懂色Av一区二区三区| 丁香婷婷激情五月天无毒不卡| 艳美熟妇先锋一二三区| 人妻精品4K4K4K4K4| 久久精彩视频9| 五月天婷婷成人网| 亚洲丝袜二区| 欧美亚洲综合色| 激情久久久| 干婷婷综合网| 97最新在线播放视频| www.91理论| 免费毛片在线播放| 日本女人操逼| 亚洲熟妇图片| 精品人妻视频一区二区三区蜜桃视频| 有码色中文字幕在线观看| 99久久综合| 亚洲精品天天影视综合网 | 丝袜性亚洲| 日本伦理一区二区| 99re6国产精品99re| 日本五区不卡| A级毛片在线看免费| 中文字幕交换人妻| 夜夜草网站| 国产日比| 97午夜剧场日韩| 91老司机在线视频免费观看| 中文字幕88av在线| 狠狠爱AV| 精品福利| 日本欧美亚洲高清在线看| 去干网最新版| 性欧美另类高清| 91色黑人少妇| 99最新日韩偷拍视频| 中文字幕黄色一起草| 精品人妻一区二区三区不卡断| 亚洲风情在线观看| 中文字幕黄片在线| 91狼人| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 深夜视频| WWW啪啪的com| 超碰亚洲欧美日韩无| 福利在线视频一区二区| 深夜福利黄片| 国产欧美亚洲精品a第2页| 中文字幕精品一区二区精品| 伊人四虎综合| 亚洲无码超碰免费| 日本综合色图| 先锋音影AV| 人妻激情视频| 亚洲 国产 精品一区| 九九aV| 国产传媒一区日韩| 亚欧美综合网| 家庭乱伦网站国产| 刺激性视频黄页| 91处女在线视频| 26uuu最新| 黄片不用下载在线观看| A男人的天堂| 玖玖久久久| 日本色色色视频| 国产suv精品一区二区四区999| 91精品少妇搡搡搡| 黄色AAAAAAAAAAA大片| 亚洲欧美激情另类色图| 狠久久| 色视频蜜乳| 曰韩欧美国产传媒麻豆第一区| 91强在线播放| 久久伊人亚洲AV无码网站| 日韩有码免费视频| 亚洲精品97p| 亚洲免费成人在线高清无码视频| 亚洲精品黑丝| 色婷婷久久| 四虎免费视频| 九九无码视频| 日韩性色| 中文字幕成人| 熟妇熟女一区二区三区| 吻戏激情性巴克| 99精品在线| 国内毛片婷婷六月色| 欧美一级欧美三级在线观看| 亚洲色图欧美一区二区不卡| 97频视在线| 欧洲欧美视频一区二区| 夜夜久久| 国产精品一区av在线| 夜夜爽妓女| 18禁看网站一区| 99色综合| V A在线| 精品国产乱码久久久久A| 日韩电影中文字幕| 亚洲 日韩 欧美 国产综合体| 色亚洲欧美| 亚洲精品丝袜-不卡成人免费……| 蜜桃午夜视频一区二区 | 九九亚洲精品| 亚洲欧洲精品视频发布| asc国产精品| 亚洲日韩成人性爱视频| 97综合国产| www.色婷婷| 大香蕉中文在线| 久久久999日本大片| 日韩视频中文字幕| 日韩av情韩国爱禁区av一区二区| 日本一级性爱| 日韩黄片影院| 男人的天堂久久狠| 啊啊啊不要好疼视频| 视频一区二区免费在线| 足交视频老司机| 看黄片视频免费| 青草地一本线一区二区三区| 欧美三级一级| hd成人一区二区在线| 成人情色综合网| 婷婷香蕉欧美在线一区二区三区| 波多野结衣一级视频| 99热大香蕉伊在线| 亚洲色图久久成人| 99re公开精品免费视频| 99这里只有精品国产| 91精产一区二区三区| 超踫中文字幕| 色色激情| 福利在线观看一区二区| 一级做a爰片性色毛片久久| 日本欧美m v精品网站加| 9久综合网| 国产无码精品无码| 欧美啪啪天堂| 日韩不卡网操逼中文字幕日韩| 操逼网站视频漫画国产| 日韩性爱小视频| 青青草久草AV| 中文字幕视频2区| 立川理惠无码一区二区| 久久免费99精品久久久久久| 91色狼| 99re在线精品78| 久久婷婷五月天| 亚洲中文一区二区三区| 人人干人人操人人爱| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 中国熟女91| 91色亚洲| 热久久无毒不卡| 麻豆国产av网| 国产成人资源| 中文字幕 码 自拍 视频 区| 久久精品国产96精品亚洲拳交| 日本操逼视频在线| 97天天| 人妻色情天天操| 成人老鸭窝人人在线视频| 97干日韩| 日韩三级视频一区二区三区| 久热婷婷| 欧美黄片视频在线观看免费 | 欧美一级黄色18片免费看| 美国日韩黄片| 黄骗免费网站| 国产99热| 啪啪综合网| 欧美色图亚洲激情| 97爱爱| 欧综合网| 久久久久九九九| 一二三区视频在线观看| 竹菊一区二区三区AV线| 青草地一本线一区二区三区| 999热这里只有精品| 中文字幕av片| 久久三区四区| 成人线上超碰| 久久国产乱子伦精品免费女人| 国产精品第一区第一页| 日本五十路熟女一区二区| 亚洲色图日韩精品| 国产精品熟女丝袜一区二区| 99无码| 熟妇熟女亚洲天堂网| 亚洲五月丁香花狠狠干一区二区三区| 伊人五月天青青草婷婷| 日日黄色三级网站| 97国产中文| 午夜九九九九九九| 日韩免费一级性爱视频| 色狠狠 - 百度| 久久久久国产精品喷潮免费观看臀 | 黑人黄片在线免费观看| 国产精品大香蕉| 色99色| 91亚洲不卡一区| 五月天伊人| 爱爱久久| 在线a亚洲视频播放在线| 在线综合 亚洲 欧美中文字幕| 太久视频| 亚洲日本成人动漫| 亚州高清色综合| 九九人妻| 日韩成年人性爱视频| 97人人夜夜精品视频| 成人性爱美曰韩| 亚洲色五月| 青春草A| 男人天堂毛片| 操操操五月天婷婷丁香影院| 久久精视频美日韩在线视频| 综合色图亚洲欧美| 强奸熟女一区二区三区 | 操www| 五月天婷婷综合| 97中文字幕色| 超碰在线免费一区二区三区| 欧美一区二区三区入口| 超碰人人妻| 九九国产热| 高清孕妇孕交 交| 欧美性爱无码一区二区三区| 蜜奶av| 九九操久久国产免费视频| 国产亚洲日韩欧| av天堂手机版追回| 色综和网| 日韩成人无码| 欧美日韩99| 欧美韩国你懂得在线 | 激情看片网站| 欧美影音在线| 99久久亚洲精品无码毛片潘甜甜| 性色av婷婷久久一区二区点复制| 密臀AV在线| 舔足天天操天天射| 久精品无码av一区二免费国产在线观看| 天天综合网国产| 无码操逼天堂| 看一级特黄a大一片| 素人美腿视频网站| 日本操逼无码| 超碰超碰欧美| 清纯唯美综合| 90后性网国产欧美| 欧美综合在线第一页| 日本三级一区二区 在线| 人妻啊啊人妻啊| 综合网少妇| 婷婷去俺也去六月色| 91在线美女| 免费在线看黄片av| av优播| 色色色色综合网| 国产97在线视频| 97碰碰日本乱偷人妻中文的| 无码人妻精品一区二区三区99不卡| a级理论午夜日本| 九区国产| 国产精品视频一区二区三区八戒| 国产久久日| 视频在线观看免费一区二区三区| 动漫区日韩区欧美区| 久综合国内精品自在自线| 人妻精品综合中文字幕在线 | 精品一区96| 欧美综合网A| 夂久色| 91亚洲欧美激情| 东京热亚洲一区二区| 亚洲男人天堂网站| 婷婷情色综合网| 日本淫乱女一区二区三区视频| 99色悠悠| 成人小说视频在线精品欧美| 精品一区二区2| 丁香五月天啪啪| 麻豆成人影音在线| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 懂色Av一区二区三区| 日本福利社| 免费观看成人www精品视频| 人妻密肉在线观看| 人人艹亚洲| 亚洲综合色在线| 丁香五月激情综合国产| 777超碰| 欧美一区二区情色| 顶级丝袜熟女一区二区三区| 夜夜嗨一区二区三区直播内容| 97色五月天完| 操迟操逼在巾线Fre看| 97伦乱| 成功精品影院| 亚洲色欲天天天堂色欲网女| 久久精品无码熟妇一区二区三区视频导航 | 蜜乳中文字幕a在线| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 69久久| 色噜噜国产在线| 偷拍自拍在线视频观看| 9久久久久| 日韩激情视频| 五月婷婷色| 久久综合资源一区二区| 加勒比中文av| 国产熟女自拍| 99久久综合| 91色婷婷综合久久中文字幕二区| 亚洲天天做日日做天天谢日日| 亚洲精品日韩国产欧美| 久草成人福利导航| 亚洲第一无码播放立川理惠| 亚洲国产精品成人综合| 99少妇| 蜜桃精品视频一区| 精品四五区| 久久AV无码网址| 国产精品成久久久久午夜午夜| 日本97久久| 精品一区二区麻豆| 91蜜臀在线久久久久| 在线性黄高清免费视频| 777AV电影| 久久只有精品| 色婷婷国产精品一区在线观看| 超碰碰小说97| 欧美青青草视频| 麻豆黄四叶草网站| 2025亚洲男人天堂| 精品国产一区二区久久| 青青草在线成人视频| 亚洲中文字幕精品久久久久久直播| 91殴美大片| 人妻少妇久久久| 日本午夜久久电影| 人妻日日干| 三级色综合| 欧美日韩性爱电影在线| 午夜福利av电影在线| 国产福利一区二| 亚洲天天操| 天天综合官网| 97视频免费播放| 美欧色综合| 亚洲图片91| 超碰色图| 亚欧色图在线激情| 午夜性生活av免费在线看| 9久久久久| 91爱| 人妻精品免费一二三区| 亚洲成人黄色在线观看| 370p日韩欧美亚洲精品| 操逼www.| 五月天婷婷久久| 色五月综合| 五月婷婷综合网| 黑丝内射一区二区三区| 婷婷五月天久久精品视频一区二区三区| 久久手机视直播| 亚洲伊人久久精品狠狠在线| 青青草日本中文字幕| 超碰综合色| 任你干在线视频| 久久九九精品一区二区| 亚洲国产成人精品女人久久久| 日本国产欧美一区三区二区| 少妇无码av专区线| 亚洲成av人片色午夜乱码| 成人欧美一区二区三区黑人一| 青青青操| 久九9精品| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 日韩欧美成人性爱在线| 9999免费精彩视频| 殴美综合色88| 国产97综合| 99999精品| 欧美性爱无码一区二区三区| 无码国产精品午夜不卡(| 男女一进一出视频久久| 日本www操操操| 夜夜嗨一区二区| 欧美伦乱爱| 91n处女在线观看| av网站在线看| 亚洲欧美中文日韩视频中国语 | 99久久9| 2017天天插| 日韩黄色av中文字幕| 成人午夜无码视频| 91爱做| 极品色综合| 国产女人与拘做受视频免费| 麻豆蜜桃视频在线观看| 黑人性暴力毛片| ji熟女.com| 日韩中文字幕二区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 欧美午夜视频| 久久久久亚洲Av无码专区老牛影视| 久久国产免费激情视频| 乱理日韩中文| 97鸡把在线视频| 曰本人妻人人澡人人夹| 亚洲国成人情色好看电影| 久久久久成人网| 国产AV激情无码久久无码| 九九视品黄色| 欧美亚洲手机在线| 亚洲福利中文字幕在线| 国产精品久久久九九九| 亚洲av综合伊人久久| 日本大片日本一区二区免费高清| 久久久久久裸体| 老子午夜伦不卡影院| 国产成人亚洲精品自产在线| 久久久久99精品成人片蜜臀| 日本精品成人无码| 亚洲大色鬼| 欧美精品日韩久久久九| 1204av韩国| 欧美中文字幕日韩在线| 九九九久千久久激情蜜桃在线看 | 精品999日本| 亚洲中文字幕精品一区| 午夜精品一区二区三区三上悠亚| 风韵犹存大大大大香蕉 | 日本久久999| 丰满人妻一区二区三区四区| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 欧美劲爆视频一区二区| 亚洲性综合| 第四色奇米影视777| 欧美超碰96| 一中国女人毛片水真多| 亚洲影院小综合| 可以免费看黄片的视频| 超碰久久草| 日韩美女操b| 久久久久久久久国产| 成人5码视频| 日本熟妇色熟妇在线视频播放| 色呦呦呦在线观看视频| 欧美后入式| 色情综合| 亚州男人天堂| 啊啊啊啊啊在线视频| 精品丝袜无码一区二区三APP| 中国黑人三级片网站上区| 偷拍三区| 97欧美久久久久久久| 乱色视频中文字幕| 欧美在线天堂| 久久久久一本一区二区青青蜜月| 日韩激情小说一区二区| 啊啊啊慢点| 精品一区二区3区| 少妇熟女1区2区3区| 中 文字幕一区二区三四 五 区日 日 骚 | 久7色| 午夜福利一区二区影院| 亚洲啪啪啪啪视香蕉| 亚洲国产无码精品首页久久久| 哈哈操电影| 九九久久99| 国产精品爽爽va在线观看98| 一起草视频在线| 宅男午夜在线视频| 18禁超污无遮挡无码免费网| av三级电影在线播放| 亚洲精品1区| 五月天婷婷基地| 国产成人亚洲精品无码最新在线| 青青草好吊| 欧美日日网| 九九久久一区二区伦理| 精品天堂| 亚洲国产成人7777| 日韩成人人妻网站| 男人天堂.AB| 美国一区二区免费视频| 亚洲男人电影天堂| 欧美97日韩精品| 无码又爽又硬又激情免费视频 | 蜜桃臀 后入 一区 二区 三区 在线| 国产中文字幕在线点播| 日韩成人小视频| 91丝袜美腿网站| 国产呦精品系列在线观看| 久久中文字幕女同性恋一区| 日韩pv中文| 亚洲熟女中文字幕在线| 在线免费观看高清无码视频| 香蕉大久久久| 成人热久久精品| 久色网| 亚洲视频1区| 欧美中出| 人妻丝袜一区二区三区在线| 日本一区99| 久热九九| 国产精品99久久久www| 天天色天天干天天爱| 日韩啪啪视频| 大香交| 青青三级视频| 97人人爱人人做人人乐| 九九热精品免费视频| 嫖老熟女A片一二三区| 日本韩国国产精品一区| 午夜男女爽爽大片免费观看| 国产精品欧美在线观看 | 精品性爱一区二区| 精品九九国产无码| 96久久久久久久| 久久精品99| 亚洲国产精品久久久男人的天堂| 日韩天堂av电影在线观看| 婷婷五月天av| 激情开心五月天| 超碰成人国产| 黄片在线免费在线观看| 欧美成人黄网色网站| 亚洲AV无码翔田千里网站| 国产高清亚洲日韩一区| 久久精品国产Aⅴ| 中文久久久| 亚州综合| 欧美日韩国产成人高清| 国产精品人妻无码久久久老鸭窝 | 久久男人| 极品人妻少妇综合| 蜜臀99久久精品久久久久久| 中文字幕乱妇免费视频| 精品97久久| 妇女乱色二区| 诱惑网综合| 欧州91高潮| 亚洲AV成人精品网站在AV| 9丨久久九九九| 亚洲色图伊人网| 999熟女精品| 综合大香蕉美。| 九九九国产| 亚洲天堂男| 国产精品96| 国产美女自拍AV| 久久这里是精品| 欧美日韩国产三级黄色| 国产成人精品日本视频| 激情五月天丁香社区| 熟女人妻久久中文字幕一二区| 日本天天吊| 亚洲AV不卡在线观看尤物| 青青草色插素人| 91欧美巨乳| 五十路熟女人妻一区二区在线观看 | 蜜桃臀久久| 久操免费观看| 国产精品爽爽v| 国产一区二区三区精品观看啪| 蜜臀少妇一区二区| 黑人中出21连凳花野真衣| 欧美夜夜骑视频| 97在线免费视频观看| 日本成a人v网站在线观看| 人人妻人人爽 97人人看碰人免费公开视频 | 午夜传煤十二区精品| 欧美天天射| 日本欧美一区二区三区视频麻豆| 国内精品久久久久影院亚洲| 久久久av爱| 青青草华人在线欧美在线| av网站国产主播在线| 顶级丝袜熟女一区二区三区| 天天爱天天韩国日本牛牛牛牛 | 国产免费内射视频| 91人妻素女| 亚洲欧美一区二区三区在钱蜜桃| 亚洲影视高清第一页| 精品视频在线观看| 91快色色色色色| 激情露脸爱| 床戏久久久av一区二区麻豆| 国产亚洲中文不卡二区| 后X久久| 久9爱经典视频| 韩国手机不卡无码三级视频| 五月婷婷啪啪| 亚洲综人网| 久久久久久人妻一区精品色欧美| 9久热| 久久综合久色欧美综合狠狠| 午夜性生活av免费在线看| 九九色热| 国产高清在线自在拍69| 国产av又色又爽又黄| 91男女啊啊啊| 欧美色网络| 亚洲色综合| 啊嗯嗯啊好大好爽| 影音先锋每日最新资源在线观看 | 97久久久久久久久久| 国产精品毛片?v一区二区三区| 亚洲精品男人的天堂| 天天操福利视频综合网站| 中文字幕亚洲永久精品| 老熟妇综合| 尤物网站91| www99热| 97久操| 国产AV高清AV无码| 91痴汉| 伦理片秋霞免费影院| 99色在线| 人、人、摸,人、人、草| 久草在| 日va操| 热热热热日日漂亮永久永久国产日| 国产黄色小视频网站| 国产性感在线观看| 欧美日韩一二三| 天天日日夜夜| 日本不卡在线二区三区| 国产久久一区二区午夜| 欧美色图20p| 亚洲色图加勒比| 秋霞一集毛片观看| 日韩少妇丰满亚洲| 精品久久久久久无码| 区一二区日韩亚洲乱码av电影| 一级乱伦网站| 校园春色制服丝袜中文字亚洲| 欧亚揄拍偷拍精品视频 | 亚洲AV小说| 看免费的黄片| 91性感网站| 91色婷婷综合久久中文字幕二区| 超碰导航97| AV天堂电影网| 人干人人人操人人摸| 果冻传媒A片一二三区| 国产乱伦性爱AV| 青青草色AV| 又大又白奶子| 69XX一中文字幕人妻91| 青青草日韩免费观看高清在线| 999国产精品999| 少妇综合网| 91挑色欧美| 日本狠狠干| 久久在线观看免费视频| 九区国产| 亚洲不卡AV在线| 岛国片在线播放| 日1区2区3区2020| 亚洲天堂性爱| 黄色性爱网网| 少妇久久久久久久| 黑人粗大V S日韩女优视频| 69精品人人人人| 午夜男女爽爽大片免费观看| 一二三卡欧美日韩人妻免费精品| 小少妇| 午夜精品五区| 国产精品免费久久久久久久久久| 久久久内射良家| 日本精品一区三区| 国产乱人伦AVA麻豆软件.| 亚洲高清自拍| 偷拍五区| 神马久久久久久久久久久久| 开心五月深爱五月| 人干人人人操人人摸| 啊啊啊免费视频| 91精品国产长腿丝袜美女| 嗯嗯啊啊用力视频免费| 天天干天天干天天干| 精品高清一区二区三区三州| 9精品久久久久| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 亚洲一区二区专区-国产丝袜精品丝袜-成人AV| 一起草精品人妻| 国产 日韩 欧美高清| 人妻日日干| 无码精品久久| 韩国三级色呦呦| 亚洲精品电影| 99re在线视频| 极品后入免费视频| 青青国产精品在线| 小少妇| 亚洲AV无码国产成人| 国产亚洲深夜激情| 五月丁香黄色网| 午夜一区| 精品国产乱码久久久久久网站入口| www.男人天堂| 色网综合网| 人妻一区久久二区三区色播| 97干色天堂| 日韩乱码av| 人妻加勒比东京热| 9l视频自拍9l九色成人| 亚洲精品aa久久伊人| 99在线无码精品秘 入口黑人| 日韩操啪| 亚洲无线码欧洲精品区别| 搡老女人老91妇女老熟女| 2019天天干| 亚洲国产精品无石码久久| 国产精品农村妇女| 欧日韩一二三f区| 天天操福利视频综合网站| 少妇特黄一区二区三区| 性高潮久久久| 九九久久国产精品怡红院| 本道在线| 97chaopengongkai| 色九久| 99精品国产户外露出| 久久免费少妇| av强奸乱轮| 99热免费| 日韩激情视频| 欧美第二页午夜| 欧美亚州色的图| 蜜桃臀一区二区三区久久| 色五月激情AV在线| 竹菊一区二区三区AV线| 久久欧美激情| 免费精品国偷自产在线在线| 51国产午夜精品视频| 91美女精品| 色吧 综合| 飘花国产午夜精品不卡| 在线看片国产精品每日更新| www.人人cao| 熟女丰满人妻一区| 色婷婷综合久久中文字幕雪峰| 男人精品天堂一区| 国产成人啪一区二区| 97av在线视频| 婷婷五月天基地| 亚洲视频,小说| 亚洲欧美日韩中文久久自慰| 欧美性暴力猛交| 日本孕妇一区二区视频操逼免费看 | 是还免费视频1727我| 四虎精品一区| 欧美亚洲天堂| 性爱边摸边日免费AV| 五月色丁香| 超碰在线974| 日韩成人人妻网站| 91w欧美| 久久久免费的精品| 婷婷激情五月| 热的中文 热的有码 热的国产| 欧美色图99| 超碰在线一区二区三区| 人人操人人插人人摸人人干| 人妻丰满熟妇一区二区三| 亚洲欧美经典一区二区| 污到发麻的视频 国产| 精品人妻视频一区二区在线播放 | 色九九九综合| 不卡在线观看视频| 国产熟女完整版中字 | 97精品视频网站| 天天狂操夜夜狂日| 少妇一区二区三区精选| 9久久精品| 91精品免费| 国产午夜精品理论片一二三区区 | A 在线网址| 国产色呦呦| 国产夜夜艹| 香蕉99秘 一区精品蜜桃臀| 精品少妇人妻av久久免费| 啊啊啊啊啊啊啊国| 久久久亚洲熟妇资源| 亚洲 日韩 丝袜 熟女 变态| 亚州操操穴网| 欧美综合另类| 日本网色| 啊啊啊轻点在线观看| av一区二区三区四区| 熟妇人妻一区二区| 欧美色图欧美| 伊人五月天| 久操影视| 韩国午夜理伦三级好看| 美女高潮视频91| 91狠狠综| 蜜桃视频精品一区二区| 少妇天堂| 超碰在线人妻| 国产2.3.4区| 乱论91| 天天日天天屌天天操| 日语五十路和六十路亚洲国产精品 | 国产a级午夜毛片| 蜜臀亚洲中文| 精品国模无码| 91原创在线观看| 91麻豆天美传媒在线| www久| 青青五月天| 一区二区娱乐网站| 欧美韩日精品99综合| 首页中文字幕中文字幕免费| 日本一级不卡一二区| 国产高清在线观看欧美| 国产成人精品一区| 少妇高潮特黄A片| 91n.欧美| 久久婷色| 国产精品视屏| 欧美日韩国产中文超碰| 日本在线观看网址| 婷婷久草一区二区三区| 91成人18| 亚洲精品骚逼| 无码最新| 亚洲中文字幕久久无码精品| 日本123区操B视频| 外国免费性情大片| 欧美夜夜狠| 无码不卡八戒| 欧美国产有色电影| 亚洲AV无码乱码在线观看性色| 91天天综合在线观看| 大香蕉亚洲中文| 99国产精品| 久久香蕉超碰97国产精品| 国产特级毛片AAAAAA高潮流水| 久久久久久裸体| 99ri精品| 无遮挡男女激烈动态图| 夜夜爽77777| 国产福利电影| 90后后入| 国产不卡片| 强奸乱伦Av网| henhen91| 330dv亚洲成年视频网| 三级网色| 白丝av| 久久色一区二区| 色婷婷电影网| 啊啊啊想要| 国产60区。| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 色欲蜜臀AV| 超碰九7| 91偷拍欧美亚洲| 综合久久中文字幕综合日韩精品| 特污精品女优骚货黄色视频在线免费观看| 日韩97视频!在线| 天天插天天操| A片大香蕉在线| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 中文久久爆乳| 日韩性爱视频在线免费观看| 国产后入式在线观看| 99热导航| 涩五月婷婷| 欧美性爱一级操| 亚洲爽图| 久久久久白虎| 97超视频在线观看| 亚洲s在线观看| 操婷婷逼| 国产亚洲精品美女久久久m| 青娱乐91| 呻吟 欧美 日本 中出| 国内操逼视频二区| 长长久久88视频| 99久久99九九99九九九| 亚洲欧洲日韩天堂av| 天天草天天日| 欧美男人的天堂| 男人天堂最新手机版在线青青草| 少妇一区二区三区在线观看| 99re这里只有精品中心播放| 人妻少妇久久久| 日本在线不卡v二区| 芊芊操逼视频无码| 精品人成视频在线观看| 亚洲天堂欧美| 久久久久久人| 人人操超碰在线| 中文字幕在线观看永久| 国产极品粉嫩馒头一线天av| 精品无av| 婷婷探花久久精品一区| 91色人| 91丝袜美腿片| 91精产一区二区三区| 求求你操操我| 在线视频五十市| 久热久一区二区三区| 好淫网一二三视区| 久久天天摸| 男人的天堂不卡一区二区| 日本天天操| 天天色综合天天操| 99久在线精品99re8热| 日本午夜精品理论片A级APP发布| 免费综合亚洲中文| 强奸乱伦麻豆| 操美女高潮抽搐白浆| 九九综合色| 婷婷激情四射| 五月天丁香欧洲日韩| 屌色在线97视频| 日本人妻一区二区| 小草精彩毛片| 大鸡吧尹人在线| 中文97国产| 区日韩亚洲乱码av电影| 国产白领连续中出在线观看| 神马久久久久久久久久久久| 日韩9999| 九九九九97| 色香综合天天影视综合 | 久久亚洲影院一区二区| 中文字幕在线观看二区三区| 日韩99精品视频综合区| 自拍视频一区在线观看| 极品尤物自安慰| 午夜.DJ高清在线观看免费7| 黄色AAAAA欧美| 欧美日韩香蕉| 久久东京国产精品视频| 色色综合网站| 国产精品亚洲四五区在线观看| 99操| 97久久超碰日韩精品| 2020久久免费视频| 欧美A片中文字幕| 亚洲乱码尤物193YW| 九九碰九九爱97超碰| 亚洲有码 欧美精品| 91麻豆天美国产欧美| 大香蕉一人在线| 干美女人妻| 亚洲动态色图| 日韩久久.一级黄色片| 国产尹人在线视频免费| 超碰 另类 欧美| 亚洲欧美天| 久操视频在线观看| 操逼操网| 韩国一区二区精品亚洲| 搞中出视频在线观看| 亚洲熟女综合网| 中文人妻av高清一区| 亚洲一区二区三区四区视频| 欧美有码激情视频一区二区三区| 狠狠躁日日躁夜夜躁A| 伊人久久亚洲色欲综合网站| 中文字幕一区二区视频在线观看| a v网站在线播放| 熟女精品一区二区三区| 色在线69堂| 高颜值美女口爆高潮浪叫| a片自拍直播视频| 亚洲另类电影| 欧美亚洲第1页| 青青草五月份天| 在线播放成人高清免费视频 | 嗯啊啊啊轻点视频| chaopen97久久| 91P0RNY大屁股人妻| 亚洲色图大香| 淫纸中9区| 人人贴人人摸| 亚洲一二三四区机械| 婷婷15月天青娱乐| 精品福利| 日本熟妇一区二区三区| 色天堂在线观看| 亚洲无线观看久久| 国产一进一出视频网站| 一区,二区,三区网站| 91欧美www| 国产女人操逼视频| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 日本在线不卡123| 欧美色91| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 99啪啪视频| 中文字幕视频二区| 欧美三级中文字幕hd| 啊啊啊不要啊啊受不了了视频在线| 香蕉欧美| 日欧操屄视频| 天综合网欧美| 亚洲成a人在线观看久| 秋霞男人网| 国产辣妈在线视频福利| 欧美九九99久久精品| 一区二区影视| 日韩偷拍色图| 97超碰大| 婷婷伊人网| 久久久久久久久久久久色网| 国产第25页在线观看| 操九九九九九九| 国产精品国产精品国产| 骚逼高潮久久精品| 超碰在线一区二区| 看日韩美女二区三区免费操逼视频| 欧美在线天堂| 高清不卡国产| 国产精品高潮久久久无码| 日本不卡三级网在线播放| 欧美草草高清日韩视频| 97摸视频| 精产品久久| 3571色综合一区二区二区| 欧美黄业| 日韩99神马视频片| 国产一区二区免费福利片| 最新精品久久蜜桃| 国产成久久综合片| 亚洲熟久久| 国内三级自拍小视频在线观看| 国产吹潮女在线观看| 97福利视频| 亚洲日韩人妻中文字幕一区| 中文字幕片| 日韩人妻 中文字幕| 中文字幕人妻丝袜乱一区三区| www99热| 97精品在线视频| 亚洲天天艹| 天天做日日做| 天天影视之亚洲综合网| 五月婷婷久久综合| 亚洲婷婷丁香在线| 国产污视频麻豆传媒一区二区| 天天干天天燥| 国产激情在线| 九月婷婷| 免费观看成人www精品视频| 久久久精品中文字幕麻豆| 影音先锋中文字幕日本好一区二区| 91狠狠狠| 神马午夜久久久| 在线可观看的黄色网址| 99热精品在线观看| 国产污视频麻豆传媒一区二区| 欧美另类精品xxxx| 丝袜狂射91| 亚洲av综合色区图片亚洲| 91网站18+| 欧美日韩丝袜 | 国产大学生口爆吞精合集| 色香天天| 亚洲永久AV无码精品秋霞| 人人爱人人操人人性| 成年人黄色视频免费| 亚州色图狠狠干| 日本精品第一视频在'| 日韩一级性爱无码| 日本免费一区二区不卡| WWW4虎| 亚洲成人久久一区二区| 九九草| 少妇人妻在线| 爱欲AV| 色爱综合网| 九色在线熟女国产黑人| 桃花色综合影院| 97在线视频观看免费| 亚码人妻| 久久精品一区| 日韩午夜啪啪视频| 一区二区免费电影久久| 99re99| 91老熟女91老女人| 超碰在线974| 丝袜熟女2P| 高清国产av无码| 欧亚性爱啪啪| 无遮挡又黄又刺激的视频| 超碰97人妻自拍| 中文字幕欧洲有码| 久久精品99久久久久久| 97 亚洲 日韩 欧美 在线| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 死我十八禁| 久久超碰98| 嗯嗯嗯不要不要免费视频| 精品国产丝袜一区二区三区乱码| 九九九精品| 日逼97| 免看60秒涩涩视频| 无码人妻系列少妇| 欧美国产操逼| 亚洲骚女一区二区三区| 大香蕉碰碰| 欧美制服另类丝袜| 97婷婷色| 亚洲精品日韩国产欧美| 成视频在线观看免费看| 国产精品永久免费10000| 久操操AV电影| 波多野结衣AV无码一区| 91社区伊人| 亚洲中文字幕熟女| 黄色免费网|