Lovable AI 构建工具的局限:何时用 Next.js 重写
Lovable的局限性:何时改写为Next.js
我已经看到这种模式重复了十多次。一个创始人在周末用Lovable快速制作了一个SaaS原型。看起来很棒。投资者印象深刻。用户注册。然后现实出现了:Google没有索引营销页面,添加团队工作区时身份验证流程中断,你的Supabase查询在租户间发生碰撞,你意识到自己在与工具对抗,而不是在构建产品。
Lovable在其所做的事情上真的给人留下深刻印象。但它有一个上限,如果你在构建真实的SaaS产品,你最终会触及它。这篇文章详细说明了Lovable的不足之处、何时应该计划迁移到自定义Next.js,以及如何在不失理智的情况下进行重写。
目录
- 理解Lovable的架构
- SEO问题:CSR对公共页面来说是死胡同
- 超越基本登录的身份验证复杂性
- 多租户数据:Lovable无法回答的地方
- 扩展超越初创SaaS
- 何时迁移:决策框架
- 如何处理重写
- Lovable vs 自定义Next.js:并排比较
- 常见问题

理解Lovable的架构
在谈论局限性之前,让我们明确Lovable实际生成的是什么。在引擎盖下,Lovable生成一个Vite + React应用程序,具有客户端渲染(CSR)。就是这样。没有服务器端渲染。没有静态站点生成。没有增量静态再生。纯CSR。
这不是什么秘密 - Lovable自己的关于渲染的常见问题承认了这一点。他们建议预渲染作为SEO的解决方法,他们坦诚SSR"在Lovable的当前设置中更难实现"。
生成的代码通常使用:
- React Router - 用于客户端导航
- Supabase - 用于身份验证和数据库
- Tailwind CSS - 用于样式设计
- shadcn/ui 组件
对于内部工具、身份验证后的仪表板或快速原型?这个技术栈完全没问题。当你的产品要求增长超过单页应用程序可以处理的范围时,问题就开始了。
Lovable做得好的地方
应该公平对待。Lovable在以下方面表现出色:
- 原型速度:你可以在几小时内拥有一个可工作的UI,而不是几周
- 设计质量:生成的界面开箱即用看起来很精细
- Supabase集成:基本的身份验证流程和CRUD操作可以快速工作
- 组件质量:它生成的shadcn/ui组件是生产级别的
问题不是质量 - 是范围。Lovable优化以尽可能快地达到v0.1。它不优化以达到v2.0。
SEO问题:CSR对公共页面来说是死胡同
这是最直接和最痛苦的限制,也是让创始人措手不及的限制。如果你的SaaS有任何面向公众的页面 - 营销网站、博客、文档、定价页面、应该可以索引的用户生成内容 - Lovable的CSR架构正在积极地与你对抗。
以下是爬虫访问Lovable生成的页面时会发生什么:
<!-- Googlebot(有时)看到的内容 -->
<!DOCTYPE html>
<html>
<head>
<title>My SaaS App</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/assets/index-abc123.js"></script>
</body>
</html>
从大多数爬虫的角度来看,那个空的<div id="root">就是你的整个页面内容。Google的Web渲染服务(WRS)可以执行JavaScript并渲染CSR内容,但这存在真正的问题:
- 这不保证。 Google可能会或可能不会渲染你的JavaScript。当它这样做时,从发现到渲染可能会有数小时至数天的延迟。
- 每个其他爬虫都失败。 LLM爬虫(GPTBot、ClaudeBot、PerplexityBot)、社交媒体链接预览程序(Facebook、LinkedIn、Twitter/X、Slack、Discord)、Bing的渲染器(不如Google的可靠)——这些都不能可靠地执行JavaScript。
- 社交分享被破坏。 在LinkedIn上分享Lovable页面,你会得到一个空白的预览卡。这对你试图增长的产品来说是一个可怕的第一印象。
- AI搜索可见性为零。 这在2026年变得越来越重要。如果Perplexity、ChatGPT搜索或Claude看不到你的内容,你在AI生成的答案中就不存在。
正如Nati Elimelech在一篇广泛分享的LinkedIn帖子中指出的那样:"Lovable的架构(Vite + React CSR)在根本上与现代爬虫要求不兼容。"
Lovable的预渲染解决方法
Lovable确实提供预渲染作为解决方法。这会在构建时将你的动态React应用转换为静态HTML。它适用于真正的静态页面——简单的着陆页、关于页面。但它在以下情况下会崩溃:
- 经常更新的博客内容(你需要在每次发布时重建)
- 动态产品页面(例如模板库、市场列表)
- 用户生成的公共资料
- 具有版本控制的文档
- 任何内容每天更改超过一次的页面
将其与Next.js进行对比,你可以获得每条路由的渲染控制:
// 在构建时进行静态生成(如博客文章)
export async function generateStaticParams() {
const posts = await getAllPosts();
return posts.map((post) => ({ slug: post.slug }));
}
// 在每个请求上进行服务器端渲染(如用户资料)
export const dynamic = 'force-dynamic';
// 增量静态再生(每60秒重新验证一次)
export const revalidate = 60;
Lovable根本无法提供这种每条路由的灵活性。当我们为客户构建Next.js项目时,这种粒度渲染控制通常是他们从CSR专用工具迁移的单一最大原因。
超越基本登录的身份验证复杂性
Lovable的Supabase集成处理基础:电子邮件/密码注册、魔法链接,也许是Google OAuth。这足以用于原型。这对生产SaaS来说不够。
以下是身份验证变得复杂且Lovable跟不上的地方:
基于角色的访问控制(RBAC)
真实的SaaS应用程序需要角色。一个所有者、管理员、成员、查看者的层级至少。当你在Lovable中时,实现RBAC意味着:
- 手工编写自定义Supabase RLS(行级安全)策略
- 在客户端管理角色状态(这对于授权决定本质上是不安全的)
- 在React组件中构建你自己的类似中间件的逻辑
在Next.js中,你在服务器级别处理授权,然后才发送任何内容:
// middleware.ts -- 在页面渲染前运行
import { NextResponse } from 'next/server';
import { createServerClient } from '@supabase/ssr';
export async function middleware(request) {
const supabase = createServerClient(/* config */);
const { data: { user } } = await supabase.auth.getUser();
if (!user) {
return NextResponse.redirect(new URL('/login', request.url));
}
const { data: membership } = await supabase
.from('team_members')
.select('role')
.eq('user_id', user.id)
.eq('team_id', extractTeamId(request.url))
.single();
if (membership?.role !== 'admin' && request.nextUrl.pathname.includes('/settings')) {
return NextResponse.redirect(new URL('/dashboard', request.url));
}
return NextResponse.next();
}
这在服务器上运行。未授权的用户永远看不到设置页面,永远不会收到HTML,永远不会获得JavaScript包。在CSR应用中,你发送代码并用客户端检查隐藏它——任何有动力的用户都可以绕过。
跨子域的会话管理
如果你的SaaS使用子域(如acme.yourapp.com),你需要跨子域工作的cookies、处理边缘情况的令牌刷新逻辑以及不在租户间泄漏的会话验证。Lovable不能给你服务器端基础设施来处理这个。你最终会拼凑在生产中中断的解决方法。
企业SSO(SAML/OIDC)
一旦你在向50多名员工的公司销售产品,有人会要求SAML或OIDC集成。这需要服务器端回调处理、令牌交换和安全会话创建。这从根本上是一个服务器端流。尝试在CSR专用应用中实现它就像与重力对抗。

多租户数据:Lovable无法回答的地方
多租户是SaaS的定义架构挑战。每个请求都需要限定在正确的组织范围内。每个查询都需要按租户进行过滤。每条数据都需要隔离保证。
Lovable给你Supabase,它可以通过RLS策略处理多租户。但应用程序级别的模式——路由、上下文、数据获取——完全取决于你,Lovable的AI不会生成多租户感知的代码。
两种模式
| 模式 | 示例 | 优点 | 缺点 |
|---|---|---|---|
| 基于路径 | app.com/[team]/dashboard |
简单托管,无DNS配置 | 对客户的品牌化程度较低 |
| 基于子域 | team.app.com |
更好的白标,更干净的URL | 需要通配符SSL、DNS配置、中间件路由 |
Next.js原生支持两者。App Router的动态段优雅地处理基于路径的路由:
app/
[teamSlug]/
dashboard/
page.tsx
settings/
page.tsx
billing/
page.tsx
对于基于子域的路由,Next.js中间件可以在任何页面代码运行前提取子域并解析租户:
// middleware.ts
export function middleware(request) {
const hostname = request.headers.get('host');
const subdomain = hostname?.split('.')[0];
// 重写URL以包含租户上下文
if (subdomain && subdomain !== 'www' && subdomain !== 'app') {
return NextResponse.rewrite(
new URL(`/${subdomain}${request.nextUrl.pathname}`, request.url)
);
}
}
在Lovable中,你会用React Router和自定义hooks来连接这个,进行客户端获取调用来解析租户,并处理加载状态期间的错误租户内容闪烁。我见过这种情况出错。这不漂亮。
数据隔离问题
最可怕的多租户bug是数据泄漏——向租户B显示租户A的数据。在服务器渲染架构中,你可以在发送响应之前在数据层强制租户范围化。在CSR中,你信任客户端代码将正确的租户ID传递给你的API,并希望你的RLS策略捕获其他所有内容。
RLS是你的安全网,而不是你的主要防御。你的主要防御应该是在每个请求上验证租户上下文的服务器端中间件。Lovable没有给你那一层。
扩展超越初创SaaS
有一组问题直到你拥有真实用户、真实数据和真实的业务需求时才会出现。Lovable生成的代码不是为这些场景设计的。
规模化性能
一个Lovable应用程序以JavaScript包的形式发送你的整个应用程序。随着你的应用增长,包也会增长。React Router将所有内容加载到客户端内存中。使用较慢连接或较旧设备的用户会感觉到这一点。
Next.js在路由级别提供自动代码分割。导航到/dashboard,你只加载仪表板代码。导航到/settings,只有设置代码加载。这是自动的——你不需要配置它。
后台作业和服务器逻辑
真实的SaaS应用程序需要:
- Webhook处理程序(Stripe、SendGrid、第三方集成)
- 计划的作业(计费周期、报告生成、数据清理)
- 带有服务器端模板的电子邮件发送
- PDF生成
- 文件处理
这些在CSR专用应用中都不可能。你需要一个单独的后端。使用Next.js,你可以直接处理webhooks和服务器逻辑:
// app/api/webhooks/stripe/route.ts
export async function POST(request: Request) {
const body = await request.text();
const sig = request.headers.get('stripe-signature');
const event = stripe.webhooks.constructEvent(body, sig, webhookSecret);
switch (event.type) {
case 'customer.subscription.updated':
await updateSubscription(event.data.object);
break;
case 'invoice.payment_failed':
await handleFailedPayment(event.data.object);
break;
}
return Response.json({ received: true });
}
这是一个运行服务器端代码的真实API端点,在与前端相同的代码库中。没有单独的Express服务器。没有单独的部署。
测试和CI/CD
Lovable生成的项目不包含测试基础设施。没有单元测试,没有集成测试,没有E2E测试。对于原型,那没问题。对于处理客户付款和敏感数据的生产SaaS,这是一个责任。
Next.js项目自然地与Jest、Vitest、Playwright和Cypress集成。你可以隔离地测试服务器组件、API路由和中间件。
何时迁移:决策框架
并非每个Lovable项目都需要重写。这是一个实用框架:
坚持使用Lovable如果:
- 你处于产品市场匹配前阶段,仍在验证
- 你的应用程序完全在身份验证后(公共页面不需要SEO)
- 你有单租户模型(一个用户,一个账户)
- 你是一个内部工具或管理面板
- 你的团队没有开发人员资源
计划迁移如果:
- 你需要来自公共页面的有机搜索流量
- 你在添加团队/组织工作区
- 企业客户要求SSO
- 你的Supabase RLS策略变成了一团乱麻
- 你需要服务器端集成(webhooks、支付处理)
- 页面加载时间随着你的应用增长而增加
- 你花在与Lovable对抗上的时间比构建功能更多
立即迁移如果:
- 你经历过(或几乎经历过)多租户数据泄漏
- Google Search Console在重要页面上显示索引失败
- 你因SSO/安全需求而失去交易
- 你的客户包大小超过500KB gzipped
如何处理重写
你能做的最糟糕的事是尝试一个大爆炸重写,在这个重写中你从零开始重建一切并切换开关。这就是重写失败的方式。
陌生人无花果树模式
最聪明的方法是增量式的。在你的Lovable应用旁边部署你的Next.js应用,并一次迁移一条路由。
- 从公共页面开始。 将你的营销网站、博客和文档移至Next.js,具有适当的SSR/SSG。这为你提供了即时的SEO胜利。
- 移动身份验证层。 在Next.js中间件中实现你的身份验证流。这是最难的部分——尽早进行。
- 逐个功能迁移。 从最简单的页面开始,朝着最复杂的页面努力。
- 重用你的组件。 Lovable生成React组件。大多数组件都能在Next.js中以最小改动工作——主要是删除React Router依赖并转换为基于文件的路由。
甚至还有一个CLI工具(NextLovable)可以自动化一些结构转换:
npx @nextlovable/cli convert ./src/components/ -f app-router
它处理从Lovable平面组件目录到Next.js App Router嵌套布局模式的文件结构转换。它不会处理你的业务逻辑,但它可以节省数小时的繁琐文件移动。
预算是什么
中等复杂度SaaS的现实迁移时间表(10-20页、身份验证、基本多租户):
| 阶段 | 时间线 | 工作量 |
|---|---|---|
| 公共页面 + SEO | 1-2周 | 低 |
| 身份验证 + 中间件 | 2-3周 | 高 |
| 仪表板迁移 | 3-4周 | 中 |
| API路由 + webhooks | 1-2周 | 中 |
| 测试 + QA | 1-2周 | 中 |
| 总计 | 8-13周 | -- |
如果你不想花三个月进行迁移,那正是我们处理的项目类型。我们已经做了足够多的项目,知道地雷在哪里。
Lovable vs 自定义Next.js:并排比较
| 功能 | Lovable(Vite + React CSR) | 自定义Next.js |
|---|---|---|
| 原型速度 | 数小时 | 几天到几周 |
| SSR / SSG / ISR | ❌ 无(仅预渲染) | ✅ 完整支持,每条路由 |
| 公共页面的SEO | ⚠️ 差(取决于Google的JS渲染) | ✅ 优秀 |
| AI搜索可见性 | ❌ 对LLM爬虫不可见 | ✅ 完全可见 |
| 社交预览卡 | ❌ 破损 | ✅ 动态OG图像 |
| 多租户 | ⚠️ 手动,仅客户端 | ✅ 中间件 + 服务器端 |
| 身份验证(基本) | ✅ Supabase集成 | ✅ 多个提供程序 |
| 身份验证(企业SSO) | ❌ 无服务器端支持 | ✅ SAML/OIDC支持 |
| API路由 | ❌ 需要单独的后端 | ✅ 内置 |
| 代码分割 | ⚠️ 手动 | ✅ 每条路由自动 |
| 测试基础设施 | ❌ 无生成 | ✅ 完整生态系统 |
| 部署灵活性 | Lovable托管或Netlify/Vercel(静态) | Vercel、AWS、Docker、自托管 |
| 规模化成本 | 20-50美元/月(Lovable)+ Supabase | 托管变化(0-200美元+/月) |
常见问题
我可以为我的SaaS营销网站使用Lovable,为应用使用Next.js吗? 你可以,但它会造成维护开销。你会有两个代码库、两个部署管道,可能还有不一致的设计。一个更好的方法是在Next.js中构建所有内容——为营销页面使用静态生成,为应用使用服务器组件。如果你已经在Lovable上,首先开始迁移只是公共页面到Next.js,并保持应用在Lovable上直到你准备好进行完整迁移。
Lovable的预渲染解决了SEO问题吗? 部分解决。预渲染在构建时生成静态HTML,爬虫可以读取。它适用于很少改变的页面——关于页面、定价页面。但它不适用于动态内容,如经常更新的博客文章、用户生成内容或市场列表。你需要在内容改变每次都触发重建,这变得很不切实际。Next.js的ISR(增量静态再生)通过按计划或按需重新验证页面来优雅地处理这个问题。
一个Lovable到Next.js的迁移通常成本是多少? 对于简单原型(5-10页、基本身份验证),预期2-4周开发人员时间。对于具有多租户、自定义身份验证流和API集成的中等复杂度SaaS,预算8-13周。以代理机构费率,这大约是15,000美元-50,000美元,取决于复杂性。你可以查看我们的定价获取具体信息,或与我们联系获取基于你实际代码库的范围估算。
可以从Lovable逐步迁移到Next.js吗? 绝对可以,这是推荐方法。使用陌生人无花果树模式:在你的Lovable应用旁边部署Next.js,一次迁移一条路由,从公共页面开始,并使用反向代理或DNS路由从同一域提供两个应用。NextLovable的CLI工具可以自动化部分结构转换。
Astro而不是Next.js用于公共页面呢? Astro对于具有最少交互性的内容丰富网站来说很棒。如果你的公共页面主要是静态营销内容,而你的应用是一个单独的SPA,Astro是一个很好的选择。但如果你想要一个统一的代码库用于营销页面和你的动态应用,Next.js是更实用的选择。我们根据客户的需求同时使用两者构建——这归结为你的公共页面需要多少交互性。
我的Lovable React组件会在Next.js中工作吗?
大多数会有细微改动。主要改动是:删除React Router导入并改用Next.jsLink和useRouter,为使用useState或useEffect等hooks的组件添加'use client'指令,并替换任何Lovable特定工具。组件逻辑和样式(Tailwind类、shadcn/ui组件)直接转移。
如果我不是开发人员——我仍然可以离开Lovable吗? 是的,但你需要开发人员帮助。迁移是一个技术项目。你可以雇用自由职业Next.js开发人员、使用无头开发代理如我们,或使用NextLovable CLI获得一个起始点,然后为复杂部分引入帮助。好消息是Lovable生成的代码是干净和结构良好的,这使开发人员比大多数AI生成代码库更容易处理。
在2026年Lovable仍然是正确选择何时? Lovable理想用于内部工具、管理面板、身份验证后的仪表板、向投资者展示的MVP以及用户测试的快速原型。如果团队外的任何人都不需要通过搜索找到你的应用,你也不需要复杂的身份验证或多租户,Lovable可以让你走得惊人之远。关键是要诚实地对待自己何时已经超出了它——而不是等到技术债务压垮你才开始计划迁移。