Skip to content

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 是一款出色的构建工具,但它本质上是一个客户端编排器。

  1. SEO 与元数据:使用 Vite 时,你往往只有一个 index.html。虽然可以用 react-helmet,但搜索引擎在索引动态内容时仍更偏好服务端渲染的 HTML。
  2. 图片优化:Next.js 提供 next/image 组件,自动处理 WebP 转换和懒加载。在 Vite 项目中手动实现这些需要大量样板代码。
  3. API 路由:把后端逻辑迁移到 /api 路由后,我可以为简单的数据库查询省掉一个独立的 Node.js 服务器,显著降低了基础设施复杂度。

迁移策略 ​

传统的迁移路径是新建一个 Next.js 项目,手动复制组件,同时把 react-router-dom 换成 next/navigation。

我没有手工操作,而是使用 ViteToNext.AI 自动完成组件映射和路由逻辑,一次性处理了大部分繁琐的目录结构重组工作。

第一步:处理全局 CSS 与静态资源 ​

在 Vite 中,你通常在 main.tsx 里引入 CSS。在 Next.js 中,这一步移到 layout.tsx 或 _app.tsx。

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 Paint1.8s0.6s
Time to Interactive2.4s1.1s
Lighthouse SEO 得分82100

最明显的差异是感知速度。由于初始 HTML 是预渲染下发的,用户不会在 JavaScript 包下载期间盯着白屏。

经验教训 ​

  1. 环境变量:记住,若想让 VITE_ 变量在浏览器中可访问,必须重命名为 NEXT_PUBLIC_。
  2. 第三方库:一些较老的 UI 库与服务端组件不兼容,用客户端组件桥接是必要的妥协。
  3. 数据获取:从 useEffect 获取数据改为服务端 Server Actions 和 fetch() 后,我的客户端包体积减少了近 40kb。

结语 ​

迁移到 Next.js 不一定非得是耗时数周的工程冲刺。借助自动化工具并理解路由的根本差异,你可以在一个下午内完成技术栈的现代化。SEO 和用户体验上的收益,远超迁移初期的不适。

延伸阅读:ViteToNext.AI 迁移工具

原文链接 ​