Create T3 App 技术选型全解析为什么 TypeScript、Next.js、tRPC、Prisma 与 Tailwind 是默认答案【免费下载链接】create-t3-appThe best way to start a full-stack, typesafe Next.js app项目地址: https://gitcode.com/gh_mirrors/cr/create-t3-appCreate T3 AppCT3A是当前社区中最流行的全栈、类型安全 Next.js 应用脚手架之一。本指南以官方文档 why.md含其阿拉伯语译本 www/src/pages/ar/why.md为核心脉络逐项拆解该项目每一项技术选型背后的设计哲学并结合本仓库中 CLI 的交互流程、安装器与模板源码向你展示“为什么这样选”以及“这些选型在代码里如何落地”。读完本文你将理解 T3 Stack 的取舍逻辑并能据此判断它是否适合你的下一个项目。项目缘起为什么会有 Create T3 App一切始于一个朴素的动机社区知名开发者 Theo 拒绝为自己偏好的技术栈制作模板。受create-next-app与 Astros CLI 的启发以及对类型安全typesafety的普遍热爱Create T3 App 团队决定亲自下场为 T3 Stack 项目打造一个尽可能好的起点。官方的定位非常明确如果你希望以类型安全的方式使用 Next.js这里是合适的起点如果你对其中任何一项具体的技术选择感到好奇本文正是为这些问题准备的。从源码看这个“起点”被设计成一套高度可交互、可组合的脚手架。CLI 的入口实现在 cli/src/cli/index.ts它通过commander解析参数并用clack/prompts向用户逐项提问。项目名、语言、样式方案、tRPC、认证方案、数据库 ORM、App Router、数据库提供商、代码检查工具、Git 初始化、依赖安装、导入别名全部可以在一次交互中确定。这种“把选择权交给开发者但每一项都有深思熟虑的默认值”的设计正是文档中“保持简单但允许按需采纳”理念的直接体现。为什么 TypeScriptJavaScript 本身已经很难了为什么还要增加更多规则文档给出的答案是类型系统带来的“严格性”会促使你成为更好的开发者。TypeScript 在你写代码的当下就提供实时反馈——通过定义期望的数据类型编辑器能给出自动补全当你试图访问一个不存在的属性、或传入错误类型的值时编辑器会用红色波浪线直接标记出来而不是让你在运行期的深处慢慢调试。无论你是 Web 开发新手还是资深工程师这种严格性带来的都是比原生 JavaScript 更少挫败、更一致的开发体验。文档还特别强调了一个观点类型安全会让你更快。如果你对此存疑官方推荐观看 Theo 的演讲《might be using TypeScript wrong…》。这种“类型安全”哲学在本仓库中有多处印证CLI 层面强制 TypeScript在 cli/src/cli/index.ts 中CLI 虽然询问“使用 TypeScript 还是 JavaScript”但当用户选择 JavaScript 时它会打印一句红色提示Wrong answer, using TypeScript instead答错了改用 TypeScript然后继续使用 TypeScript。这不是一个可选偏好而是项目的核心立场。环境变量也是类型安全的脚手架自带的 cli/template/base/src/env.js 使用t3-oss/env-nextjs配合 zod 定义环境变量 schema在构建时校验NODE_ENV等变量确保应用不会在非法环境变量下启动客户端变量必须以NEXT_PUBLIC_前缀暴露并支持通过SKIP_ENV_VALIDATION跳过校验例如 Docker 构建场景。数据库查询结果的类型安全从 Prisma schema 生成类型到 tRPC 对输入输出的全链路推断TypeScript 的类型系统贯穿了从数据库到客户端的整条链路下文详述。为什么 Next.js团队喜爱 React——它让 UI 开发的易用性达到了前所未有的程度。但 React 也可能把开发者带向一些崎岖的道路。Next.js 的价值在于它用“轻度固执、重度优化”lightly opinionated, heavily optimized的方式为使用 React 构建应用提供了近乎完美的体验。文档明确点出了 Next.js 覆盖的三个核心领域路由routing、API 定义API definitions与图片渲染image rendering。团队信任 Next.js 能引导开发者做出正确的决策。这一选型同样体现在脚手架的默认配置中CLI 询问是否使用 Next.js App Router且默认值即为true见 cli/src/cli/index.ts。在模板中App Router 与 Pages Router 两套布局都被完整支持安装器会根据用户选择分别生成src/app/api/trpc/[trpc]/route.ts或src/pages/api/trpc/[trpc].ts见 cli/src/installers/trpc.ts体现了“跟随 Next.js 官方方向、同时保留迁移空间”的策略。为什么 tRPCtRPC 兑现了 GraphQL 的一个核心承诺——在类型安全的服务器之上进行无缝的客户端开发却不需要任何样板代码boilerplate。文档称其为“对 TypeScript 的一次巧妙利用”a clever abuse of TypeScript带来的是卓越的开发者体验。从本仓库的源码可以清晰看到这条“零样板”链路是如何搭起来的安装器cli/src/installers/trpc.ts会为项目加入trpc/server、trpc/client、trpc/react-query、tanstack/react-query与superjson序列化器使用 App Router 时额外加入server-only使用 Pages Router 时则加入trpc/next。根路由cli/template/extras/src/server/api/root.ts通过createTRPCRouter聚合各业务路由并导出AppRouter类型与createCaller供服务端直接调用——客户端只需引用这个类型即可获得完整的输入输出推断。React 接入层cli/template/extras/src/trpc/react.tsx使用createTRPCReactAppRouter()生成类型化的api对象通过httpBatchStreamLink将请求批量发送到/api/trpc并利用loggerLink在开发环境下打印请求日志同时导出RouterInputs/RouterOutputs推断工具让“类型从服务器一直流到客户端”成为日常体验。这意味着你在 Prisma 里定义的数据库模型经过 tRPC 的过程类型推断最终在 React 组件里调用api.post.all()时返回值的类型是自动完整推导的——这正是 T3 Stack 名字里“类型安全”的直观体现。为什么 Prisma文档用一句非常精辟的类比概括 PrismaPrisma 之于 SQL正如 TypeScript 之于 JavaScript。它创造了一种此前不存在的开发者体验从用户定义的 schema 生成类型并且该 schema 兼容多种数据库从而在数据库与应用之间保证端到端的类型安全。文档还特别强调 Prisma 提供了一整套工具Prisma Client负责查询让 SQL 变得如此简单以至于你几乎感觉不到自己在使用它Prisma Studio是一个便捷的数据库图形界面GUI无需编写代码即可快速读写数据。在本仓库中Prisma 安装器cli/src/installers/prisma.ts展示了这套体验的完整落地将prisma作为开发依赖、prisma/client作为运行时依赖加入项目选择 PlanetScale 时还会额外加入prisma/adapter-planetscale与planetscale/database。根据是否启用认证NextAuth / BetterAuth以及数据库提供商从template/extras/prisma/schema/目录挑选对应的 schema 模板例如 cli/template/extras/prisma/schema/base.prisma 定义了generator client、datasource dbprovider 与DATABASE_URL环境变量以及示例Post模型。自动注入一系列数据库脚本postinstall执行prisma generate另有db:push、db:studio、db:generateprisma migrate dev与db:migrateprisma migrate deploy。生成的数据库客户端封装在 cli/template/extras/src/server/db/db-prisma.ts在开发环境打印 query/error/warn 日志并通过globalThis缓存单例避免开发模式热重载时重复创建连接——这是社区处理 Next.js 开发服务器长连接问题的标准做法。值得注意的是本仓库同时支持 Prisma 与 Drizzle 两种 ORM见 cli/src/installers/drizzle.ts二者在 CLI 中被设计为互斥选项见 cli/src/cli/index.ts用户按需选择。为什么 Tailwind CSS文档对 Tailwind 的评价是“禅意模式的 CSS”zen-mode CSS。它通过提供良好的默认颜色、间距与其他基础原语primitives作为构建块让你轻松做出好看的应用与组件库不同当你想把应用提升到新层次、创造独特且美观的东西时Tailwind 不会拖你的后腿。更重要的是它的内联式inline-like写法Tailwind 鼓励你在无需纠结类名命名、文件组织或其他与手头问题无关的事情时直接完成样式。换句话说它把认知负担从“命名与归档”转移到“解决问题本身”。在仓库中Tailwind 安装器cli/src/installers/tailwind.ts会加入tailwindcss、postcss与tailwindcss/postcss均为开发依赖并复制postcss.config.js与 cli/template/extras/src/styles/globals.css 到项目。模板中的页面组件如with-tw.tsx与 tRPC 示例组件post-tw.tsx也都提供了 Tailwind 风格的开箱即用版本。为什么 NextAuth.js当你想在 Next.js 应用中加入认证系统时NextAuth.js 是一个优秀的选择它把“安全”这个复杂问题打包进来却不需要你从零构建。文档强调它自带大量 provider可以快速接入 OAuth 认证并为多种数据库和 ORM 提供了适配器adapters。本仓库的 NextAuth 安装器cli/src/installers/nextAuth.ts印证了这一点基础依赖为next-auth选择 Prisma 时自动加入auth/prisma-adapter选择 Drizzle 时加入auth/drizzle-adapter实现认证与数据库的无缝衔接。复制 API 路由src/app/api/auth/[...nextauth]/route.ts并根据数据库选型从 cli/template/extras/src/server/auth/config 中选择base.ts、with-prisma.ts或with-drizzle.ts作为认证配置。以 cli/template/extras/src/server/auth/config/base.ts 为例默认接入 DiscordProvider并通过模块增强module augmentation为next-auth的Session类型添加user.id字段在session回调中把token.sub注入会话——认证信息同样以类型安全的方式传递给前端。此外当前版本的 CLI 还支持 Better Auth 作为 NextAuth 的替代方案见 cli/src/cli/index.ts两者互斥且模板中为 Better Auth 准备了完整的server/client/config结构见cli/template/extras/src/server/better-auth/。按需采纳CLI 如何把这些选型组装成项目文档的核心立场是“我们相信尽量保持简单但这些组件几乎出现在每一个我们构建的 app 类项目中create-t3-app很好地让你按需采纳adopt the pieces you need”。这正是它区别于“全家桶模板”的地方——一切都可勾选一切都有合理默认。从 cli/src/cli/index.ts 可以看到完整的组装逻辑CLI 将用户的交互答案映射为packages数组tailwind、trpc、nextAuth、betterAuth、prisma、drizzle、eslint、biome随后由 cli/src/installers/index.ts 注册的各个安装器按需执行文件复制与依赖注入默认组合为nextAuth prisma tailwind trpc eslint数据库默认 SQLite导入别名默认~/。你还可以通过--noGit、--noInstall、-y/--default等命令行参数跳过交互详见 cli/src/cli/index.ts在 CI 场景下使用--CI配合各项布尔标志实现完全非交互的脚手架搭建。总结一个以类型安全为信仰的可组合起点回顾整份文档Create T3 App 的每一项选择都围绕同一个信仰展开——类型安全TypeScript 保证代码层的类型正确Next.js 提供正确的框架决策Prisma 让数据库模型进入类型系统tRPC 把类型贯穿到客户端Tailwind 让你专注样式而非命名NextAuth.js 以适配器形式把认证安全地带进这条类型链路。它们不是“热门技术的大杂烩”而是被验证过可以协同工作的组合并全部通过一个可交互、可组合、可脚本化的 CLI 交付。如果你正在寻找一个既能开箱即用、又保留充分选择空间的全栈 Next.js 起点从本仓库的cli/template/目录开始研究其模板结构或直接运行 CLI 体验一次交互式脚手架搭建都是理解这套选型哲学最直观的方式。【免费下载链接】create-t3-appThe best way to start a full-stack, typesafe Next.js app项目地址: https://gitcode.com/gh_mirrors/cr/create-t3-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考