色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

全棧類(lèi)型安全新范式:用T3 Stack與tRPC告別前后端聯(lián)調(diào)之痛

全棧類(lèi)型安全新范式:用T3 Stack與tRPC告別前后端聯(lián)調(diào)之痛 以前搭全棧項(xiàng)目最讓我頭疼的從來(lái)不是功能復(fù)雜度而是前后端之間那層反復(fù)扯皮的類(lèi)型定義。后端改了字段名前端編譯直接一片紅更別提寫(xiě)一整套 API 封裝、手搓類(lèi)型聲明、再對(duì)著文檔排查接口字段的日常。后來(lái)接觸到 t3code 這套基于 T3 Stack 的腳手架工作流我最大的感受是它不是在幫你寫(xiě)代碼而是在重構(gòu)你組織全棧代碼的方式——把“前后端各寫(xiě)一套”變成“從一個(gè)類(lèi)型源頭自動(dòng)派生出整個(gè)調(diào)用鏈路”。這篇文章我就用實(shí)際經(jīng)歷聊聊t3code 到底解決了我哪些真實(shí)痛點(diǎn)里面的技術(shù)選型是怎么協(xié)作的以及從初始化到部署我用它做完兩個(gè)項(xiàng)目后沉淀下來(lái)的經(jīng)驗(yàn)和幾個(gè)躲不開(kāi)的坑。1. 為什么我盯上了 t3code從手寫(xiě)后端到全棧類(lèi)型安全的轉(zhuǎn)變1.1 全棧項(xiàng)目最消耗精力的是“共識(shí)維護(hù)”一提到全棧項(xiàng)目很多人第一反應(yīng)是“技術(shù)棧多”“要學(xué)的東西雜”。但我真正做了幾個(gè)商用規(guī)模的 Web 應(yīng)用之后發(fā)現(xiàn)技術(shù)棧復(fù)雜只是入門(mén)門(mén)檻真正的隱性成本在于前后端對(duì)數(shù)據(jù)結(jié)構(gòu)的共識(shí)怎么維護(hù)。傳統(tǒng)方案里前端通常通過(guò) REST API 和 Vue/React 頁(yè)面打交道我需要維護(hù)一份 API 文檔或者用 OpenAPI/Swagger 描述接口后端改了 User 模型的字段前端必須同步修改 interface。項(xiàng)目一大了這個(gè)同步過(guò)程就會(huì)出現(xiàn)三類(lèi)問(wèn)題改了后端字段但前端沒(méi)跟上線(xiàn)上頁(yè)面白屏或者取到 undefined接口文檔更新不及時(shí)前端按舊文檔聯(lián)調(diào)浪費(fèi)半天時(shí)間某個(gè)字段從 string 變成 number類(lèi)型沒(méi)有編譯期報(bào)錯(cuò)導(dǎo)致運(yùn)行期才暴露異常。t3code 的出現(xiàn)有意思在它換了個(gè)思路與其費(fèi)力維護(hù)前后端的類(lèi)型共識(shí)不如讓后端類(lèi)型直接生成前端調(diào)用代碼的類(lèi)型簽名。也就是說(shuō)前端真正調(diào)用的數(shù)據(jù)是從后端那個(gè)唯一的類(lèi)型源頭“長(zhǎng)”出來(lái)的。1.2 t3code 到底是什么雖然現(xiàn)在網(wǎng)上也有各種以 t3 開(kāi)頭命名的項(xiàng)目但我在實(shí)際開(kāi)發(fā)中使用的 t3code本質(zhì)上是一套面向全棧 TypeScript 項(xiàng)目的腳手架和模塊初始化工具。它圍繞 T3 StackNext.js TypeScript tRPC Prisma Tailwind CSS把項(xiàng)目的基礎(chǔ)骨架、數(shù)據(jù)模型、認(rèn)證體系、API 路由和前后端調(diào)用關(guān)系一次性裝配起來(lái)我拿到手就能直接把精力放到業(yè)務(wù)邏輯上。我自己的體會(huì)是t3code 最適合這幾類(lèi)人獨(dú)立開(kāi)發(fā)者想用一份 TypeScript 代碼同時(shí)打通數(shù)據(jù)庫(kù)、后端邏輯和前端頁(yè)面小型全棧團(tuán)隊(duì)希望減少前后端聯(lián)調(diào)時(shí)的來(lái)回溝通成本正在搭建 MVP 的創(chuàng)業(yè)項(xiàng)目需要快速迭代數(shù)據(jù)結(jié)構(gòu)且不想被接口設(shè)計(jì)和類(lèi)型維護(hù)拖慢速度。如果你平時(shí)只是寫(xiě)純前端或者純后端t3code 的收益不大但如果你做的是那種“一個(gè)人要包圓前后端數(shù)據(jù)庫(kù)”的活它真的能幫你省下很多重復(fù)勞動(dòng)。1.3 它和“低代碼平臺(tái)”完全不是一回事第一次聽(tīng)到這類(lèi)工具時(shí)我也擔(dān)心過(guò)這會(huì)不會(huì)又是一套低代碼平臺(tái)把我綁定到某個(gè)私有協(xié)議上以后想遷移都沒(méi)法遷移實(shí)際研究過(guò)后我可以明確說(shuō)t3code 不搞任何私有的運(yùn)行時(shí)協(xié)議它輸出的就是一個(gè)標(biāo)準(zhǔn)的 Next.js 項(xiàng)目里面有正常的 Prisma schema、tRPC router、頁(yè)面組件和 API 流程。換句話(huà)說(shuō)它幫我完成的是“裝配和初始化”不是“托管和綁架”。項(xiàng)目一旦生成源碼都在我手里所有邏輯都由我自己控制該寫(xiě)測(cè)試寫(xiě)測(cè)試、該做性能優(yōu)化做性能優(yōu)化沒(méi)有任何黑盒。1.4 從“寫(xiě)最少代碼”到“改最少代碼”我用傳統(tǒng)方式做一個(gè)帶用戶(hù)系統(tǒng)的內(nèi)容管理后臺(tái)大概要經(jīng)歷設(shè)計(jì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)、寫(xiě)后端 CRUD 接口、逐一手寫(xiě)路由和校驗(yàn)、生成前端 API 封裝、在頁(yè)面上手動(dòng)消費(fèi)數(shù)據(jù)、遇到類(lèi)型不一致再回頭改。整個(gè)流程中真正屬于業(yè)務(wù)邏輯的代碼可能只占 40%剩下 60% 都在做“翻譯”和“適配”工作。t3code 把我從這種狀態(tài)里拉出來(lái)之后我明顯感覺(jué)到工作模式變了。從前是“寫(xiě)最少代碼完成任務(wù)”現(xiàn)在更像是“盡量少改代碼地演化業(yè)務(wù)”。數(shù)據(jù)庫(kù)加個(gè)字段Prisma 遷移一執(zhí)行類(lèi)型自動(dòng)更新后端在 tRPC 的 router 里加一個(gè) query前端立刻能在編輯器里拿到帶類(lèi)型提示的調(diào)用方法甚至參數(shù)結(jié)構(gòu)都是自動(dòng)推導(dǎo)的。這種“一處修改處處類(lèi)型安全”的體驗(yàn)用一次就回不去。2. t3code 的底層構(gòu)成T3 技術(shù)棧四件套是怎么協(xié)作的2.1 四個(gè)核心依賴(lài)各管哪一段t3code 生成的骨架里最核心的是四個(gè)依賴(lài)。很多人把它們當(dāng)成單純的技術(shù)組合但我在實(shí)際使用中更關(guān)注它們各自承擔(dān)的角色以及彼此之間的接縫在哪里。一是Next.js負(fù)責(zé)應(yīng)用框架層。它同時(shí)提供 React 頁(yè)面渲染、API Route、服務(wù)端渲染和靜態(tài)生成能力。在 T3 Stack 的語(yǔ)境里Next.js 不僅是一個(gè)頁(yè)面框架更是把前后端放在同一工程里的容器。二是TypeScript整個(gè)項(xiàng)目的類(lèi)型系統(tǒng)基底。如果沒(méi)有 TypeScript后面講的“端到端類(lèi)型安全”完全不成立所以我在 t3code 里很少看到 .js 文件所有業(yè)務(wù)代碼和配置文件都以 .ts 或 .tsx 為主。三是tRPC負(fù)責(zé)前后端調(diào)用層的協(xié)議。它不需要我們手寫(xiě) REST 路由也不需要生成 GraphQL schema而是直接通過(guò)函數(shù)調(diào)用的方式在前端調(diào)用后端方法并且自動(dòng)獲得完整的類(lèi)型推導(dǎo)。它的實(shí)現(xiàn)原理不復(fù)雜就是依賴(lài) TypeScript 的泛型把 router 類(lèi)型直接傳遞到前端 hooks 上。四是Prisma負(fù)責(zé)數(shù)據(jù)模型和數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)。它用一個(gè) schema 文件定義模型然后生成類(lèi)型安全的客戶(hù)端。在 t3code 的項(xiàng)目里Prisma 的 model 是整個(gè)應(yīng)用數(shù)據(jù)結(jié)構(gòu)的直接描述者。至于 Tailwind CSS我一般把它看成錦上添花的樣式方案它解決的是 UI 層開(kāi)發(fā)效率的問(wèn)題不影響類(lèi)型閉環(huán)。2.2 類(lèi)型閉環(huán)是怎么走通的要真正理解 t3code 的價(jià)值我建議你先搞清楚這條類(lèi)型閉環(huán)的路徑Prisma schema 定義模型 ↓ Prisma Client 生成類(lèi)型 ↓ tRPC router 里用這些類(lèi)型處理輸入輸出 ↓ 前端通過(guò) tRPC hooks 調(diào)用 router ↓ 編輯器根據(jù)推導(dǎo)自動(dòng)提示類(lèi)型和參數(shù)我把這條鏈路拆開(kāi)講一下。假設(shè)我在prisma/schema.prisma里定義一個(gè)Todo模型model Todo { id String id default(cuid()) title String completed Boolean default(false) createdAt DateTime default(now()) }執(zhí)行npx prisma migrate dev之后Prisma 客戶(hù)端會(huì)生成對(duì)應(yīng)的Todo類(lèi)型。接著在 tRPC router 中加入一個(gè)返回所有待辦事項(xiàng)的查詢(xún)import { router, publicProcedure } from ../trpc; import { prisma } from ../db; export const todoRouter router({ getAll: publicProcedure.query(() { return prisma.todo.findMany(); }), });前端頁(yè)面里我不需要重新定義任何 interface直接調(diào)用import { api } from ~/utils/api; export default function TodoList() { const { data: todos } api.todo.getAll.useQuery(); return ( ul {todos?.map((todo) ( li key{todo.id}{todo.title}/li ))} /ul ); }這里你會(huì)發(fā)現(xiàn)一個(gè)有意思的地方todos的類(lèi)型是由后端 Prisma 查詢(xún)結(jié)果推導(dǎo)出來(lái)的而不是我手動(dòng)聲明的。哪怕哪天我往模型里加了字段前端代碼里todo.someNewField也馬上會(huì)有類(lèi)型提示如果我刪了某個(gè)字段前端用到它的地方會(huì)直接編譯報(bào)錯(cuò)。這條閉環(huán)的意義在于它把“類(lèi)型正確性”從一種約定變成了一種編譯期保證。我不用再擔(dān)心“前端不知道后端字段改過(guò)”這種事因?yàn)轭?lèi)型系統(tǒng)會(huì)第一時(shí)間攔住我。2.3 和 REST / GraphQL 方案的直觀對(duì)比我知道有人會(huì)問(wèn)我用 REST 加 OpenAPI 也能生成類(lèi)型用 GraphQL 也能自動(dòng)推導(dǎo)為什么非要用 t3code 這一套我做了一張粗淺的對(duì)照表完全基于我的日常體感方案類(lèi)型安全性聯(lián)調(diào)成本學(xué)習(xí)曲線(xiàn)適用場(chǎng)景REST 手寫(xiě)類(lèi)型靠自覺(jué)高低傳統(tǒng)前后端分離團(tuán)隊(duì)REST OpenAPI 生成類(lèi)型中中中接口規(guī)范嚴(yán)格的團(tuán)隊(duì)GraphQL Codegen高低高需要靈活查詢(xún)的大前端團(tuán)隊(duì)t3codeT3 Stack高很低中全棧 TypeScript 項(xiàng)目、獨(dú)立開(kāi)發(fā)者GraphQL 雖然查詢(xún)能力很靈活但為了拿到這種靈活性我得維護(hù) schema、寫(xiě) resolver、配 codegen還要考慮客戶(hù)端緩存策略對(duì)一個(gè)人干全棧來(lái)說(shuō)其實(shí)不輕。t3code 里 tRPC 的模型更“純函數(shù)式”前端調(diào)用后端的體驗(yàn)幾乎等于調(diào)用本地函數(shù)而且不用額外跑代碼生成器類(lèi)型推導(dǎo)是實(shí)時(shí)的。當(dāng)然 tRPC 也有自己的適用范圍——如果前后端完全分離且由不同團(tuán)隊(duì)維護(hù)或者需要對(duì)外提供公共 APItRPC 反而不合適。它更多是內(nèi)部后端和前端之間的一種高效溝通方式。選型永遠(yuǎn)要基于項(xiàng)目形態(tài)t3code 適合的是“一個(gè)代碼庫(kù)搞定全棧”的場(chǎng)景。3. 跑通第一個(gè) t3code 項(xiàng)目從初始化到 CRUD 的完整鏈路3.1 初始化項(xiàng)目時(shí)該選哪些模塊t3code 的起點(diǎn)是create-t3-app這個(gè)命令。我在終端執(zhí)行npx create-t3-applatest my-app交互式命令行會(huì)問(wèn)你項(xiàng)目名稱(chēng)、要不要啟用 NextAuth.js、Prisma、Tailwind CSS、tRPC 這些模塊以及使用 npm 還是 pnpm 等包管理器。我第一次跑的時(shí)候很老實(shí)把能勾選的全都勾上了。后來(lái)實(shí)際開(kāi)發(fā)才意識(shí)到不必為了齊全而全選要根據(jù)業(yè)務(wù)預(yù)判來(lái)選。我現(xiàn)在的選擇習(xí)慣是一定會(huì)選 TypeScript、Prisma、tRPC、Next.js這是核心需要用戶(hù)登錄時(shí)才會(huì)勾選 NextAuth.js如果只是內(nèi)部系統(tǒng)且不涉及用戶(hù)體系不選它反而省事Tailwind CSS 純看項(xiàng)目 UI 需求如果團(tuán)隊(duì)已經(jīng)定了組件庫(kù)或者用其他 CSS 方案就不必讓它進(jìn)入代碼庫(kù)部署平臺(tái)選擇 Vercel 時(shí)腳手架會(huì)順便把本地開(kāi)發(fā)和生產(chǎn)環(huán)境的配置處理好選 Docker 自托管的話(huà)后面要自己留意數(shù)據(jù)庫(kù)連接。初始化完成后項(xiàng)目的目錄結(jié)構(gòu)大概是這樣的my-app/ ├── prisma/ │ └── schema.prisma ├── src/ │ ├── pages/ │ ├── server/ │ │ ├── api/ │ │ │ └── trpc/ │ │ ├── auth.ts │ │ └── db.ts │ └── utils/ │ └── api.ts ├── .env └── package.json這里src/server/db.ts是 Prisma Client 單例src/utils/api.ts是前端 tRPC hooks 的封裝入口src/server/api/trpc.ts定義了 router 創(chuàng)建和 procedure 的基礎(chǔ)。我建議拿到項(xiàng)目后先花十分鐘把這三個(gè)文件讀一遍理解它們之間的引用關(guān)系后面寫(xiě)業(yè)務(wù)會(huì)順很多。3.2 從 schema 到數(shù)據(jù)庫(kù)遷移我拿一個(gè)最簡(jiǎn)單的博客系統(tǒng)舉例。先在prisma/schema.prisma里定義 Post 和 User 模型model User { id String id default(cuid()) email String unique name String? posts Post[] } model Post { id String id default(cuid()) title String content String published Boolean default(false) authorId String author User relation(fields: [authorId], references: [id]) createdAt DateTime default(now()) updatedAt DateTime updatedAt }然后執(zhí)行npx prisma migrate dev --name init這個(gè)命令會(huì)做兩件事在數(shù)據(jù)庫(kù)里創(chuàng)建對(duì)應(yīng)的表同時(shí)生成最新版的 Prisma Client。我提醒一句本地?cái)?shù)據(jù)庫(kù)連接串記得先寫(xiě)進(jìn).env很多人第一次跑 migrate 失敗都是因?yàn)榄h(huán)境變量沒(méi)配置。3.3 編寫(xiě) tRPC router 并注冊(cè)接著我在src/server/api/root.ts或其他你自定義的 router 聚合文件里添加一個(gè) postRouterimport { z } from zod; import { createTRPCRouter, publicProcedure } from ~/server/api/trpc; import { prisma } from ~/server/db; export const postRouter createTRPCRouter({ list: publicProcedure.query(() { return prisma.post.findMany({ orderBy: { createdAt: desc }, }); }), byId: publicProcedure .input(z.object({ id: z.string() })) .query(({ input }) { return prisma.post.findUnique({ where: { id: input.id }, include: { author: true }, }); }), create: publicProcedure .input( z.object({ title: z.string().min(1), content: z.string().min(1), authorEmail: z.string().email(), }) ) .mutation(async ({ input }) { const user await prisma.user.upsert({ where: { email: input.authorEmail }, update: {}, create: { email: input.authorEmail, name: input.authorEmail.split()[0] }, }); return prisma.post.create({ data: { title: input.title, content: input.content, authorId: user.id, }, }); }), });這里你可能注意到我用了 zod 做輸入校驗(yàn)。tRPC 原生建議用 zod 作為 schema 校驗(yàn)庫(kù)它和 tRPC 的 input 結(jié)合非常好。輸入校驗(yàn)不僅保證了后端接口的參數(shù)安全還讓前端調(diào)用時(shí)能拿到準(zhǔn)確的入?yún)㈩?lèi)型提示算是類(lèi)型閉環(huán)里的重要一環(huán)。寫(xiě)完之后必須把 postRouter 注冊(cè)到根 router 上否則前端根本訪(fǎng)問(wèn)不到import { createTRPCRouter } from ~/server/api/trpc; import { postRouter } from ./post; export const appRouter createTRPCRouter({ post: postRouter, }); export type AppRouter typeof appRouter;3.4 前端頁(yè)面消費(fèi) API前端頁(yè)面直接對(duì)應(yīng)src/pages/index.tsx我用一個(gè)列表頁(yè)展示所有文章import { api } from ~/utils/api; import Link from next/link; export default function Home() { const { data: posts, isLoading } api.post.list.useQuery(); if (isLoading) return divLoading.../div; return ( div {posts?.map((post) ( Link key{post.id} href{/post/${post.id}} h2{post.title}/h2 p{post.content}/p /Link ))} /div ); }刷新頁(yè)面后數(shù)據(jù)就能正常渲染。我沒(méi)寫(xiě)任何額外的 axios 封裝沒(méi)有手動(dòng)拼 URL沒(méi)有定義 response interface甚至連useQuery的泛型都不用傳類(lèi)型全是從后端推導(dǎo)過(guò)來(lái)的。這個(gè)“少寫(xiě)代碼但類(lèi)型更強(qiáng)”的體驗(yàn)就是我前面說(shuō)的核心價(jià)值。如果想做創(chuàng)建文章的交互也很直接const createPost api.post.create.useMutation({ onSuccess: () { utils.post.list.invalidate(); }, }); createPost.mutate({ title: 新文章, content: 正文內(nèi)容, authorEmail: testexample.com, });用invalidate讓列表重新請(qǐng)求一次數(shù)據(jù)自動(dòng)刷新前端邏輯保持得非常干凈。3.5 雙向綁定與 SSR 模式的一點(diǎn)提醒t3code 默認(rèn)會(huì)用 Next.js 的 SSR/SSG 能力來(lái)預(yù)取 tRPC 數(shù)據(jù)。也就是說(shuō)服務(wù)端會(huì)先主動(dòng)調(diào)用 tRPC 方法把數(shù)據(jù)塞進(jìn)頁(yè)面 props 里瀏覽器端再用同一個(gè) hook 做水合。這套機(jī)制讓首屏加載很快也不會(huì)有白屏閃爍。但這里的隱性前提是服務(wù)端調(diào)用和客戶(hù)端調(diào)用共享同一套 tRPC 邏輯。如果你在 procedure 里訪(fǎng)問(wèn)了只存在于瀏覽器端的window或者localStorage服務(wù)端執(zhí)行時(shí)就會(huì)直接報(bào)錯(cuò)。我建議你從第一天開(kāi)始就養(yǎng)成習(xí)慣把涉及瀏覽器環(huán)境變量的邏輯放到獨(dú)立的工具函數(shù)里并且用typeof window ! undefined判斷環(huán)境不然部署到 Vercel 上很容易踩 SSR 相關(guān)的坑。4. 接入認(rèn)證和數(shù)據(jù)庫(kù)之后我踩過(guò)的那些坑4.1 NextAuth.js 和 Prisma 的適配器問(wèn)題t3code 腳手架雖然默認(rèn)集成了 NextAuth.js但真正接入登錄功能時(shí)我遇到的第一坑是適配器adapter的配置。NextAuth 要跟 Prisma 配合必須用next-auth/prisma-adapter并且在src/server/auth.ts里正確傳參。如果適配器沒(méi)配好最常見(jiàn)的報(bào)錯(cuò)是調(diào)用登錄接口時(shí)數(shù)據(jù)庫(kù)無(wú)法寫(xiě)入 session 記錄。我當(dāng)時(shí)的排查過(guò)程是這樣的先看服務(wù)端日志確認(rèn)是 session 表寫(xiě)入失敗再看auth.ts里的配置發(fā)現(xiàn)adapter沒(méi)有被傳入。修正后的核心代碼大致是import NextAuth from next-auth; import CredentialsProvider from next-auth/providers/credentials; import { PrismaAdapter } from next-auth/prisma-adapter; import { prisma } from ~/server/db; export const authOptions { adapter: PrismaAdapter(prisma), providers: [ CredentialsProvider({ name: credentials, credentials: { email: { label: Email, type: email }, password: { label: Password, type: password }, }, async authorize(credentials) { // 這里是校驗(yàn)邏輯 }, }), ], session: { strategy: jwt, }, secret: process.env.NEXTAUTH_SECRET, };接下來(lái)還有一個(gè)容易忽視的點(diǎn)如果用默認(rèn)的strategy: jwt就不太依賴(lài)數(shù)據(jù)庫(kù)里的 session 記錄這時(shí) PrismaAdapter 需要同步維護(hù)的其實(shí)是 User、Account、Session 等模型。我在 schema 里如果漏了這些模型登錄時(shí)也會(huì)因?yàn)閿?shù)據(jù)庫(kù)缺表而出錯(cuò)。解法很簡(jiǎn)單把官網(wǎng)文檔里提供的 NextAuth 相關(guān)模型復(fù)制到schema.prisma再跑一次遷移問(wèn)題基本就解決了。4.2 環(huán)境變量缺失導(dǎo)致的“幽靈報(bào)錯(cuò)”t3code 初始化后項(xiàng)目根目錄會(huì)生成一個(gè).env文件里面通常會(huì)預(yù)留DATABASE_URL、NEXTAUTH_SECRET、NEXTAUTH_URL這些變量。我最開(kāi)始忽略了一點(diǎn)本地開(kāi)發(fā)和生產(chǎn)環(huán)境需要不同取值。比如本地.env里DATABASE_URL指向localhost的 PostgreSQL生產(chǎn)環(huán)境在 Vercel 后臺(tái)配的卻是線(xiàn)上數(shù)據(jù)庫(kù)地址。如果你在本地跑prisma migrate deploy時(shí)用錯(cuò)了環(huán)境變量有可能把遷移應(yīng)用到線(xiàn)上或者本地庫(kù)上那將是災(zāi)難。我的建議是給不同環(huán)境配獨(dú)立的.env文件如.env.local、.env.production并且永遠(yuǎn)只在項(xiàng)目目錄里執(zhí)行數(shù)據(jù)庫(kù)遷移命令。雖然這屬于老生常談但團(tuán)隊(duì)協(xié)作時(shí)真的有人會(huì)把線(xiàn)上連接串寫(xiě)到公共配置里導(dǎo)致泄露。4.3 protectedProcedure 的正確姿勢(shì)t3code 腳手架通常會(huì)提供一個(gè)createTRPCContext函數(shù)把當(dāng)前請(qǐng)求的 session 塞進(jìn) context。我后來(lái)在寫(xiě)需要登錄才能調(diào)用的接口時(shí)沒(méi)用publicProcedure而是基于 context 判斷后再拋錯(cuò)export const protectedProcedure t.procedure.use(({ ctx, next }) { if (!ctx.session || !ctx.session.user) { throw new Error(Unauthorized); } return next({ ctx: { session: { ...ctx.session, user: ctx.session.user }, }, }); });這個(gè)中間件做完之后我想獲取當(dāng)前用戶(hù)時(shí)直接讀ctx.session.user就行。前端調(diào)用時(shí)配合useSession()判斷登錄態(tài)體驗(yàn)整體很順。我踩過(guò)的坑是如果 session 類(lèi)型沒(méi)和數(shù)據(jù)庫(kù)的 User 模型對(duì)齊前端拿到的session.user.id可能被推導(dǎo)成string | undefined導(dǎo)致一些危險(xiǎn)的隱性 bug——比如在創(chuàng)建 Post 時(shí)把 undefined 寫(xiě)進(jìn) authorId。所以建議大家拿到 session 后先做一次顯式判空再往下走。4.4 CRUD 校驗(yàn)放在服務(wù)端不要在客戶(hù)端省事tRPC 的好處是輸入校驗(yàn)天然寫(xiě)在服務(wù)端 procedure 里但我見(jiàn)過(guò)有些同事圖方便只在前端表單里做了校驗(yàn)后端換個(gè)請(qǐng)求工具直接把非法字段傳進(jìn)去。說(shuō)實(shí)話(huà)因?yàn)?tRPC 的類(lèi)型推導(dǎo)太舒服了人很容易產(chǎn)生“前端類(lèi)型安全等于接口安全”的錯(cuò)覺(jué)。實(shí)際上類(lèi)型安全不等于安全。zod 校驗(yàn)?zāi)菍臃谰€(xiàn)必須留在服務(wù)端。我在 t3code 項(xiàng)目里的習(xí)慣是所有涉及寫(xiě)入的操作一律寫(xiě) zod input schema并且把z.string().min(1)這類(lèi)邊界條件寫(xiě)全。這樣即使有人繞過(guò)前端調(diào)后端數(shù)據(jù)也會(huì)被攔截在這層不會(huì)污染數(shù)據(jù)庫(kù)。5. 部署與優(yōu)化從開(kāi)發(fā)機(jī)到生產(chǎn)環(huán)境的最后一公里5.1 部署到 Vercel 前要處理的事情t3code 生成的 Next.js 項(xiàng)目直接對(duì)接 Vercel 很方便。我第一次部署時(shí)只把 GitHub 倉(cāng)庫(kù)連到 Vercel然后添加環(huán)境變量就完事了。但后來(lái)發(fā)現(xiàn)有幾個(gè)細(xì)節(jié)要提前準(zhǔn)備好否則很容易在線(xiàn)上出現(xiàn)詭異問(wèn)題。第一Prisma Client 的生成時(shí)機(jī)。Vercel 構(gòu)建時(shí)會(huì)跑prisma generate但只在構(gòu)建環(huán)境里生成如果你本地的 Prisma Client 版本和線(xiàn)上不一致有可能導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。我一般會(huì)在package.json的postinstall腳本里加上postinstall: prisma generate這樣每次裝完依賴(lài)都會(huì)從 schema 重新生成客戶(hù)端不會(huì)出現(xiàn)版本漂移。第二數(shù)據(jù)庫(kù)遷移怎么執(zhí)行。Vercel 的構(gòu)建環(huán)境不是跑遷移的好地方我推薦用 GitHub Actions 或一個(gè)獨(dú)立的環(huán)境去跑prisma migrate deploy。也就是說(shuō)代碼部署和數(shù)據(jù)庫(kù)遷移分成兩個(gè)流程代碼先發(fā)布遷移單獨(dú)控制節(jié)奏。這樣做的好處是一旦遷移失敗不會(huì)把應(yīng)用構(gòu)建直接拖死。第三NEXTAUTH_URL 必須和生產(chǎn)域名一致。NextAuth 在做回調(diào)時(shí)會(huì)校驗(yàn)這個(gè)變量我見(jiàn)過(guò)不少案例是由于把它留成http://localhost:3000導(dǎo)致線(xiàn)上登錄后跳轉(zhuǎn)回本地地址表現(xiàn)為“登錄成功但立刻又跳回登錄頁(yè)”。這個(gè)坑排查起來(lái)其實(shí)不難但確實(shí)很耗時(shí)間。5.2 Serverless 環(huán)境下的數(shù)據(jù)庫(kù)連接池Vercel 的 Serverless 函數(shù)是“按請(qǐng)求拉起、跑完即回收”的模型。如果我在每個(gè)函數(shù)實(shí)例里都創(chuàng)建一個(gè)新的 Prisma Client 連接很快會(huì)把數(shù)據(jù)庫(kù)連接數(shù)打滿(mǎn)尤其在使用 PostgreSQL 時(shí)特別明顯。t3code 生成的src/server/db.ts里幫我做了一個(gè)全局單例import { PrismaClient } from prisma/client; const globalForPrisma globalThis as unknown as { prisma: PrismaClient }; export const prisma globalForPrisma.prisma ?? new PrismaClient({ log: process.env.NODE_ENV development ? [query, error, warn] : [error], }); if (process.env.NODE_ENV ! production) globalForPrisma.prisma prisma;這個(gè)模式的核心意圖是在本地開(kāi)發(fā)時(shí)熱更新會(huì)導(dǎo)致模塊反復(fù)加載如果不做全局緩存每次刷新都會(huì)創(chuàng)建新的 Prisma 實(shí)例部署到 Serverless 環(huán)境后同一實(shí)例內(nèi)部復(fù)用連接。我在生產(chǎn)環(huán)境跑了一段時(shí)間后數(shù)據(jù)庫(kù)連接數(shù)一直保持在一個(gè)健康水位。如果項(xiàng)目流量上來(lái)還可以在數(shù)據(jù)庫(kù)連接串里加上連接池參數(shù)比如 Prisma 官方建議的?pgbouncertrue配合 PgBouncer 使用。要不要這樣做取決于實(shí)際并發(fā)量我自己的經(jīng)驗(yàn)是中小型應(yīng)用把單例模式做好就夠用了等連接數(shù)告警了再上連接池也不遲。5.3 首屏性能調(diào)優(yōu)的幾個(gè)實(shí)際操作雖然 t3code 的默認(rèn)體驗(yàn)已經(jīng)不錯(cuò)但生產(chǎn)環(huán)境對(duì)性能的要求更高。我做過(guò)的幾個(gè)有效優(yōu)化排在這里按需取數(shù)據(jù)Prisma 的select和include要按頁(yè)面需要來(lái)避免一次findMany把幾十個(gè)字段全撈出來(lái)。Serverless 函數(shù)的執(zhí)行時(shí)間就是錢(qián)數(shù)據(jù)量小一點(diǎn)響應(yīng)自然快。開(kāi)啟 Next.js 的緩存策略對(duì)于不常變的數(shù)據(jù)可以用staleTime控制 tRPC 查詢(xún)的緩存時(shí)長(zhǎng)。例如文章列表五分鐘內(nèi)不重新請(qǐng)求api.post.list.useQuery(undefined, { staleTime: 5 * 60 * 1000, });嚴(yán)格區(qū)分動(dòng)態(tài)和靜態(tài)頁(yè)面博客首頁(yè)、關(guān)于頁(yè)這種內(nèi)容基本不變的盡量用靜態(tài)生成用戶(hù)中心這種強(qiáng)個(gè)性化的頁(yè)面再走 SSR 或客戶(hù)端渲染。能靜態(tài)就不動(dòng)態(tài)能讓邊緣緩存接住就讓它接住。5.4 日志、監(jiān)控和錯(cuò)誤上報(bào)做全棧項(xiàng)目時(shí)日志是最容易被忽略但又最重要的一環(huán)。t3code 腳手架只給了基礎(chǔ)結(jié)構(gòu)不包含任何監(jiān)控。我后來(lái)接了一款錯(cuò)誤監(jiān)控工具把 tRPC 的 errors 統(tǒng)一上報(bào)因?yàn)?tRPC 的錯(cuò)誤信息非常規(guī)范有code、message、path這些字段非常適合直接對(duì)接到監(jiān)控平臺(tái)上。我在src/server/api/trpc.ts的 errorFormatter 里做了一次全局?jǐn)r截export const t initTRPC.contexttypeof createTRPCContext().create({ errorFormatter({ shape, error }) { // 在這里上報(bào)錯(cuò)誤 return shape; }, });這樣線(xiàn)上如果出現(xiàn) Zod 校驗(yàn)失敗、數(shù)據(jù)庫(kù)異常、未授權(quán)訪(fǎng)問(wèn)我都能第一時(shí)間從監(jiān)控后臺(tái)看到具體是哪個(gè) procedure 出了問(wèn)題而不需要等用戶(hù)反饋。6. 回顧 t3code 這段時(shí)間的實(shí)際體驗(yàn)用 t3code 做了完整項(xiàng)目之后我有個(gè)很直接的感覺(jué)它把全棧開(kāi)發(fā)里的“隱形稅”砍掉了一大半。以前我要花很多時(shí)間維護(hù)前后端接口文檔、類(lèi)型聲明、API 封裝現(xiàn)在這些成本降到了接近零寫(xiě)業(yè)務(wù)代碼的密度變得很高。對(duì)我來(lái)說(shuō)它最大的價(jià)值不在代碼生成而在那套類(lèi)型閉環(huán)帶來(lái)的心智負(fù)擔(dān)減輕。當(dāng)然它也不是銀彈。如果你的團(tuán)隊(duì)前后端完全分離后端需要面向第三方開(kāi)放 API那 tRPC 這套“服務(wù)端和客戶(hù)端強(qiáng)綁定”的方式反而會(huì)成為負(fù)擔(dān)。另外T3 Stack 的生態(tài)相對(duì)年輕很多企業(yè)級(jí)基礎(chǔ)設(shè)施的兼容方案需要自己探索比如前面說(shuō)的連接池、多環(huán)境數(shù)據(jù)庫(kù)遷移、CI/CD 流程都需要你額外搭建。但如果你是單兵作戰(zhàn)或者小團(tuán)隊(duì)想做一個(gè)類(lèi)型安全、可快速迭代的 Web 應(yīng)用t3code 這套工作流非常值得試一下。剛開(kāi)始上手時(shí)多花一點(diǎn)時(shí)間把 Prisma schema、tRPC router、NextAuth 的關(guān)系理解透后續(xù)開(kāi)發(fā)體驗(yàn)的提升會(huì)大大超出你的預(yù)期。最后再分享一個(gè)小技巧。我用 t3code 時(shí)習(xí)慣把項(xiàng)目里所有數(shù)據(jù)庫(kù)寫(xiě)入操作收斂到mutation里并且做好輸入校驗(yàn)和結(jié)果類(lèi)型聲明。這樣一旦業(yè)務(wù)邏輯要調(diào)整改動(dòng)范圍會(huì)非常小不會(huì)在十幾個(gè)頁(yè)面里到處找散落的 set 調(diào)用。這種習(xí)慣配合 t3code 的類(lèi)型推導(dǎo)讓整個(gè)項(xiàng)目即使經(jīng)過(guò)幾個(gè)月的迭代依然保持著比較好的可維護(hù)性。如果你正準(zhǔn)備上手一個(gè)新的全棧項(xiàng)目我建議你從最小閉環(huán)開(kāi)始——先不急著一次性引入全部模塊把列表查詢(xún)和一條數(shù)據(jù)寫(xiě)入跑通感受一下“類(lèi)型自己長(zhǎng)腳走完全?!钡捏w驗(yàn)再做后續(xù)擴(kuò)展也不遲。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久人| 探花激情视频| 色色青青久久| 欧洲与亚洲欧美精品中文字幕| 久久91精品国产9丨久久分亭| 亚洲se91| 99最新日韩偷拍视频| 国产婷婷一区| 亚洲国产第一页综合视频| 国产无码精品高清| 亚洲成人一区二区精品| 69少妇一区二区| 日韩欧美日韩| 国色综合天| 神马久久啊啊| 学生妹天天看| 九九人妻| 久久在肏| 91在线免费精品视频| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 性爱动态120秒| 日本精品高清一二区一本到| 五十路六十路素人熟女| 欧美国产精品久久九九| 夜夜精品视频| 熟妇熟女一区二区三区| 欧洲欧美视频一区二区| 白丝被操91| 18禁在线视频| 久久久久久国产成人| 97欧美| 欧美姓爱综合网| 精品人妻15区| 啊啊啊在线观看| 欧美色图综合网| 蜜臀AV一区二区三区| 天天射夜夜| 国产精品熟女九九九| 亚洲一二三精品久久网| 最新精品久久蜜桃| baiduhicn.com。| 97在线青| 农村少妇久久久久久久| 国产精品96| 91精品人妻偷情| 久久 国产 无码| 人人操人人摸avav| 殴美在线AⅤ| 加勒比在线视频一区二区三区| 日韩中文字幕人妻视频| 99久久九九| 91久久久久久| 久久这里都是精品| 久久久久久十| 91精品国产91久久福利| 最近2019中文字幕国语免费版 | 东北操逼| 99re99| а√天堂资源官网在线资源| 久久久国产三级黄色片| 怡红院成人av| 美女诱惑久久| 日本高清视频xxxx| 欧美亚洲综合色| 欧美超碰96| 啊啊啊好疼| 亚洲第一页色网| 久久二| 午夜视频久久久久一区| 免费a在线播放v| 91男女啊啊啊| 大香蕉日亚洲日本亚大 | 亚洲精品影视老司机| 五月天丁香网| 亚洲在线观看| 亚洲第一精品在线视频| 夜夜国产一区| 国产传媒av天美传媒在线| 五月婷婷丁香六月丁香| 久久久久久久极品香蕉视频| 97在线免费看视频| 色综合久久88色综合久久天天| 91在线页| 后入合集| 久久激情视频| 久草综合网| 日韩三级在线观看网站| 伊人亚洲国产一成人久久精品,久久| 亚熟在线| 日本免费中文字幕在线| 男插女青青影院| 亚洲色人| 色呦呦、国产精品| 欧美色青| 97色伦欧美| 老熟妇一区二区三区| 国产精品久久久久久亚洲色欲| 尤物国产一区在线观看| 操一区| 91网站18禁| 中文字幕123| 91xingse| 国产精品熟女一区二区三区| 思思热久久成人| 黄色小说亚洲| 人人做,人人操,人人摸| 色婷婷在线视频| 亚洲欧美啪啪| 国产精品亚洲一区二区三区四区| 伊人网在线点播| h无码动漫在线观看| 亚洲情色图片区| 家庭乱伦麻豆| 成人日韩中文字幕| 亚洲影院成人| 亚洲日本男人天堂网| 99精品人妻| 天天91~综合入口| 亚洲成人在线乱码色午夜| 免费啪啪一级视频| 97中文综合| 性爱1区| 香蕉av一区二区三区| 国产精品嫩草影院午夜两性| 成人一级二级| 成人午夜无码视频| 久久99九九九九6666免费观看软件| 性做久久久久久免费观看软件| 91激情综合| 国产中文大片资源中文字幕| 呦女网站| 伊人婷婷五月天| 97视频播放| 狠狠色综合网| 国产特级毛片AAAAAA高潮流水| 97视频620| 免费精品人妻一区二区三| 精品久久久久久久久久久久| 精品九九国产无码| 蜜桃臀一区二区三区久久| 在线观看av区| 超碰97丝袜| 久久婷婷在线观看视频| 美女极品一区二区三区| 就去色综合| 国产精品情侣啪啪| 岛国大片在线观看网站入口| 国内毛片四区| 久久国产精品,久久国产| 少妇无码太爽| 亚洲欧美日韩免费电影| 亚州综合在线| 丝袜视频网国产90| 亚洲高清内射| 色五月婷婷五月天| 精品欧美А∨无码黑人大荫蒂| 久久久精| 欧美性暴力猛交XXXX| 沈阳熟女高潮对白视频| 国产高清精品一区二区三区毛片| 九色 人妻 大香蕉| 手机在线A片| 免费国产电影一区二区| 怡红院成人视频| 色香在线| 在线观看A啊啊啊| 精品一区二区三区蜜桃臀赵总| 午夜无码精品免费看性色| 国产肏逼网站| 老熟女搡BBBB搡BBBB视频| 97色网| 亚洲男人天堂网| 91性情| 欧美劲爆第一页| 超碰在线观看av不卡| 国产一区二区三区高清视频| 夜夜高潮夜夜爽夜夜爱爱一区| 中文字幕无码不卡啪啪| 中国少妇啪啪视频| 日韩一级久久毛片| 亚洲精品aa久久伊人| 亚洲 一区二区 自拍| 手机在线看片免费人成视频| 婷婷激情五月综合| 精品国产污一区二区三区| 国产60区。| 国桃视频产巨乳精品一区二区在线| 在线小说视频一区| 免费一二区| 久久久亚洲高清不打码| 欧美黄页在线| 欧美96交| 一级片在线观看高清无码| 十八禁视频网站| 色色九区| 能在线播放的国产三级| 99综合网| 人妻美腿丝袜日韩| 久久亚州精品成人Av无| 日本三级韩三级99久久| 肉丝无码中文高清| 国产成人99久久亚洲综合| 超碰91在线| 97一区二区三区视频| 国产91丝袜 在线播放| 国产精品久久久久久无码红治院| 天综合网| 99色网| 亚洲无码99| 大香蕉懂9| 亚洲1区2区三区高清中文字幕| 狠狠狠狠狠| 女同性恋中文字幕| 亚州AV无码国产精品| 操逼内射干逼白丝91| 狠狠干91| 久久大陆| 日操粉逼逼| 五十路成人在线视频二区三区| 日本少妇va7777| 麻豆91熟妇人妻中文字幕茄子| 伊欧美综合视频| 国产精品69久久久久久久| 人人射人人操人人摸| 嗯嗯啊啊好大好爽| 99久久久er直播网址| 中文字幕伊人| 久久五月视频| 九九综合九九综合| 久草热制服丝袜在线观看 | 国产AV久久野战精品| 精品国产72| 激情无码日韩| 97久久超碰国产精品| 校园春色综合| 日逼逼免费看| 2017天天插| 久久一留热品黄| 日韩少妇丰满亚洲| Av手机版天堂网| 大香蕉在线SuP| 东京日日夜夜| 岛国网址国产| 欧美一区二区三区不卡高清视频| 后入式在线免费观看60秒| av天堂手机版追回| 青青青国产手线观看视频2| 99久在线精品99re8a| 亚洲一本大道中文字幕无码在线| 伊人国产成人av网站| 91女优在线观看 | 屁股久久久久久| 超碰碰激情97+久| 天天插天天射| 亚洲综合九九| 奇米狠999| 91精品女厕偷拍视频| 性欧美91| 欧美色老汉| 95自拍视频在线观看| 国产精品久久久啊| 熟妇乱伦一区二区| 97超碰日韩| 日韩亚洲中文字幕在线| 亚洲熟女综合网| 极品出轨视频网站| 啊啊在线| 天天操妹子| 日韩精品 欧美激情| 加勒比av网| 亚洲日韩久久精品一区| 欧美第一页| 亚洲天天精品| 91欧美www| 久久久四区| 久久精品国产亚洲AV清纯| 美欧色综合| 欧州一区二区三区四区| 翔田千里Av在线| 日韩精品一区二区日韩| 日本视频一区二区三区| 国产精品无码AV网站| HEYZO高无码国产精品227| 九九Av| 中文字幕丝袜美腿| 色拍偷亚洲| 另类欧美色| 无码动漫av中文字幕| 日本不卡高清视频| 国产97色在线 | 亚洲| 校园春色美腿丝袜| 国产操逼网站亚洲一级黄色| 日韩午夜精品一区二区三区电影| 久久五月天婷婷| 亚洲影院小综合| 欧美日综合| Av手机版天堂网| 五月天婷婷色色| 久久久网一区| 久久伊人最新网址视频| 欧美自拍偷拍免费观看| 欧美亚洲国产自久久| 久久后入制服| 免费超碰97在线观看| 天天干天天日天天射黄色| 亚av顶级裸体一区二区三区四区五区 | 日本孕妇一区二区视频操逼免费看| 强奸乱伦AV网站| 男人的天堂在线2| 亚洲欧美中文一区二区三| 伊人97色天使| 免费人成毛片乱码| 三级三级三级日本99| 久久九九热| 日韩欧美午夜视频在线| 九一性生活免费视频| 女同女同恋久久级三级| 97色诱| 中文人妻av高清一区| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 亚洲欧美性生活| 色吧5亚洲| www四虎| 久久久久亚洲Av无码专区老牛影视| 啪啪91| 亚洲男人天堂av| 麻豆天美国美国产| 中文字幕一二区二三区人妻专区| 一本大道综合伊人精品热热| 超碰在线观看av不卡| 国产诱惑| 色五91| 国产亚洲精品久久久久小| 欧美久久婷婷| 激情四射五月天| 久久久免费的精品| 好爽视频在线观看视频| 欧美狠狠操| 老司机射| 高清国产无码av| 久久原创中文| 99热这里只有精| 国产精品婬乱一级毛片彝族| 男人的天堂网页| 国产偷人妻精品一区二区在线| 香蕉人人操tv| 91看黄片| 97香蕉网| 欧美精品庄| 日韩无码AB| www四虎| 欧亚在线视频| www.黄色在线| 99久久亚洲精品无码毛片潘甜甜| 26uuu国产免费观看| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 影音综合网| 天天草天天干天天日| 日本男人天堂| 久久精品国产97欧美精品亚洲| 日本免费不卡二区| 岛国片在线观看视频亚洲| 亚洲日韩在线a不卡99精品| 亚洲欧美变态| 九九这里只有精品| 蜜桃臀一区二区aV| 另类欧美| 中文字幕国产| 婷婷人妻激情| 久久久啊啊啊| 91neishe| 色五月激情综合网| 日韩婷婷| 婷婷色一区| 人人人人人人少妇| 91原创在线观看| 91色爽欧美| 午夜欧美神马久久久久| 九九热精彩视频| 少妇专区一二三四五| 亚洲精品97中文字幕| 国产熟女自拍| 日逼97| 91看黄片| 大色综合网| 嗯啊免费视频| 久久综合久色欧美综合狠狠| 撸无码不卡免费视频| 人妻铁牛TV| 黑人白女精品一区| 91婷婷伊人狠人| 鸥美中出| 一线黄色免费性爱片| 久久久久婷婷| 久久精品国产99国产精品亚洲| 激情情色五月天| 丝袜亚洲综合| 国产色精品午夜大片| 男人的天堂.com| 3级毛片一二| 日韩综合无码色欲vv| 久久久久9999| 日日日日做夜夜夜夜做无码97| 日韩无码人妻| 成片免费播放| 亚洲日本大香蕉1| 日语五十路和六十路亚洲国产精品| 人人摸人人摸人人干| 日日日啊啊啊| 五十路熟女人妻一区二区在线观看| 成人性爱高清视频免费看| 中文字幕二区日韩天堂| 天美传媒精品一区二区三区| 久久一区二区高清免费| 人人澡综合涩| 天天色悠悠激情| 久久精品国产97欧美精品亚洲 | 久久东京热久久| 91精品大奶人妻| 在线播放免费av福利片| 亚洲A色| 国产黄色剧情影片麻豆免费播放| 青青草视频这里只有精品| 东京热毛片调教| 99热日本| 日韩熟女三十乱伦| 亚洲天堂男人| 99在线视频播放| 尤物黄色在线观看网站| 91成人社区| 国产呦精品一区二区三区下载| 中文熟女五十乱码在线| 激情丁香五月| a片在线播放| 久久超碰免费的| 精品国产www久久| 9久9久9久9久视频网站| 啊啊啊啊啊啊在线看| 欧美gv在线观看| 啊啊啊轻点在线观看| 91精品电影18| 丰满高潮18xxxx| 岛国片国产成人亚洲播放| 97操综合| 91美女色视频亚洲| 色女女女导航| 天堂8在线新版官网| 农村女一级毛卡片| 天天搞欧美| 2019AV天堂| 色色婷婷五月| 熟女视频久久| 亚洲三区视频| 日B操| 天天日天天干少妇日| 亚洲欧美日韩电影网站一区 | 99夜夜操| 97亚洲色图| 亚洲欧美激情小说| 美女黑人91神马| 熟女啪啪视频| 大鸡巴久久久| 天美传媒国产原创中文字幕亚洲欧美另类| 96久久精品一二三区色欲| 精品国产乱码久久久久A| 国产精品干干干| 思思热在线视频免费| 欧美不在线| 夜夜躁狠狠躁日日躁av| 亚洲熟妇A V黑人| 欧美三级偷拍| 欧美精品黑人猛交高潮| 亚洲 欧美综合| 中文一区二区三区影院| 日韩欧美性爱电影在线观看| 欧美 精品国产制服第一页| 91精品91久久久久77777俄罗斯老妇姓x| 33044男人的天堂深夜备| 97爱爱官网| 日本一二区不卡| 日韩无码视频黄色| 欧美黑人精品一区二区| 综合色99| 久草热制服丝袜在线观看 | 91路www| 欧美综合自拍亚洲综合图| 久久9免费视频| 欧美懂色综合网| 超碰97久久| 青青草吊丝| 天天天天天天天天综合| www.acm成人黄色毛片| 97欧美在线| 日本性爰一道本| 97色色网| 日日AAvv| 3028国产精品| 91美女在线精品视频| 东北女人操比视频| 久久久久亚洲| 搡老熟女老女人老熟妇免费视频| 天天射网| 床戏久久久av一区二区麻豆| 亚洲欧洲自拍图片专区满春格| 国产精品成人无码av无码免费| 中文字幕精品三级久久久| 久操视频在线| 97啪啪| 国模吧 一区二区三区| 国产按摩一区二区三区| 夜夜免费视频| 久久性爱视频99| 久青草影院| 日日夜夜草草草| 色噜噜狠狠色综无码久久合欧美| 女人爽到高潮久久久| 日韩综合第八区国产精品| 在线人成亚洲视频免费观看| 亚洲成人网站在线观看| 校园春色综合色| 丝袜综合网| 99热这里都是精品| 欧美999| 五月天伊人| 中文字幕在线免费观看2| 草草影院在线视频| 日韩黄色片子| 亚洲九九爱| 欧美 亚洲 偷拍自拍| 中出20p| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 外国免费性情大片| 色哟哟国产精品免费网址| 中国AAAAAA黄色片| 国产成人天堂| 人妻少妇久久久| 尤物av网站免费在线播放| 久久一二三四不卡 | 色官网在线| 黄色大片视频在线免费看| 亚州色图狠狠干| 六月婷婷综合| 立川理惠被中出无码| 欧美熟女丝袜| 亚洲五月婷婷| 色欲无码人妻日韩欧美精品| 国产成人精品网站| 超碰98综合网| 欧美少妇色综合| 蜜桃久久久久久久| 99re在线观看| 国产 无码 一区二区| 黑人免费福利视频| 色色九区| 青青久久艹| 五十路成人在线视频二区三区| 精品无码一区二区| 大香蕉av在线| 伊人五月天| 色婷婷丁香| 丝袜熟女一区二区三区| 搡老女人老妇女AAA一VU麻豆| 日日骚AV| 久久性爱视频99| 日韩强奸av| 国产精品 视频| 亚洲天堂2020| 91这里只有精品| 国产精品香蕉| 亚洲欧洲日本精品中文a∨| 亚洲综合九九| 熟女乱3伦999| 日韩黄色片子| 国产精品无码av在线 | 好涩综合| 肉动漫无遮挡h在线观看| 中文字幕在线免费观看2| 97视频免费在线观看| 99999re| 欧美熟妇成人一区二区| 亚洲色色探花| 口爆综合网| 啊啊啊好湿久久| 国产成自自拍在线观看| 国产麻豆一区二三区| 综合五月天| 日韩欧美大片免费高清啪啪| 国产91精品福利在线| 99久久精品国产高潮| 亚洲天堂中文字幕无码男同| 国产精品欧美激在线| 久久久一二三四区| 免费无码婬片AAAA片直播色戒| 一本精品日本在线视频精品| 日韩av在线播放不卡| 丁香五月天堂网| 91国精产品| 无遮挡又黄又刺激的视频| 殴美在线AⅤ| 熟妇视频一区二区三区在线观看| 久久久性| 国产免费一区二区三区最新不卡| 大屁股国产在线视频| 天天噜| 色婷婷综合视频| 国产十八禁视频| 日韩免费中文字幕视频| 亚洲午夜免费狠狠干| 色网亚洲人| 亚洲强奸乱伦影视网| 操操操操网黑人| 国产Av超碰| 精品人妻一区二区三区-国产精品| 新怡红院| 婷婷色色五月天| 国产精品一区二区麻豆| 国产91精品福利在线| 精品亚州18| 波多野结衣被操50分钟免费视频 | 日本3级一区二区免费| 日日干夜夜骑| 性色av网站| 果冻传媒A片一二三区| 中文字幕精品区先锋资源| 中文字幕精品亚洲熟女| 五月婷婷丁香中文字幕| 亚洲熟女少妇免费视频| 人人扣人人操| 丁香九月婷婷| 大奶的诱惑| 综合激情97| 国产精品激情久久久久久久| 日本高清一本二本免费不卡| 桃色五月天| 精品美女少妇一区二区| 91精品人妻偷情| 五月天伊人| 熟妇艹鸡八| 97日亚洲欧美| 亚洲欧美日韩综合在线尤物| 亚洲男人的天堂网| 操逼天美3区| 欧美黄色图片| 国产精品白领在线观看| 青青草九九九九九| 亚洲黑人在线| 久久久久久中文字幕中文字幕最新| 深喉吞精| 色综合五月天| 亚洲丝袜诱惑| 日韩人妻少妇中文字幕| 日韩小电影| 夜夜爽77777| 国产精品久久久| 草b在线| 欧美精品三级黄片| 97中文字幕色| 国产野战露脸在线播放| 97视频在线免费播放| 亚洲成人av电影在线| 亚洲黄a三级三级三级看三级| 福利社区午夜一区二区| 99re6国产精品99re| 人人摸人人干人人拍97| 国产精品另类一区大香蕉| 色婷婷激情| 百度百度日本操逼| 久久久久久久久久久久黄色 | 亚洲人妻爽爽爽| 97超碰国产亚洲精品资源| 立川理惠被中出无码| 神马久久久久久久久久| 黑人无码一区二区| 亚洲资源一区| 99啪啪视频| 国产 热久久久久国产精品| 天天色天天干天天射| 99re6国产精品99re| 国内精品久久久久影院亚洲| 97色综合中文网| 一区二区三区国产精产| 97欧美性爱| 91美女视频在线观看| 一区二区三区日韩欧美| 中文字幕aⅴ在线视频| 视频在线97| 中文字幕丝袜人妻| 干婷婷综合网| 一区二区三区免费视频入口| 精品无码一区二区人妻久久蜜桃| 色婷婷基地| 日韩精品在线视频在线观看| 亚洲精品久久久久久| 色哟哟国产精品免费网址| se01国产在线视频| 日比av无码| 97日视频| 天天欧美欧美亚洲网| 神马久久久久久伦理片| 亚洲成成熟女人综合一区二区| 日韩中文字幕av在线播放| 久操热| 91碰超| 九九综合九九综合| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 超碰97人妻免费在线| 天天性射网| www.99热在线只有精品| 丁香色色网| 一起草日韩| 婷婷超| 97视频在线观看免费高清| 91综合国产精品| 精品久一区免费| 欧美性爱五月天| 美女午夜福利免费视频| 边做饭边操逼逼| 精品国产乱码久久久A| 久操av在线| 超碰综合色| 国产传媒1234区| 东京热激情视频一二三区| 久久婷婷综合国际产色怕| 影音先锋视频在线| 91久久免费视频互動交流| 91九色丨风韵犹存| 理论久久婷婷网8| 老色鬼成人精品视频下载大在线观看| 91艹逼精品| 特级大荫道BBwBBwBBW| 久久99黄色卞西瓜| 熟女人妻av在线资源,黄色的资源| 蜜桃av综合网发布| 欧美成人一区二区三区在线播放| 国产精品视频麻豆入口| 17c在线成人免费A片观看| 久久国产逼| 四虎精品永久在线播放| 91美女视频| 懂色Av| 久久大黄片| 97色亚洲| 四虎国产精品永久在线囯在线| 97综合久久| 美女被啪到深处抽搐视频| 欧美超碰在线| 秋霞色色影院| 国产高清午夜成人在线观看| 一级一性爱免费视频| 男女性无套 免费九一| 懂色aV一区二区天美传媒| 精品人妻一区二区三区在| 天堂v无码免费视频| 亚洲欧美国产中文视频| 国产综合在线视频网站| 国产女人高潮嗷嗷嗷叫小说 | 久久夜嗨| 人人爽夜夜玩视频| 超碰偷拍| 天天综合官网| 91视频伊人| 最新中文字幕精品在线| 亚洲免费看片| caopeng97| 青娱乐手机日韩在线视频| 91视频综合在线| 校园激情狠狠四射| 中日韩免费看男女操逼大全| 久久亚洲欧美中文字幕国语| 人妻精品一区二区在线| 激情六月天| 欧美午夜色妇色鬼| 亚洲乱熟女一区二区| 国产精品一区二区密臀| 操屄日韩| 91老熟女老女人国产老太| 欧美天天在线| 欧美91在线| 国产一区二区三区免费视频在性观看| 屁屁影院一区二区三区国产| 日韩精品99999| 干b在线性社区| 精品女同一区| 综合久久久久久久久91| av天堂手机版追回 | 97在线免费视频| 免费公开人人操| 青青草中文-久久青草精品一区二区三| 久久的网站啊啊啊啊啊| 91劲爆| 很很操在线| 日韩国产中文字幕| 校园春色欧美色图| 四虎精品永久在线观看| AV一区观看| 婷婷五月天网| 美女91色黄18| 亚洲男人综合| 夜夜爽33333| 天天拍天| 国产精品久久久无码aV去| 欧美国产日韩高清在线| 亚洲中文字幕日产无码久久| 欧美色视| 人人透人人操| 男人的天堂在线| 色在线视频导航| 色婷五月天| 九九九九九九九| 一级日本牲交大片好爽在线看| 2011国产精品| 狠狠色五月亚洲91| 中文一区在线视频| 麻豆国产成人精品| 2024年最新色情网站在线观看| 亚洲欧美中文日韩视频中国语| 99国产精品久久久在线播放| 婷婷色色五月天福利| 婷婷97| 久久久999国产精品| h4610国产人妻| 国产精品视频播放| 亚洲AV成人精品网站在AV| 五月天婷婷成人网| 精品免费囯产一区二区三区| 欧美一级黄片免费播放| 久久少妇人妻| 看一级特黄a大一片| 国产AV天美| 久久久久久久免费A片国产成a人亚洲精∨品无码| 桃色五月天| 在线洲亚线| 久久久精品国产亚洲AV无码| 黑人粗大V S日韩女优视频| 亚洲色图欧美色图日韩色图| 久久综合超碰| ..日韩av毛片精品久久久| 亚洲第一色页夜| 香蕉久久AⅤ...| 啊啊啊啊操死我了| 强奸乱伦大香蕉| 美女91色黄18| 秋霞一级视频在线观看免费| 淫穴高潮色图| 色五月首页| 青青青青操国内视频在线| 久久男人的天堂国产| 精品78| 亚洲乱色视频一区、二区在线| 日韩性爱啪啪视频| 亚洲综合888| 可以免费看黄片的视频| 久久久久密臀一区二区| 国产精品人妻熟女aⅴ| 大香蕉在线SuP| 韩国黄色片精品久久久 | 无码99| 神马久久久久| 又摸又舔在线观看网站| 欧美久久人人网| 欧美最婬乱婬爆婬牲视频| 99精品在线| 国产 日韩 欧美一区| 久久男人网| 国产精品一区二区 尿失禁| 大香蕉一人| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 国产精品人人爽人人做可爱福利| 精品性爱久久视频| 国内毛片免费h片在线| 欧在线一二区| 性性久久| 五月天久久久| 久久国产熟女影院| 9997se| 丝袜夫妻自拍| 3P乱轮视频| AV女优男人的天堂| 亚洲情色在线| 丁香五月影院| 天天做日日做| 91精品网站| 中文幕97| 97久久精品亚洲| 性爱免费视频成人| 亚洲欲色| 综合网97| 久久久9品一区二区三区| 国产三级中文有码在线视频| 揉揉日日日日| 啊嗯嗯啊好大好爽| 亚洲最大黄网| 曰韩av中文字幕专区| 欧美性爱精品七区| 草B在线| 狠狠亚洲| 激情图片伦理国产一区二区日韩| 亚洲欧美国产成人综合不卡| 操逼操2| 91天美免费| 97视频900| 欧美最婬乱婬爆婬性视频| 日韩人妻中文视频| 欧美v亚洲v综合v国产v妖精| 97视频播放| 欧洲亚洲综合| 97日视频| 夫妻四区五区六区| 天天插天天干| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 日韩av情韩国爱禁区av一区二区| 婷婷三区| 夜夜中出国产| 香蕉久久国产AV一区二区| 中文字幕一区二区三区高清| 一区二区三区免费视频入口| 97色色色| 91欧美综合| 久久蜜桃一区二区| 天堂精品| 久久久9 9 9精品| 狠狠2050在线观看| 国产丰满熟夫69mpp| 成人无码专区精品视频| 天美国产精品| 淮穴色AV| 久久久九97| 久久久久久国产精品| 国产免费一区在线观看| 激情综合二| 乱欲一区二区| 盗摄女人妻在线| 做爱A级亚欧| 麻花豆传媒剧国产MV出差| 日韩性爱免费观看视频| 亚欧高清| 午夜福利1区2区3区| 亚洲一区操| 91精品久久久| 国产精品干干干| 久久社区一区二区三区| 欧美极品性爱天天射| 脫衣舞一区二区三区| av天堂天堂av日韩| 岛国视频免费在线观看| 黄在线| 强免费黄色网址| www.91久久| 东京日日夜夜| 日韩欧亚太美不卡| 日韩精品第3页| 大香蕉青青9| 亚洲,欧美,综合网| 日韩精品-原创伙伴| 大香蕉78| 国产高清精品一区二区三区毛片| 人妻 中文 日韩| 插欧洲美女欧美精品| 99操| 97干色天堂| 午夜亚洲国产理论秋霞| 国产精品一级片在线看| 99自拍视频| 十八禁网站在线| av72网| 性感美女91影视| 国产强奸乱伦无码视频| 国产精品麻豆视频网站| 欧美中出1| 暖暖精品二区三区观看| 亚州 综合 色图| 天操天操夜操夜月月年年操操| 欧美激情在线观看视频| 国产精品久久久久久亚洲色欲| 二男一女成人A片| 久久丁香五月婷婷| 日本亚洲vr欧美不卡高清专区| 超碰97最新人妻| 欧美三四五区| 妇女性内射冈站HDWWWCOM| 国产成人精品日本视频| 人妻少妇蜜桃视频欧美一区| 伊人伊人LD| AV女优男人的天堂| 亚洲人妻在线一区| 婷婷五月色| 97丝袜亚洲在线播放| 国产熟女无套内射| 色天使亚洲综合在线观看| 综合色99| 99黄页网站| 日韩色| 日韩av在线免费网站| 久久久久久久九九九九九九| 欧美日韩亚洲国产中文永久天天看| 欧成人精品H无码| 人妻日日干| 久久精品天美| 九九热三级片| 国产懂色精品国产av| 青青草视频在线观看一区二区| 精品二区久久| 久久首页| 九一屌逼| 欧美中文综合| 欧美特大黄一级片片免费| 草伊人高潮喷水超碰| 久久久性爱| 自拍偷拍2025在线观看| 99热 按摩 日韩| 亚洲国产成人精品久久久国产成人一区二区| AV无码久久久精品| 91高跟美女在线播放| 91麻豆天美| 俺去也婷婷| 国产精品午夜福利| 久久一级无码精品毛片6| 操学生天天| 色色色日本| 好淫网一二三视区| 日韩综合色图| 超碰免费在线| 国产麻豆91欧美一区二区久久婷婷国产精品| 免费人成在线观看网站品爱网| 1区2区3区在线视频| 97狠狠| 这里有精品| 91天美免费| 91性高潮久久久久久久久| 97超级色碰碰| 日本欧美亚洲高清在线看| 亚州男人的天堂| 18禁免费视频| 亚洲性少妇| 久久精品国产亚洲AV无码做| 一区二区三区成人| 久操凹凸视频| 97网址97| 无码免费精品高清| 亚洲精品国产熟女久久久| 日本成人A片免费看| 小骚逼被操的爽不爽| 欧美精品日韩久久久九| jiujiujiujingpin| 亚洲啪啪视频一区二区| 天欧美在线| 26uuu国产免费观看| 天天舔日美女视频| 开心五月激情网| 亚洲天堂精品日韩电影| 毛片视频白嫩| 狠狠操官网| 久久精品国产精品| 三级片网站在线播放| 97久久久网站| 亚洲情色电影网| 69国产对白刺激| 欧美暴力猛交| 男女激情黄色网址| 亚洲欧美激情小说| 91大学精品激情戏| 精品无码欧美三级| 97超碰资源网| 日本 欧美 国产一区| 91精品人妻一品二品三品| 真实高潮91| 久久社区一区二区三区| 91日韩网站| 97色插| 一线黄色免费性爱片| 久操免费电影| 天天操女人| 国产高清免费不卡av| 91久久久久| 韩国女主播青草福利视频| 日本一区视频在线观看| 91在线丝袜| 国产在线不卡导航| 亚洲日韩美国人妻| 伊人麻豆传媒| 久草男人天堂| 婷婷导航| AV和黑人在线播放| 蜜桃臀av一区二区| 综合网久久| 欧美做爰无码A片视频| 日韩免费一级性爱视频| 中文精品少妇天堂| 嗯……啊…嗯嗯…啊…好舒服| 韩国黄片aaaa| 久久久久九九九| 久久精品高清无码一区| 花野真衣| 人妻熟女av国产网站| 国产综合色精品在线观看| 蜜桃臀一区二区aV| 日韩精彩免费| 久9热| 国产免a费看黄片在线| 国产精品视屏| 欧洲性人爱视频| 欧美大香蕉97| 国产玖玖| 日韩av影片在线观看| 操屄日韩| 免费视频97| 中文字幕午夜精品久久久| 中文字日本乱码| 日产狠狠干| 亚洲色 国产 欧美 日韩| 精品人妻免费观看| 人妻丝袜二区| 自拍第一页| 97超碰中文| 亚洲棕合电彰| 91久热这里只有精品| 99久久网站| 亚洲强奸乱伦影视网| 国产在线视频二区| 激情文学88| 九九九九九精品视频| 一区二区三区四区五区久久久久久| 新97国产超碰| 国产a级精品| 久久久久久久久久久97| 99性爱| 五月丁香激情啪啪| 男男H黄动漫啪啪无遮挡网站| 涩涩这里只有精品视频| www.99色| 影音先锋每日最新资源在线观看| 亚洲欧美人妻| 婷婷爽人人婷婷爽视频| 欧美性爱一区二区三区| 九九九不卡| 亚洲丝袜二区在线| 免费精品AB| 久久久无码精品人妻二区| 精品一区二区2| 成人性爱美曰韩| 最新中文字幕在线亚洲| 操逼无码一区| 久久精品国产亚洲AV无码电影| 日操粉逼逼| 久久国内| 精品性爱无码在线播放| 日韩欧美国产高清视频| 蜜桃av综合网发布| 色香色欲天天综合网天天来吧| 国产 三级自拍| 免费AV播放| 啊啊啊不要好疼视频| 国色天香av| 日韩天堂av电影在线观看| 黑人天8A∨高清网站| 久久大线蕉一区| 日韩欧美水蜜桃人妻| 欧美一级国产一级| 国产一区在线看| 日本不卡一区二区|