从Vue前端到全栈,我是怎么选定这套技术栈的?(含完整选型理由)
「Vue前端转全栈实战」系列第二篇。上一篇写了我为什么决定转型,这篇把所有技术选型的完整思考过程记录下来。每一个「为什么选它」背后都有具体原因,不是跟风,是真的想清楚了再学。
先看整体技术栈全貌
在展开讲之前,先把这套组合完整列出来:
| 层级 | 技术 | 备选方案 |
|---|---|---|
| 前端框架 | Vue3 + TypeScript | React、Angular |
| 状态管理 | Pinia | Vuex |
| 构建工具 | Vite | Webpack、Rollup |
| 后端框架 | Node.js + Express | Python/FastAPI、Go/Gin |
| ORM | Prisma | TypeORM、Sequelize、直写SQL |
| 数据库 | PostgreSQL | MySQL、MongoDB |
| 缓存 | Redis | Memcached |
| 认证方案 | JWT | Session、OAuth2 |
| 部署平台 | Railway(后端)+ Vercel(前端) | 自建VPS、阿里云 |
| CI/CD | GitHub Actions | Jenkins、GitLab CI |
| AI集成 | Claude / OpenAI API | 本地模型 |
| 测试框架 | Vitest | Jest、Mocha |
| 桌面端 | Electron(了解) | Qt、Tauri |
看起来很多,但选型逻辑其实很清晰:每一个选择都服务于同一个目标------用最短的时间,让一个Vue开发者能独立交付完整的全栈产品。
下面逐一展开。
一、前端部分
Vue3 ✅ 继续用,不换React
这个不需要太多解释------我已经用了三年,切换React意味着重新建立心智模型,时间成本不值得。
但有一点值得说:Vue3和Vue2是两个不同的框架,Composition API的思维方式和Options API差异很大。很多「会Vue」的开发者其实停留在Vue2阶段,真正掌握Vue3 Composition API是这次升级的第一个目标。
选Vue3的另一个原因是Nuxt3------它是基于Vue3的全栈框架,让前端开发者用最低成本做出全栈应用。后续如果想快速出产品,Nuxt3是一条捷径。
TypeScript ✅ 从可选变必选
以前在公司项目里用TS,但用得比较浅------大量的any、类型定义不完整。这次决定把TS真正用起来,原因有三个:
第一,前后端类型共享。 用Prisma生成的数据库模型类型,可以直接在Vue组件里使用,不需要前后端各自维护一套类型定义,接口对接时的类型错误大幅减少。
第二,重构更安全。 项目大了之后,改一个函数签名会影响几十个调用方。有TS的情况下,编译器直接告诉你哪里出错了;没有TS,只能靠运行时报错发现问题。
第三,面试加分。 现在3-5年经验的前端岗位,TypeScript基本是硬要求。不会TS=自动筛掉一批机会。
Pinia ✅ 而不是Vuex
Vuex4虽然支持Vue3,但API设计上有历史包袱------mutations、actions、getters的分层在小型项目里显得繁琐。
Pinia的优势很具体:
- 更简洁:直接定义state、getter、action,没有多余的概念
- TS友好:类型推断开箱即用,不需要额外配置
- Vue官方推荐:Vuex已经进入维护模式,Pinia是官方钦定的继任者
唯一的迁移成本是老项目里的Vuex代码,但新项目直接用Pinia就好,没有争议。
Vite ✅ 而不是Webpack
这个选择现在几乎没有争议,但还是说一下原因:
Webpack的配置复杂度在中大型项目里是真实的痛点,冷启动慢、热更新慢,开发体验差。Vite基于ES Module的开发服务器,冷启动速度是Webpack的10-100倍,热更新几乎是即时的。
对于新项目,没有理由选Webpack。对于老项目迁移,Vite也有官方迁移指南,成本可控。
Vitest ✅ 而不是Jest
选Vitest的原因只有一个:它和Vite生态完全兼容,不需要额外的配置就能在Vue3+Vite项目里运行测试。Jest需要处理ES Module兼容问题,配置成本不低。
测试这块很多前端开发者是缺失的,这次会认真补上,从组件测试开始写起。
二、后端部分
Node.js + Express ✅ 而不是Python或Go
这是整个技术选型里最关键的一个决定,我纠结了比较长时间。
为什么不选Python?
Python在AI/ML领域是第一选择,LangChain、RAG管道、向量处理这些工具的Python生态远比JS丰富。但我的目标是在前端产品里集成AI能力,不是成为AI工程师------调用OpenAI/Claude API、处理流式响应、管理对话上下文,这些用Node.js完全够用。
如果后续需要更复杂的AI后端(比如自己训练模型、处理大量embedding),再学Python也不迟。现在用Python意味着切换语言、重新建立生态认知,时间成本不划算。
为什么不选Go?
Go的性能优势是真实的,高并发场景下比Node.js强很多,薪资溢价也确实存在。但对于一个Vue开发者来说,Go是完全陌生的语言,学习曲线比Node.js陡峭得多。
更重要的是:我现在做的产品不需要Go级别的性能。 一个全栈项目,在用户量没到一定规模之前,Node.js的性能完全够用。等到真的遇到性能瓶颈,那时候有足够的业务价值支撑你去学Go。
为什么选Node.js?
核心原因就一个:语言复用。
async/await、Promise、模块系统、npm包管理------这些我已经用了三年。切换到Node.js后端,我只需要学「怎么做后端」,不需要同时学「新语言」。这个差别在实际执行时非常重要,能让学习效率提升一倍以上。
另外,TypeScript在Node.js上的支持非常成熟,前后端可以共享类型定义,这在实际开发中极大减少了接口对接的摩擦。
为什么是Express而不是Fastify或Koa?
Express的生态最成熟,遇到问题社区资料最多。对于入门阶段来说,这比性能差异重要得多。Fastify性能更好,等Express用熟了迁移也很简单。
Prisma ✅ 而不是TypeORM或直写SQL
直写SQL不是不行,但对于从前端转过来的人,SQL的学习曲线和心智负担是真实存在的。ORM工具可以让你用面向对象的方式操作数据库,降低入门门槛。
那为什么是Prisma而不是TypeORM或Sequelize?
Prisma的Schema文件是核心优势。 你在一个.prisma文件里定义数据模型,Prisma自动生成:
- 数据库迁移文件(不需要手写SQL建表)
- 完整的TypeScript类型定义
- 类型安全的查询客户端
这意味着什么?你改了数据库Schema,TypeScript类型自动更新,Vue前端里用到这个类型的地方,编译器直接告诉你哪里需要跟着改。数据库、后端、前端的类型是同一个来源,不会出现字段不一致的问题。
TypeORM虽然也支持TypeScript,但配置复杂,装饰器语法在Vue3的Composition API思维下显得格格不入。Sequelize的TS支持是事后添加的,不如Prisma原生。
PostgreSQL ✅ 而不是MySQL或MongoDB
为什么不选MySQL?
MySQL是更广泛使用的数据库,教程更多,上手更容易------这些都是事实。但我选PostgreSQL有一个很具体的理由:pgvector插件。
pgvector让PostgreSQL支持向量数据的存储和相似度查询。这是做RAG(检索增强生成)类AI应用的核心基础设施------用户上传文档,把文档内容转成向量存进数据库,查询时找出最相关的段落喂给LLM。
如果用MySQL,到了第三阶段做AI应用时,要么引入专门的向量数据库(Pinecone、Weaviate等,有额外学习和费用成本),要么换数据库。PostgreSQL一个搞定,不需要到时候再切换。
另外PostgreSQL的类型系统更严格、JSON支持更强、事务处理更可靠,和TypeScript的配合也更自然。
为什么不选MongoDB?
MongoDB的无Schema设计在快速原型阶段确实灵活,但随着项目复杂度增加,数据一致性问题会变得麻烦。更重要的是,关系型数据库的思维方式是后端开发的基础能力,MongoDB的文档模型是特定场景的补充,不应该作为学全栈的第一个数据库。
Redis ✅ 缓存和任务队列
Redis在这个技术栈里承担两个角色:
第一个是缓存。 频繁查询的数据(用户信息、配置项)存到Redis里,减少数据库查询压力,接口响应速度提升明显。
第二个是任务队列。 用BullMQ(基于Redis的Node.js任务队列库)处理异步任务------比如用户上传文档后,解析文档、生成embedding、存入向量数据库这一系列操作不应该堵塞HTTP响应,放到后台任务队列里异步处理。
Redis不是第一阶段就要学的,在全栈基础搭好之后再引入。
JWT ✅ 而不是Session
这两种认证方案各有适用场景,选JWT的原因是:
前后端分离架构下,JWT更自然。 Session需要服务端存储状态,在多实例部署时需要Session共享(通常也是用Redis),架构复杂度增加。JWT是无状态的,服务端不存任何东西,Token本身携带了用户信息,天然适合前后端分离的部署模式。
需要注意的是JWT也有缺点------Token一旦签发无法主动失效(除非引入黑名单机制)。这个问题用Refresh Token机制解决:Access Token短期有效(15分钟),Refresh Token长期有效(7天),Access Token过期后用Refresh Token换新的。
三、部署部分
Railway(后端)+ Vercel(前端)✅ 而不是自建VPS
自建VPS(阿里云、腾讯云)的运维成本对于个人项目来说太高了------配置Nginx、管理SSL证书、处理服务器安全更新,这些都需要时间。
Railway和Vercel解决了这个问题:
Vercel 部署Vue前端只需要连接GitHub仓库,每次push自动触发部署,HTTPS自动配置,全球CDN加速,免费套餐完全够个人项目用。
Railway 部署Node.js后端同样支持GitHub自动部署,内置PostgreSQL和Redis托管服务,不需要自己管数据库实例。免费套餐有用量限制,但对于学习阶段的项目足够了。
学到一定阶段再考虑迁移到VPS,那时候有足够的理由(成本控制、定制化需求)支撑这个决定。
GitHub Actions ✅ CI/CD自动化
每次push代码,自动运行测试、自动部署------这是现代工程化的基础配置,不是高级技巧。
选GitHub Actions的原因是:代码已经在GitHub上,Actions和仓库原生集成,配置成本最低。Jenkins功能更强大,但对于个人项目来说是杀鸡用牛刀。
四、AI集成部分
Claude / OpenAI API ✅ 而不是本地模型
本地部署模型(Ollama、LM Studio)有数据隐私优势,但对硬件要求高,模型能力也弱于GPT-4/Claude这类顶级模型。
对于学习阶段,API调用是最低成本的入门方式------注册账号,几行代码就能调通,不需要关心模型部署和硬件配置。
关于Claude和OpenAI的选择:两者API设计非常相似,学会一个基本等于学会了另一个。建议都注册,根据具体场景选用。Claude在长文本处理和代码理解上表现不错,OpenAI的生态工具更丰富。
重要:API Key一定要放在后端,绝对不能暴露在前端代码里。 通过Node.js后端做代理层,前端只和自己的后端通信,后端再调用LLM API。
五、桌面端部分
Electron ✅ 了解基础即可,Qt暂不碰
我在公司项目里会接触到桌面客户端开发,领导在考虑用Qt替换Electron。我的判断是:
Electron学基础,Qt现在不碰。
Electron的本质是Chromium + Node.js,学Node.js的过程中顺带了解主进程/渲染进程通信(ipcMain/ipcRenderer)、系统API调用、应用打包(electron-builder),额外成本很低,而且这个知识点可以直接用在公司项目里。
Qt是C++框架,和我现有的Vue/JS技术栈完全割裂,而且Qt开发者的市场需求集中在特定垂直领域(音视频、工业软件、嵌入式),跳槽池子比前端/全栈小得多。
在公司技术选型没有最终确定之前,押注Qt学习风险太高。等确定了,如果真的要用Qt,届时公司应该有专门的培训或者资源支持,而不是指望前端开发者自学C++。
总结:选型的底层逻辑
把所有选择放在一起,背后其实只有一条逻辑:
最大化已有技术积累的复用,最小化切换成本,同时保证12个月后的跳槽竞争力。
- Node.js:复用JS语言能力
- Prisma:复用TypeScript类型思维
- PostgreSQL:一个数据库覆盖业务和AI两个场景
- Railway + Vercel:最低运维成本快速上线
- Electron了解基础:和公司项目直接挂钩
没有最好的技术栈,只有最适合当前阶段的技术栈。这套组合在12个月内可以落地,做出真实可访问的产品,这才是选它的理由。
下一篇:「TypeScript 入门第一周,Vue 开发者最容易懂的学习路径」
系列持续更新,欢迎关注。有问题欢迎评论区交流。