实战记录 2026-09-24

技术选型:我为什么选 HTML/CSS/JS + Python(FastAPI) + MySQL

禾

禾安

独立开发者 · 专注移动端iOS开发

不用框架、不追新:从"一个人维护、要长期改"这两条约束出发,说清前端、后端、数据库各自的取舍理由,以及这套组合不适合什么场景。

选技术栈最容易踩的坑,是拿"最流行"当标准。流行的东西通常没错,但它不一定匹配你的约束。这篇说清这套组合是怎么定下来的 —— 重点不是"它多好",而是"它为什么匹配我这边的条件"。

一、先列约束,再挑技术

动手前只有三条约束,但它们决定了后面所有取舍:

  • 一个人维护:没有团队分工,出问题得自己查;

  • 要长期改:不是一次性项目,几个月后还会回来加内容、改样式;

  • 预算和精力有限:不想在环境、构建、部署这些环节上反复折腾。

把这三条摆出来,"要不要上框架""要不要拆微服务"这类问题其实就不用纠结了。

二、前端:为什么不上框架

这是最容易被质疑的一点。现在的默认答案是 React / Vue,但对我这个场景,它们的收益和成本不匹配:

  • 这个站是内容型的:页面结构相对固定,交互集中在少数几个地方;

  • 上框架就要上构建工具链:多一层依赖,就多一层排错面;

  • SEO 是硬需求:内容站要靠搜索引擎带流量,服务端直接输出完整 HTML 最省事。

所以最后是 HTML + Tailwind + 原生 JavaScript:改完刷新就能看效果,不用等打包;页面里需要交互的地方,原生写也够用。

代价也说清楚:交互一旦复杂到某个程度,原生 JavaScript 会变得难维护 —— 这一点我认,到这个阶段就该换方案,而不是硬撑。

三、后端:为什么是 FastAPI

后端选型的重点是"改起来快"和"少写胶水代码"。FastAPI 在这两点上比较合手:

  • 类型标注就是校验:用 Pydantic 定义请求/响应模型,参数校验和错误提示不用自己写;

  • 自带接口文档:写完接口就有可交互的文档页,联调时省掉很多来回对齐;

  • Python 生态:数据处理、脚本、自动化都顺手 —— 一个人做全栈时这点很重要。

也对比过别的:Node 生态大,但我这边 Python 更熟;Java / Go 稳,对个人站来说是重型装备;PHP 部署简单,但类型和工具链的体验我不太想回头。

四、数据库:为什么是 MySQL

内容型站点的数据结构天然是关系型的:文章属于某个分组、分组有层级、标签和内容多对多。MySQL 的匹配度很高:

  • 关系、事务、约束都齐:刚好对应"内容 + 分组 + 标签"这类结构;

  • 生态最成熟:遇到问题基本都能搜到答案,工具链也全;

  • 和服务器默认环境兼容:部署时少一步折腾。

也考虑过:SQLite 单文件、零配置,本地开发很舒服,但作为线上主库,多连接和远程管理的体验一般;MongoDB 灵活,可这里的数据结构并不需要这种灵活 —— 用了反而少一层约束。

五、部署:够用就好

一台服务器 + Nginx 反向代理 + HTTPS。Nginx 同时承担静态资源和接口转发,页面、附件、接口都走同一个入口,配置一次基本不用动。

部署走脚本而不是手动传文件:少出低级错误,也方便回滚。

六、这套组合的边界

说清楚它不适合什么,比列优点更有用:

  • 页面交互很重:比如复杂后台、实时协作 —— 建议直接上框架;

  • 需要横向扩容、高并发:这套单机配置不够,得往前加缓存和队列;

  • 多人协作、要统一规范:前端构建链和类型系统值得补上。

结论

选型最实用的判断标准不是"哪个最好",而是"哪一组能让当下这个约束下的项目,持续做下去"。

这套组合没什么亮点,但它让一个人能长期维护 —— 对这个规模的项目,这就是最重要的指标。

感受/反思

选型这件事给我的教训是:不要拿"流不流行"当标准,要拿"我的约束是什么"当标准。同一套技术放在不同的人、不同的项目上,结论可能完全相反。

还有一点:把"不适合什么"写下来,比列优点更有用 —— 它能提醒你什么时候该换方案,而不是等到硬撑不下去才发现。

相关推荐

专题:全栈开发:从 0 到上线 —— 会把这里提到的每一块逐个展开。后续还会单独写部署脚本怎么写、Nginx 配置怎么做。