03 · 技术选型
每一项技术为什么被选中——Next.js、NestJS、Prisma、pnpm monorepo、云效与 OSS 的选型理由
💡 TL;DR:技术选型的原则只有两条——用最主流的成熟方案(出问题好查、AI 协作友好)、为「AI 自主编码」优化(约束清晰到机器可判定)。本章逐项讲清每一层选了什么、为什么。
选型总表
| 层 | 选型 | 一句话理由 |
|---|---|---|
| 前端 | Next.js 15(App Router)+ React 19 + TypeScript | Server Component 默认,SEO 与渲染性能兼得 |
| 后端 | NestJS + Prisma | 模块化骨架清晰;Prisma 让数据库操作有类型、有迁移 |
| 共享层 | @guangmin/shared(自研包) | 领域 Schema/类型/常量只写一份,前后端共用 |
| UI 基座 | @guangmin/ui(自研包) | 设计令牌 + 基础组件,业务禁止直连 UI 库 |
| 数据 | PostgreSQL(Prisma 管迁移) | 成熟稳定;迁移即代码,可回溯 |
| 对象存储 | 阿里云 OSS | 站点图片与工具产物的托管,与服务器同地域免流量费 |
| 工程 | pnpm workspace + Turborepo | 多包依赖图编排,任务缓存让 CI 提速 |
| CI/CD | 云效(阿里云) | 境内直连、与代码库同生态;push 即全量门禁+出包 |
为什么是 Next.js 15 + React 19
工具站有两种页面:工具工作页(重交互,纯客户端)和内容页(文档/文章,重 SEO,服务端渲染最好)。Next.js 的 App Router 让两类页面共存于一个项目:默认 Server Component(服务端渲染,利于搜索引擎),需要交互的组件加 'use client' 声明即可。React 19 的并发特性保证工具页在重计算(压缩大图)时界面不卡死。
TypeScript 是全程语言。不是为了时髦——第 4 章会讲「契约唯一事实源」,没有类型系统这套机制根本立不住。
为什么是 NestJS + Prisma
NestJS 的模块(Module)/控制器(Controller)/服务(Service)三层结构,等于把「文件该放哪」这个问题在框架层面定死了。任何新功能进来,AI 或人类协作者照着模板填空即可,不会长歪。
Prisma 解决两个痛点:一是类型安全——prisma.client.findMany() 返回什么字段,编辑器直接告诉你;二是迁移即代码(migration as code)——数据库结构变更生成迁移文件入库,生产环境只跑 prisma migrate deploy,杜绝「手动改库」这种不可回溯的操作。
为什么自研 shared 和 ui 两个包
这是本仓库最关键的两个选型,值得单独展开:
- @guangmin/shared:工具目录(TOOL_CATALOG)、各工具的上限常量(如 ZIP 解压 ≤20MB)、接口出入参的 Zod Schema(一种「定义一次、运行时校验、编译期出类型」的库)全部只写一份。前端拿它做表单校验,后端拿它做接口复核,同一份数据源保证两端口径永不漂移。
- @guangmin/ui:设计令牌(颜色/字号/间距的 CSS 变量)+ 按钮/表单等基础组件。业务代码禁止直接引第三方 UI 库——未来底层换实现,业务代码一行不动。
为什么 pnpm workspace + Turborepo
pnpm 的 workspace 把多个包放进一个仓库统一管理,包之间用 workspace:* 协议互相引用(发版即生效,不用发布 npm)。Turborepo 在此之上做任务编排与缓存:pnpm build 时它按依赖图算出正确顺序(先 shared 后 web),并缓存每个包的产物——没改的包直接复用上次结果,CI 从十几分钟压到几分钟。
为什么 CI/CD 选云效而非 GitHub Actions
服务器和用户都在境内,GitHub 的跨境链路不稳定;云效(阿里云出品)与代码库、OSS 同生态,push 即触发「全量门禁 → 出制品包 → 上传 OSS」的完整流水线,部署机从 OSS 拉包,全程境内网络。
唯一的非常规决策:本地优先的工具引擎
对工具站来说,常规做法是后端处理文件。我们反着来——压缩、打包、抠图全部在浏览器完成。选型落点是三件浏览器原生/准原生能力:Canvas(画图与重编码)、WebAssembly(在浏览器里跑编译好的原生代码,速度接近本地程序)、File API(读写用户选择的文件)。为什么这么选,05 核心实现 用一整章展开。
延伸阅读:04 架构设计 讲这些选型怎么拼成一个整体;06 质量门禁与部署 讲选型怎么落到生产。