Skip to content
Now accepting Q2 projects — limited slots available. Get started →
Migration Service

迁移 Gatsby 到 Next.js

你的 Gatsby 构建卡顿 40 分钟,而竞争对手早已上线

  • GraphQL bloat forces you to maintain a schema, resolvers, and plugin configs just to fetch a JSON file your API already serves
  • Build pipelines choke on content updates — 30-minute deploys mean your team batches changes instead of shipping when ready
  • Client-side auth hacks pile up because Gatsby can't render user-specific pages on the server without brittle workarounds
  • Plugin version conflicts break your build every quarter when Gatsby ships a major update and half your plugins lag behind
  • Gatsby's roadmap stalled while Next.js shipped React Server Components, middleware, and edge rendering — you're falling behind
  • ISR updates a single page in under 10 seconds without touching the rest of your site — publish edits instantly, no queue
  • Choose SSG for marketing pages, SSR for dashboards, ISR for blogs — per-route control instead of one-size-fits-all architecture
  • API routes handle form submissions, webhook endpoints, and auth flows in /pages/api without spinning up a separate backend
  • next/image optimizes every format and breakpoint automatically — no gatsby-plugin-sharp config sprawl or build-time image processing crashes
  • Vercel deployments preview every branch in 40 seconds with zero yaml files — your CI/CD complexity drops to a git push

为什么 Gatsby 站点正在迁移到 Next.js

Gatsby 在静态站点生成是唯一真实选择时是个不错的选择。但互联网已经向前发展,Gatsby 没有跟上。你的站点被锁定在仅构建时渲染,陷入你可能根本不需要的 GraphQL 数据层,并且随着内容增长构建时间会越来越长。

Next.js 提供 Gatsby 所做的一切——静态生成、React 组件、基于文件的路由——再加上服务器端渲染、增量静态再生(ISR)、API 路由和中间件。同样的 React 生态,没有任何约束。

由于两个框架都是基于 React 的,你的实际组件几乎不需要改变。迁移主要涉及数据获取模式和路由。你不是在重写你的 UI。

Gatsby 的真正问题

GraphQL 做所有事情太过头了

Gatsby 通过 GraphQL 路由每个数据交互。想从你的 CMS 拉取博客文章列表?GraphQL 查询。需要站点元数据?GraphQL 查询。想读取 JSON 文件?GraphQL 查询。这在 2018 年很聪明。现在只是摩擦。

你正在维护包含 createPages 逻辑的 gatsby-node.js 文件,编写页面查询、静态查询和片段定义,这些本应是一个简单的 fetch() 调用。你团队的每个新开发者都必须在做任何有意义的工作之前学会 Gatsby 的 GraphQL 约定。

扩展性差的构建时间

Gatsby 在构建时重建所有内容。500 页的站点可能需要 5-10 分钟。5000 页的站点?你在看 20-45 分钟。每次内容更新都触发完整重建。你的营销团队要等半小时才能看到博客文章上线。

Next.js 的增量静态再生(ISR)完全解决了这个问题。页面在你定义的计划表上在后台再生。新内容在几秒内出现,而不是几分钟。

插件依赖地狱

Gatsby 的插件生态系统曾经是它最大的卖点。现在是个负担。插件在主要版本升级上会损坏。有些被放弃了。你需要三层深的 gatsby-plugin-* 依赖来实现 Next.js 本身就内置的东西——图像优化、CSS 处理、字体加载、元数据管理。

gatsby-plugin-image 在更新后损坏,你晚上 11 点调试源映射时,这通常是团队决定迁移的时刻。

没有服务器端渲染

Gatsby 仅静态。需要认证页面?客户端渲染加载微调。需要实时数据?水合后的客户端获取。需要个性化?会破坏你的 Core Web Vitals 的 JavaScript 密集型变通方案。

Next.js 让你按页面选择:静态生成、服务器端渲染或用 ISR 的混合。你为每个路由选择合适的工具。

使用 Next.js 你会获得什么

灵活的渲染策略

Next.js 中的每个页面都可以使用不同的渲染策略。营销页面使用 getStaticProps 进行静态生成。你的仪表板使用服务器端渲染。你的博客使用 ISR 来保持新鲜,而不需要重建。一个框架,每个模式。

无 GraphQL 的数据获取

用标准 fetch()、SWR 或任何你喜欢的数据库替换每个 GraphQL 查询。getStaticProps 替换页面查询。getStaticPaths 替换 gatsby-node.js 中的 createPages。心理模型更简单,代码更可移植。

// 之前: gatsby-node.js
exports.createPages = async ({ graphql, actions }) => {
  const result = await graphql(`
    query { allMarkdownRemark { edges { node { frontmatter { slug } } } } }
  `);
  result.data.allMarkdownRemark.edges.forEach(({ node }) => {
    actions.createPage({
      path: node.frontmatter.slug,
      component: path.resolve('./src/templates/post.js'),
    });
  });
};

// 之后: pages/posts/[slug].tsx
export const getStaticPaths: GetStaticPaths = async () => {
  const posts = await getAllPosts();
  return {
    paths: posts.map((post) => ({ params: { slug: post.slug } })),
    fallback: 'blocking',
  };
};

export const getStaticProps: GetStaticProps = async ({ params }) => {
  const post = await getPostBySlug(params.slug);
  return { props: { post }, revalidate: 60 };
};

Next.js 版本更明确,更容易调试,并用一个单一的 revalidate 属性添加 ISR。

内置图像优化

Next.js <Image> 组件处理懒加载、响应式大小调整和格式转换(WebP/AVIF),无需插件。不再需要与 gatsby-plugin-imagegatsby-transformer-sharp 配置搏斗。

API 路由和中间件

需要联系表单端点?Webhook 处理程序?认证逻辑?Next.js API 路由位于同一代码库中。中间件处理重定向、A/B 测试和地理位置的边缘处理。Gatsby 没有等价物。

我们的迁移流程

第一阶段:审计和架构(第 1 周)

我们库存每个 Gatsby 页面、插件、GraphQL 查询和动态路由。每个都映射到其 Next.js 等价物。我们识别需要自定义替换的插件并记录你当前的 URL 结构以用于 SEO 保留。

第二阶段:项目脚手架(第 1-2 周)

我们用 TypeScript 初始化 Next.js 项目,配置你的无头 CMS 连接,并设置你的样式解决方案——迁移你现有的 CSS,无论是 styled-components、Tailwind 还是 CSS Modules。然后我们建立组件架构。

两个框架都使用 React,所以你现有的组件以最少的改变转移。我们更新导入,用 next/link 替换 gatsby-link,用 next/image 交换 gatsby-image,并将全局 CSS 从 gatsby-browser.js 移动到 _app.tsx

第三阶段:数据获取迁移(第 2-3 周)

这是核心工作。每个 GraphQL 查询在 getStaticPropsgetServerSideProps 内变成直接的 API 调用或 CMS SDK 方法。gatsby-node.js 中的每个 createPages 调用变成 getStaticPaths 函数。我们用 Next.js 的原生 <Head> 组件或 App Router 元数据 API 替换 gatsby-plugin-react-helmet

第四阶段:动态功能(第 3-4 周)

这是 Next.js 表现出色的地方。我们将 ISR 添加到内容页面,以便 CMS 更新在几秒内出现。我们实现 API 路由来处理表单和集成。我们添加中间件用于重定向、认证或个性化——在 Gatsby 中要么不可能要么很痛苦的功能。

第五阶段:测试和启动(第 4-5 周)

跨设备的完整回归测试。每个模板的 Lighthouse 审计。对比你当前站点的视觉差异测试。我们验证每个 URL 都正确解析,每个重定向都有效,每个元标记都被保留。

SEO 保留策略

如果你对迁移框架不小心,这是一个 SEO 风险。我们消除了那个风险。

  • URL 奇偶性:每个现有 URL 1:1 映射到新站点。除非你要求,没有结构改变。
  • 301 重定向:我们为任何 URL 更改在 next.config.js 中配置 Next.js 重定向,附带完整的重定向映射。
  • 元标记审计:我们使用 Next.js <Head> 组件验证标题标记、元描述、Open Graph 标记和规范 URL 正确转移。
  • 结构化数据:来自你的 Gatsby 站点的任何 JSON-LD 标记都被移植到新模板。
  • 站点地图和 robots.txt:通过 next-sitemap 或自定义 API 路由自动生成。
  • 性能提升:更快的 TTFB 和更好的 Core Web Vitals 分数通常在迁移后改进排名,而不是伤害它们。

部署和托管

我们在 Vercel 上部署以获得最好的 Next.js 体验——自动预览部署、边缘函数、内置分析和零配置 ISR。或者,我们可以部署到 Cloudflare Pages、AWS Amplify 或任何适合你基础设施的 Node.js 托管环境。

时间表和定价

一个典型的 Gatsby 到 Next.js 迁移需要 3-5 周,取决于站点复杂性:

  • 小型站点(50 页以下,博客或营销站点):2-3 周,起价 ¥6,000
  • 中型站点(50-500 页,CMS 驱动,多个模板):3-5 周,起价 ¥12,000
  • 大型站点(500+ 页,复杂数据源,电子商务):5-8 周,起价 ¥20,000

每次迁移都包括免费的启动后支持期,以捕捉边缘情况和微调性能。

React 优势

这不是重写——这是升级。你的团队已经懂 React。你的组件已经有效。我们在交换下面的框架层,同时保留重要的一切:你的设计、你的内容、你的 URL 和你的搜索排名。

结果是一个更快、更灵活、能够做 Gatsby 根本无法交付的事情的站点。

How It Works

The migration process

01

Discovery & Audit

We map every page, post, media file, redirect, and plugin. Nothing gets missed.

02

Architecture Plan

New stack designed for your content structure, SEO requirements, and performance targets.

03

Staged Migration

Content migrated in batches. Each batch verified before the next begins.

04

SEO Preservation

301 redirects, canonical tags, sitemap, robots.txt — every ranking signal carried over.

05

Launch & Monitor

DNS cutover with zero downtime. 30-day monitoring period included.

Before vs After

Gatsby vs Next.js

Metric Gatsby Next.js
Lighthouse Mobile 55-75 90-100
TTFB 0.8-2.0s <0.3s
Build Time (500 pages) 8-15 min 1-3 min
Hosting Cost $20-50/mo $0-20/mo
Developer Experience GraphQL-coupled, plugin-heavy Standard fetch, built-in features
SSR/ISR Support None Full native support
FAQ

Common questions

我有多少 Gatsby 代码可以在 Next.js 中重用?

由于两个框架都使用 React,你的 UI 组件转移需要最少的改变。主要的重写是数据获取(GraphQL 查询变成 getStaticProps/fetch 调用)、路由(gatsby-node.js createPages 变成 getStaticPaths)和替换 Gatsby 特定的插件。现实上,70-85% 的你的组件代码直接转移——你不是从零开始。

从 Gatsby 迁移到 Next.js 会伤害我的 SEO 排名吗?

不会,如果做对了。我们维持精确的 URL 奇偶性,为任何改变设置 301 重定向,并验证每个元标记正确转移。大多数站点实际上在迁移后看到排名改进——Next.js 提供更快的 TTFB 和更好的 Core Web Vitals 分数,这些是直接的谷歌排名因素。

我如何在 Next.js 中替换 Gatsby 的 GraphQL 数据层?

每个 GraphQL 页面查询变成一个 getStaticProps 函数,使用标准 fetch()、你的 CMS SDK 或任何你喜欢的数据库获取数据。组件的静态查询变成 SWR 钩子或服务器获取的 props 传递到树中。数据获取最终变得更简单和更明确——你不需要学习查询语言来理解发生了什么。

gatsby-node.js createPages 在 Next.js 中发生了什么?

gatsby-node.js 中的 createPages 函数直接映射到 Next.js 中的 getStaticPaths。每个动态路由文件(例如,[slug].tsx)导出 getStaticPaths 来定义在构建时生成的页面,然后 getStaticProps 为每个页面获取数据。逻辑与页面模板相邻,而不是埋在单独的配置文件中——这使得遵循它容易得多。

Gatsby 到 Next.js 迁移需要多长时间?

一个小的营销站点或博客通常需要 2-3 周。拥有多个 CMS 驱动模板的中型站点需要 3-5 周。拥有复杂数据源、电子商务或自定义插件逻辑的大型站点需要 5-8 周。在审计你的特定 Gatsby 设置后,我们给你一个详细的时间表——范围根据插件依赖有多深而变化很大。

迁移到 Next.js 时我需要更改我的无头 CMS 吗?

不需要。Next.js 与每个无头 CMS 都兼容——Contentful、Sanity、Strapi、WordPress、Prismic,你能想到的都有。如果你的 CMS 与 Gatsby 兼容,它将与 Next.js 兼容。我们用直接 API 调用或 CMS 的官方 SDK(通常更容易维护)替换 GraphQL 源插件查询。

Ready to migrate?

Free assessment. We'll audit your current site and give you a clear migration plan — no commitment.

Get your free assessment →
Get in touch

Let's build
something together.

Whether it's a migration, a new build, or an SEO challenge — the Social Animal team would love to hear from you.

Get in touch →