Vite SaaS 十分钟迁移 Next.js 实录
译注:本文翻译自 dev.to 文章《I Migrated My Vite SaaS to Next.js in 10 Minutes — Here's What Happened》,作者记录了自己将基于 Vite + React 的 SaaS 产品迁移到 Next.js 的过程与性能对比。原文链接见文末。
架构的十字路口
过去一年,我的 SaaS 一直运行在标准的 Vite + React SPA 架构上。它速度快、开发体验(DX)一流,部署到 S3/CloudFront 的成本也极低。但随着产品逐渐成熟,我撞上了那堵不可避免的墙:深层链接完全没有 SEO,初始包体积开始膨胀,影响了 Core Web Vitals。
解决方案显而易见:Next.js。但一想到要手动重写路由逻辑、处理 SSR 中的 window is not defined 报错、重构状态管理,我就迟迟没有动手,在 Vite 上多待了好几个月。
于是我决定看看能否把繁重的迁移工作自动化。本文将介绍我为什么迁移、过程如何,以及切换后看到的性能差异。
为什么从 Vite 迁到 Next.js?
在深入迁移之前,有必要理解其中的取舍。Vite 是一款出色的构建工具,但它本质上是一个客户端编排器。
- SEO 与元数据:使用 Vite 时,你往往只有一个
index.html。虽然可以用react-helmet,但搜索引擎在索引动态内容时仍更偏好服务端渲染的 HTML。 - 图片优化:Next.js 提供
next/image组件,自动处理 WebP 转换和懒加载。在 Vite 项目中手动实现这些需要大量样板代码。 - API 路由:把后端逻辑迁移到
/api路由后,我可以为简单的数据库查询省掉一个独立的 Node.js 服务器,显著降低了基础设施复杂度。
迁移策略
传统的迁移路径是新建一个 Next.js 项目,手动复制组件,同时把 react-router-dom 换成 next/navigation。
我没有手工操作,而是使用 ViteToNext.AI 自动完成组件映射和路由逻辑,一次性处理了大部分繁琐的目录结构重组工作。
第一步:处理全局 CSS 与静态资源
在 Vite 中,你通常在 main.tsx 里引入 CSS。在 Next.js 中,这一步移到 layout.tsx 或 _app.tsx。
// Before (Vite)
import './index.css'
// After (Next.js layout.tsx)
import '../styles/globals.css'
export default function RootLayout({ children }) { ... }第二步:路由的转变
这通常是最难的部分。我的 Vite 应用使用 BrowserRouter 和嵌套路由。而在 Next.js 中,目录结构就是路由器。
/src/pages/Dashboard.tsx变成/app/dashboard/page.tsx- 动态路由如
/user/:id变成/app/user/[id]/page.tsx
第三步:处理客户端组件
从 Next.js 13 起,组件默认是服务端组件。我必须审查所用库:任何使用 useState、useEffect 或仅浏览器可用 API(如 localStorage)的组件,都需要在文件顶部加上 'use client'; 指令。
十分钟后的结果
自动化迁移工具完成繁重工作后,我花了大约 5 分钟修复了几个与 process.env 和 import.meta.env 相关的 TypeScript 报错。
性能对比
| 指标 | Vite (SPA) | Next.js (SSR/ISR) |
|---|---|---|
| First Contentful Paint | 1.8s | 0.6s |
| Time to Interactive | 2.4s | 1.1s |
| Lighthouse SEO 得分 | 82 | 100 |
最明显的差异是感知速度。由于初始 HTML 是预渲染下发的,用户不会在 JavaScript 包下载期间盯着白屏。
经验教训
- 环境变量:记住,若想让
VITE_变量在浏览器中可访问,必须重命名为NEXT_PUBLIC_。 - 第三方库:一些较老的 UI 库与服务端组件不兼容,用客户端组件桥接是必要的妥协。
- 数据获取:从
useEffect获取数据改为服务端 Server Actions 和fetch()后,我的客户端包体积减少了近 40kb。
结语
迁移到 Next.js 不一定非得是耗时数周的工程冲刺。借助自动化工具并理解路由的根本差异,你可以在一个下午内完成技术栈的现代化。SEO 和用户体验上的收益,远超迁移初期的不适。
延伸阅读:ViteToNext.AI 迁移工具