一、当静态站点遇上React的世界
想象这样一个场景:你想搭建一个产品展示网站,需要快速加载、SEO友好且无需频繁更新。此时静态站点生成(SSG)就像量身定制的解决方案,它将动态内容在构建时预先生成HTML/CSS/JS文件,结合React的组件化优势,这便是现代前端架构的完美组合。
在React生态中,Next.js和Gatsby如同双子星般的存在。最近某个电商平台迁移到Gatsby后,Lighthouse性能评分从42跃升至98,而某技术博客使用Next.js的ISR(增量静态再生)功能后,构建时间从30分钟缩短到2分钟,这都是SSG带来的真实改变。
二、Next.js的SSG实战手册(技术栈:Next.js)
1. 基础页面生成
// pages/products/[id].js
export async function getStaticPaths() {
// 从CMS获取所有产品ID
const res = await fetch('https://api.example.com/products')
const products = await res.json()
// 生成路径参数
const paths = products.map(product => ({
params: { id: product.id.toString() },
}))
return { paths, fallback: 'blocking' }
}
export async function getStaticProps({ params }) {
// 获取指定产品详情
const res = await fetch(`https://api.example.com/products/${params.id}`)
const product = await res.json()
return {
props: { product },
// 启用ISR:每60秒重新验证
revalidate: 60,
}
}
function ProductPage({ product }) {
return (
<div>
<h1>{product.name}</h1>
<p>{product.description}</p>
</div>
)
}
export default ProductPage
2. 增量静态再生(ISR)进阶
// pages/posts/[slug].js
export async function getStaticProps({ params }) {
try {
const post = await getPostFromCMS(params.slug)
return {
props: { post },
revalidate: 3600, // 每小时更新
}
} catch (error) {
return {
notFound: true, // 自动显示404页面
revalidate: 10 // 10秒后重试
}
}
}
三、Gatsby的SSG深度解析(技术栈:Gatsby)
1. 数据源集成
// gatsby-config.js
module.exports = {
plugins: [
{
resolve: `gatsby-source-filesystem`,
options: {
name: `posts`,
path: `${__dirname}/content/posts/`,
},
},
{
resolve: `gatsby-transformer-remark`,
options: {
plugins: [`gatsby-remark-prismjs`],
},
},
],
}
2. 页面生成机制
// gatsby-node.js
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions
const result = await graphql(`
{
allMarkdownRemark {
edges {
node {
fields {
slug
}
}
}
}
}
`)
result.data.allMarkdownRemark.edges.forEach(({ node }) => {
createPage({
path: node.fields.slug,
component: path.resolve(`./src/templates/blog-post.js`),
context: {
slug: node.fields.slug,
},
})
})
}
四、典型应用场景分析
1. 首选Next.js的情况
- 需要混合SSG和SSR的场景(如用户个性化仪表盘)
- 需要增量更新的电商产品目录
- 需要服务端功能的文档站点(如实时API文档)
2. 优先Gatsby的场合
- 完全静态的内容型网站(企业官网、作品集)
- 需要复杂数据转换的博客系统
- 追求极致性能的内容聚合平台
五、框架抉择的黄金标准
维度 | Next.js优势 | Gatsby强项 |
---|---|---|
构建速度 | 增量更新更快 | 内容稳定时构建更快 |
开发体验 | 无缝对接React生态 | 丰富的数据处理插件 |
SEO优化 | 支持动态路由的静态化 | 开箱即用的优化方案 |
学习曲线 | 渐进式上手难度低 | GraphQL需要额外学习 |
部署成本 | 支持Serverless部署 | 纯静态托管成本更低 |
六、开发注意事项备忘录
- 数据变更的蝴蝶效应
- Next.js适合高频更新的业务场景(通过ISR控制更新频率)
- Gatsby建议配合持续集成实现自动化构建
- 第三方依赖的黑洞效应
// 错误示例:在gatsby-browser.js中使用全局jQuery
import $ from 'jquery'
// 正确做法:动态加载非必要依赖
if (typeof window !== 'undefined') {
import('jquery').then(($) => {
// 按需使用
})
}
- 图片优化的尺寸迷思
// Next.js图像组件的最佳实践
import Image from 'next/image'
function ProductImage({ src }) {
return (
<Image
src={src}
alt="产品展示"
width={600}
height={400}
quality={80}
placeholder="blur"
/>
)
}
七、终极技术选型方案
通过真实的压力测试数据对比(以下为模拟数据):
- 1000个页面构建时间:
- Next.js:12.8s(冷启动) / 4.2s(增量)
- Gatsby:9.3s(初始) / 7.8s(增量)
- 首字节到达时间(TTFB):
- Next.js:42ms
- Gatsby:37ms
- 交互就绪时间:
- Next.js:1.4s
- Gatsby:1.1s
八、写给开发者的决策树
当你的项目符合以下特征时:
- 需要结合客户端动态功能 → 选择Next.js
- 需要处理多种数据源 → 首选Gatsby
- 追求最快初始加载速度 → Gatsby优先
- 需要灵活部署方式 → Next.js更优