---
title: "从 Lovable 和 Cursor 原型到生产 - 博客"
canonical: https://wavect.io/zh/blog/lovable-cursor-prototype-to-production/
language: zh
description: "用 Lovable、Cursor、Claude Code、Bolt、v0 或 Replit 做到 demo 很快。做到生产是一个独立的项目。这是 Wavect 用来给 AI 原型做加固的迁移清单。"
image: "https://wavect.io/img/blog/headers/header_lovable-cursor-prototype-to-production.png"
---

[**返回**](/zh/blog/overview/)

[![Christof Jori](/img/team/christof.webp)](/zh/team/christof-jori/)

[Christof Jori](/zh/team/christof-jori/) https://linkedin.com/company/wavect

8 分钟 阅读 · 08 Jun 2026

[**下一篇**](/zh/blog/qa-for-ai-generated-code/)

# 从 Lovable 和 Cursor 原型到生产：迁移清单

要点速览

Lovable、Cursor、Claude Code 这类 AI IDE 几天就能做出可点击的原型，但"demo 能跑"和"真实用户能靠它办事"之间是一个有自身工作量的独立项目。迁移清单：把认证和数据访问检查全部放到服务端、迁到自己拥有的数据库并测试恢复、密钥挪出客户端并轮换暴露过的、搭好 CI/CD 回滚与可观测性，再决定生成代码哪些保留哪些重建。典型加固周期一到三周，是区间不是报价。

相关服务: [Vibe Coding Rescue](/zh/services/vibe-coding-rescue/)

Lovable、Cursor、Claude Code、Bolt、v0 或 Replit 这类 AI IDE，能在几天内把你带到一个可点击的产品。这是实打实的进展，也是容易的那一半。"demo 能跑" 和 "真实用户能靠它办事" 之间的距离，是一个独立的项目，有它自己的工作量，假装不是这样，正是上线出岔子的方式。这是当一个原型需要变得生产级时，我们所跑的清单。

这些都不是在挑工具的毛病。我们自己也是这么起步的。这是一张工作地图，标出那些不会自己发生的活，好让你能事先规划，而不是在事故中才发现。

## "生产" 到底意味着什么？

demo 证明想法成立。生产环境则要扛住重量。区别不在于打磨，而在于一组没人会注意到、直到它缺席才被看见的保证。

- **立得住的认证。** 真实账户、真实会话，以及一条硬规则：一个用户碰不到另一个用户的数据。
- **数据完整性。** 写操作要么完成，要么干净回滚，还有一个你信得过、下个月仍然正确的存储。
- **可用性。** 一次部署，能扛过重启、流量高峰和一次糟糕的发布，不需要人工抢救。
- **安全。** 浏览器里没有密钥，没有敞开的端点，没有一个你没看过的依赖。
- **可观测性。** 凌晨两点出问题时，你是从工具那里知道的，不是从客户那里。
- **支持。** 有办法回答 "我的订单怎么了"，而不用靠猜。

一个原型可以把上面每一条都跳过，仍然演示得完美。这恰恰是为什么 demo 不是终点线。

## 第 1 步：怎么锁死认证与数据访问？

这是我们最先检查的，也是最常出错的。AI IDE 很擅长做一个登录页，很不擅长执行登录之后该发生什么。前端把按钮藏了起来，但 API 仍然会回应任何来问的人。

每一次访问检查都必须放在服务端。把授权彻底从客户端挪出去，放到读写数据的地方去执行。如果你的产品是多租户的，就按租户或按行做隔离，让一个账户在物理上无法查询另一个账户的记录，最好在数据库层，而不是在那种你每个端点都得记着去加的应用逻辑里。前端检查是一种 UX 上的体贴。它不是安全，也从来都不是。

## 第 2 步：为什么要掌握自己的数据层？

很多原型工具会塞给你一个方便的共享或临时数据存储，好让你先动起来。这对 demo 很棒，对生产却是错的。它的备份、上限和寿命都不归你管，而 "数据被重置了" 不是一句你想对付费用户说的话。

迁到一个你自己拥有的、真正托管的数据库，多数情况下是 Postgres。把你的 schema 纳入版本化的迁移，让变更可重复、可评审，而不是在某个仪表盘上点出来的。打开自动备份，并真的做一次恢复测试，因为一个你从没恢复过的备份是一种期望，不是备份。这通常是最不光鲜的一步，也是替你挡掉最糟那一天的一步。

## 第 3 步：密钥与环境

原型会泄露密钥。工具为了让示例能跑，把一个 API key 内联进去，它最后落进客户端打包产物或仓库历史里，谁都能读到。这里的第一件事，是把每一个密钥从客户端拿出来，放到服务端，藏到你自己的后端后面。

然后分开你的环境。dev、staging 和生产应该各有各的密钥和各的数据，这样一次测试永远碰不到真实客户，staging 里的一个错误也不会向任何人收费。还有，凡是曾经暴露过的，统统轮换。一个待过客户端代码或公开 commit 的密钥就是已被泄露，不管你有没有它被用过的证据。轮换它花一个小时。假设它没事，可能要付出多得多的代价。

## 第 4 步：托管、CI/CD、回滚、可观测性

跟你的 AI IDE 一起捆绑来的那个原型托管，是为展示而造的，不是为运行而造的。在你开始依赖它之前，先迁到一套真正的部署设置。这意味着：一条在 push 时构建并发布的流水线，一种能在几秒内回滚到上一个好版本的办法，以及一个 staging 环节，让变更在用户看到之前先被看到。

然后，加上眼睛。错误追踪，在有东西抛异常时告诉你；基本的可用性监控；以及足够的日志，好让你事后能回答 "发生了什么"。目标很简单：你应该从你的工具那里知道有问题，而不是从一条愤怒的消息那里。没有这一层，你就是在盲飞，而麻烦的第一个信号，是一个已经流失的用户。

## 第 5 步：生成的代码什么时候保留，什么时候重建？

并非所有生成的代码都得扔掉，也并非所有都值得留下。诚实的答案是：取决于问题住在哪里。表层的漏洞，在你已有的东西之上去补很便宜。地基层面的就不是。

当数据模型扎实、结构可读、漏洞只是上面那些可预期的项时，就保留地基：认证、校验、错误处理、密钥。这些都是在一个像样的基础上做的加法式修复。当数据模型错得让其余一切都依赖于它，或者同一个坏模式被复制到了整个代码库、以至于每个修复都得做上一百遍时，就重建核心。给一个本该重新浇筑的地基打补丁，是省钱最贵的方式，而我们会在第一通电话里就说出来，而不是收你那条绕远路的钱。

![Christof Jori](/img/team/christof.webp)

"原型从来都不是项目本身。做到一个 demo 是一件活，做到生产是另一件活，第二件不会因为第一件快就变便宜。"

## 要多久，要多少钱？

从经验看，对一个典型的 AI 构建的原型，一轮聚焦的加固跑下来是一到三周。这是一个区间，不是报价，它会因两件事而移动：产品触碰多少真实金钱或敏感数据，以及工具在无人掌舵的情况下跑了多远。一个只读的内部工具落在短的那头。一个收款并存储个人数据的产品落在长的那头，可能还需要更多。

我们不会做的，是在还没看之前就给你一个精确数字。谁要是为一个他没见过的代码库报一个固定数，那是在猜，而猜测总是偏乐观。我们在先看一眼之后再定范围，如果诚实的答案是 "重建核心"，你会最先听到，而不是在第三周才听到。这项工作的详细版本，是我们的 [软件 QA 服务](/zh/services/software-quality-assurance/) ，而它背后的失效模式，在 [AI 生成代码的 QA](/zh/blog/qa-for-ai-generated-code/) 里讲过。

## 最终思考

构建原型是快的那一半，你跑得快是对的。生产是那一半，本来就注定要花真功夫，而这功夫不会因为第一稿是模型写的就消失。它会一直等到上线那天，那时候发现它，代价最贵。

在你把真实用户放到一个 AI 构建的产品上之前，先把这份清单过一遍。如果认证、数据和密钥那几节让你心里不踏实，那份不踏实就是信号。在上线前、而不是事故后，找第二双眼睛来看一看。

## 你可能也喜欢..

[**AI 生成代码的 QA** AI 生成的代码在上线前会在哪里出问题、我们最常见到的失效模式，以及在它上线前我们所跑的清单。](/zh/blog/qa-for-ai-generated-code/) [**Wavect vs Dotbite** 对两家奥地利软件工作室的公允比较，以及哪一家更适合创始人主导的 AI 构建，哪一家更适合维也纳的定制软件项目。](/zh/compare/wavect-vs-dotbite/)

QA 与生产就绪

## 继续浏览此集群

[从核心文章开始**AI 生成代码的 QA**](/zh/blog/qa-for-ai-generated-code/)

- [外部 QA 基准：软件产品前 30 天通常会发现什么](/zh/blog/external-qa-benchmark-first-30-days/)
- [软件上线后维护要花多少钱：DACH SaaS 基准](/zh/blog/software-maintenance-cost-benchmark-dach-saas/)
- [敏捷去工程化](/zh/blog/agile-de-engineering/)
- [Lovable、Bolt 和 Replit 应用尽职调查](/zh/blog/lovable-bolt-replit-app-due-diligence/)
- [Vibe-Code 生产就绪清单](/zh/blog/vibe-code-production-readiness-checklist/)

只收重要内容

## 关注与你相关的内容

每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。

[**返回**](/zh/blog/overview/)

[![Christof Jori](/img/team/christof.webp)](/zh/team/christof-jori/)

[Christof Jori](/zh/team/christof-jori/) https://linkedin.com/company/wavect

8 分钟 阅读 · 08 Jun 2026

[**下一篇**](/zh/blog/qa-for-ai-generated-code/)

邮件订阅新文章 ×

×

通过邮件获取新文章

我们发布时给你一封简短邮件。免费，不做跟踪。

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/zh/blog/lovable-cursor-prototype-to-production/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-07-07",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-07-07",
      "url": "https://wavect.io/zh/blog/lovable-cursor-prototype-to-production/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "Lovable、Cursor、Claude Code 这类 AI IDE 几天就能做出可点击的原型，但\"demo 能跑\"和\"真实用户能靠它办事\"之间是一个有自身工作量的独立项目。迁移清单：把认证和数据访问检查全部放到服务端、迁到自己拥有的数据库并测试恢复、密钥挪出客户端并轮换暴露过的、搭好 CI/CD 回滚与可观测性，再决定生成代码哪些保留哪些重建。典型加固周期一到三周，是区间不是报价。",
  "articleBody": " 博客概览/交付与 QA/QA 与生产就绪 从 Lovable 和 Cursor 原型到生产：迁移清单 要点速览 Lovable、Cursor、Claude Code 这类 AI IDE 几天就能做出可点击的原型，但\"demo 能跑\"和\"真实用户能靠它办事\"之间是一个有自身工作量的独立项目。迁移清单：把认证和数据访问检查全部放到服务端、迁到自己拥有的数据库并测试恢复、密钥挪出客户端并轮换暴露过的、搭好 CI/CD 回滚与可观测性，再决定生成代码哪些保留哪些重建。典型加固周期一到三周，是区间不是报价。 相关服务: Vibe Coding Rescue Lovable、Cursor、Claude Code、Bolt、v0 或 Replit 这类 AI IDE，能在几天内把你带到一个可点击的产品。这是实打实的进展，也是容易的那一半。\"demo 能跑\" 和 \"真实用户能靠它办事\" 之间的距离，是一个独立的项目，有它自己的工作量，假装不是这样，正是上线出岔子的方式。这是当一个原型需要变得生产级时，我们所跑的清单。 这些都不是在挑工具的毛病。我们自己也是这么起步的。这是一张工作地图，标出那些不会自己发生的活，好让你能事先规划，而不是在事故中才发现。 \"生产\" 到底意味着什么？ demo 证明想法成立。生产环境则要扛住重量。区别不在于打磨，而在于一组没人会注意到、直到它缺席才被看见的保证。 立得住的认证。真实账户、真实会话，以及一条硬规则：一个用户碰不到另一个用户的数据。 数据完整性。写操作要么完成，要么干净回滚，还有一个你信得过、下个月仍然正确的存储。 可用性。一次部署，能扛过重启、流量高峰和一次糟糕的发布，不需要人工抢救。 安全。浏览器里没有密钥，没有敞开的端点，没有一个你没看过的依赖。 可观测性。凌晨两点出问题时，你是从工具那里知道的，不是从客户那里。 支持。有办法回答 \"我的订单怎么了\"，而不用靠猜。 一个原型可以把上面每一条都跳过，仍然演示得完美。这恰恰是为什么 demo 不是终点线。 第 1 步：怎么锁死认证与数据访问？ 这是我们最先检查的，也是最常出错的。AI IDE 很擅长做一个登录页，很不擅长执行登录之后该发生什么。前端把按钮藏了起来，但 API 仍然会回应任何来问的人。 每一次访问检查都必须放在服务端。把授权彻底从客户端挪出去，放到读写数据的地方去执行。如果你的产品是多租户的，就按租户或按行做隔离，让一个账户在物理上无法查询另一个账户的记录，最好在数据库层，而不是在那种你每个端点都得记着去加的应用逻辑里。前端检查是一种 UX 上的体贴。它不是安全，也从来都不是。 第 2 步：为什么要掌握自己的数据层？ 很多原型工具会塞给你一个方便的共享或临时数据存储，好让你先动起来。这对 demo 很棒，对生产却是错的。它的备份、上限和寿命都不归你管，而 \"数据被重置了\" 不是一句你想对付费用户说的话。 迁到一个你自己拥有的、真正托管的数据库，多数情况下是 Postgres。把你的 schema 纳入版本化的迁移，让变更可重复、可评审，而不是在某个仪表盘上点出来的。打开自动备份，并真的做一次恢复测试，因为一个你从没恢复过的备份是一种期望，不是备份。这通常是最不光鲜的一步，也是替你挡掉最糟那一天的一步。 第 3 步：密钥与环境 原型会泄露密钥。工具为了让示例能跑，把一个 API key 内联进去，它最后落进客户端打包产物或仓库历史里，谁都能读到。这里的第一件事，是把每一个密钥从客户端拿出来，放到服务端，藏到你自己的后端后面。 然后分开你的环境。dev、staging 和生产应该各有各的密钥和各的数据，这样一次测试永远碰不到真实客户，staging 里的一个错误也不会向任何人收费。还有，凡是曾经暴露过的，统统轮换。一个待过客户端代码或公开 commit 的密钥就是已被泄露，不管你有没有它被用过的证据。轮换它花一个小时。假设它没事，可能要付出多得多的代价。 第 4 步：托管、CI/CD、回滚、可观测性 跟你的 AI IDE 一起捆绑来的那个原型托管，是为展示而造的，不是为运行而造的。在你开始依赖它之前，先迁到一套真正的部署设置。这意味着：一条在 push 时构建并发布的流水线，一种能在几秒内回滚到上一个好版本的办法，以及一个 staging 环节，让变更在用户看到之前先被看到。 然后，加上眼睛。错误追踪，在有东西抛异常时告诉你；基本的可用性监控；以及足够的日志，好让你事后能回答 \"发生了什么\"。目标很简单：你应该从你的工具那里知道有问题，而不是从一条愤怒的消息那里。没有这一层，你就是在盲飞，而麻烦的第一个信号，是一个已经流失的用户。 第 5 步：生成的代码什么时候保留，什么时候重建？ 并非所有生成的代码都得扔掉，也并非所有都值得留下。诚实的答案是：取决于问题住在哪里。表层的漏洞，在你已有的东西之上去补很便宜。地基层面的就不是。 当数据模型扎实、结构可读、漏洞只是上面那些可预期的项时，就保留地基：认证、校验、错误处理、密钥。这些都是在一个像样的基础上做的加法式修复。当数据模型错得让其余一切都依赖于它，或者同一个坏模式被复制到了整个代码库、以至于每个修复都得做上一百遍时，就重建核心。给一个本该重新浇筑的地基打补丁，是省钱最贵的方式，而我们会在第一通电话里就说出来，而不是收你那条绕远路的钱。 \"原型从来都不是项目本身。做到一个 demo 是一件活，做到生产是另一件活，第二件不会因为第一件快就变便宜。\" 要多久，要多少钱？ 从经验看，对一个典型的 AI 构建的原型，一轮聚焦的加固跑下来是一到三周。这是一个区间，不是报价，它会因两件事而移动：产品触碰多少真实金钱或敏感数据，以及工具在无人掌舵的情况下跑了多远。一个只读的内部工具落在短的那头。一个收款并存储个人数据的产品落在长的那头，可能还需要更多。 我们不会做的，是在还没看之前就给你一个精确数字。谁要是为一个他没见过的代码库报一个固定数，那是在猜，而猜测总是偏乐观。我们在先看一眼之后再定范围，如果诚实的答案是 \"重建核心\"，你会最先听到，而不是在第三周才听到。这项工作的详细版本，是我们的软件 QA 服务，而它背后的失效模式，在AI 生成代码的 QA 里讲过。 最终思考 构建原型是快的那一半，你跑得快是对的。生产是那一半，本来就注定要花真功夫，而这功夫不会因为第一稿是模型写的就消失。它会一直等到上线那天，那时候发现它，代价最贵。 在你把真实用户放到一个 AI 构建的产品上之前，先把这份清单过一遍。如果认证、数据和密钥那几节让你心里不踏实，那份不踏实就是信号。在上线前、而不是事故后，找第二双眼睛来看一看。 你可能也喜欢.. AI 生成代码的 QA AI 生成的代码在上线前会在哪里出问题、我们最常见到的失效模式，以及在它上线前我们所跑的清单。 Wavect vs Dotbite 对两家奥地利软件工作室的公允比较，以及哪一家更适合创始人主导的 AI 构建，哪一家更适合维也纳的定制软件项目。 QA 与生产就绪继续浏览此集群从核心文章开始AI 生成代码的 QA外部 QA 基准：软件产品前 30 天通常会发现什么软件上线后维护要花多少钱：DACH SaaS 基准敏捷去工程化Lovable、Bolt 和 Replit 应用尽职调查Vibe-Code 生产就绪清单 集群中的上一篇AI 生成代码的 QA集群中的下一篇Vibe-Coded 软件审计：上线前会出什么问题 最合适的下一步： Vibe Coding 救援 软件 QA 软件开发 Fractional CTO AI 咨询 看看生产环境中的应用: Polity 先做决定: 如何把 vibe coding 出来的原型推向生产环境 只收重要内容 关注与你相关的内容 每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。 Company 电子邮箱 你希望接收哪些内容？ 完整的 Wavect 博客接收六个主题下的每一篇新文章。 仅接收所选主题请在下方选择一个或多个分类。 选择主题 AI 与智能体 产品与 MVP 交付与 QA 领导力与团队 商业与监管 Web3 与隐私 我希望接收所选的 Wavect 博客邮件，并已阅读 隐私信息。我可以随时退订。 发送确认邮件→ 免费、双重确认、不使用跟踪像素。 ",
  "articleSection": "Engineering",
  "author": {
    "@id": "https://wavect.io/team/christof-jori/#person",
    "@type": "Person",
    "name": "Christof Jori",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796367",
      "https://www.linkedin.com/in/jocr77/",
      "https://github.com/jo-chris"
    ],
    "url": "https://wavect.io/team/christof-jori/"
  },
  "dateModified": "2026-07-07",
  "datePublished": "2026-06-08",
  "description": "Lovable、Cursor、Claude Code 这类 AI IDE 几天就能做出可点击的原型，但\"demo 能跑\"和\"真实用户能靠它办事\"之间是一个有自身工作量的独立项目。迁移清单：把认证和数据访问检查全部放到服务端、迁到自己拥有的数据库并测试恢复、密钥挪出客户端并轮换暴露过的、搭好 CI/CD 回滚与可观测性，再决定生成代码哪些保留哪些重建。典型加固周期一到三周，是区间不是报价。",
  "headline": "从 Lovable 和 Cursor 原型到生产：迁移清单",
  "image": "https://wavect.io/img/blog/headers/header_lovable-cursor-prototype-to-production.svg",
  "inLanguage": "zh",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/zh/blog/lovable-cursor-prototype-to-production/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/zh/blog/lovable-cursor-prototype-to-production/",
  "wordCount": 197
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/overview/",
      "name": "博客概览",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/topics/delivery-qa/",
      "name": "交付与 QA",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/clusters/qa-production/",
      "name": "QA 与生产就绪",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/lovable-cursor-prototype-to-production/",
      "name": "从 Lovable 和 Cursor 原型到生产 - 博客 | ",
      "position": 5
    }
  ]
}
```
