news 2026/7/6 3:37:28

05-服务端渲染与元框架——12. Gatsby - 静态站点生成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
05-服务端渲染与元框架——12. Gatsby - 静态站点生成

12. Gatsby - 静态站点生成

概述

Gatsby 是一个基于 React 的静态站点生成器(SSG),它从数据源(Markdown、CMS、API)获取内容,在构建时生成静态 HTML 文件,提供极快的页面加载速度和优秀的 SEO。

维度内容
What基于 React 的静态站点生成器
Why构建快速、SEO 友好的静态网站
When博客、文档、营销网站等静态内容
WhereGatsby 项目中使用
Who需要静态站点生成的开发者
Howexport const query = graphql\query { … }``

1. Gatsby 概述

1.1 Gatsby vs Next.js

特性GatsbyNext.js
主要模式SSG(静态生成)SSG + SSR + ISR
数据层GraphQL 数据层直接 fetch
插件生态丰富的插件较丰富
构建时间内容多时较慢较快
适用场景博客、文档、营销站各类应用

1.2 核心概念

// Gatsby 页面组件 import * as React from 'react'; import { graphql } from 'gatsby'; // GraphQL 查询 export const query = graphql` query HomePageQuery { site { siteMetadata { title } } } `; // 页面组件 export default function HomePage({ data }) { return ( <div> <h1>{data.site.siteMetadata.title}</h1> </div> ); }

2. 页面和路由

2.1 文件系统路由

# Gatsby 页面结构 src/ ├── pages/ │ ├── index.js → / │ ├── about.js → /about │ ├── contact.js → /contact │ └── blog/ │ ├── index.js → /blog │ └── {mdx.slug}.js → /blog/:slug
// src/pages/index.js import * as React from 'react'; import { Link } from 'gatsby'; export default function HomePage() { return ( <div> <h1>首页</h1> <Link to="/about">关于我们</Link> </div> ); } // src/pages/about.js export default function AboutPage() { return ( <div> <h1>关于我们</h1> <p>这是关于页面</p> </div> ); }

2.2 动态路由

// src/pages/blog/{mdx.slug}.js import * as React from 'react'; import { graphql } from 'gatsby'; export const query = graphql` query BlogPostQuery($id: String) { mdx(id: { eq: $id }) { frontmatter { title date } body } } `; export default function BlogPost({ data }) { const post = data.mdx; return ( <div> <h1>{post.frontmatter.title}</h1> <div dangerouslySetInnerHTML={{ __html: post.body }} /> </div> ); }

3. 数据层(GraphQL)

3.1 页面查询

// src/pages/blog.js import * as React from 'react'; import { graphql, Link } from 'gatsby'; export const query = graphql` query BlogPageQuery { allMdx(sort: { frontmatter: { date: DESC } }) { nodes { id frontmatter { title date(formatString: "YYYY-MM-DD") } slug } } } `; export default function BlogPage({ data }) { const posts = data.allMdx.nodes; return ( <div> <h1>博客列表</h1> {posts.map(post => ( <article key={post.id}> <h2> <Link to={`/blog/${post.slug}`}> {post.frontmatter.title} </Link> </h2> <p>{post.frontmatter.date}</p> </article> ))} </div> ); }

3.2 静态查询(useStaticQuery)

// src/components/Header.js import * as React from 'react'; import { useStaticQuery, graphql, Link } from 'gatsby'; export default function Header() { const data = useStaticQuery(graphql` query HeaderQuery { site { siteMetadata { title } } } `); return ( <header> <h1> <Link to="/">{data.site.siteMetadata.title}</Link> </h1> </header> ); }

4. 完整示例:博客站点

// gatsby-config.js module.exports = { siteMetadata: { title: '我的博客', description: '分享技术和生活', siteUrl: 'https://example.com', }, plugins: [ 'gatsby-plugin-image', 'gatsby-plugin-sharp', 'gatsby-transformer-sharp', { resolve: 'gatsby-source-filesystem', options: { name: 'blog', path: `${__dirname}/content/blog`, }, }, { resolve: 'gatsby-plugin-mdx', options: { extensions: ['.mdx', '.md'], }, }, ], }; // src/pages/index.js import * as React from 'react'; import { graphql, Link } from 'gatsby'; import Layout from '../components/Layout'; export const query = graphql` query HomePageQuery { allMdx(limit: 6, sort: { frontmatter: { date: DESC } }) { nodes { id frontmatter { title date(formatString: "YYYY-MM-DD") } excerpt slug } } } `; export default function HomePage({ data }) { const posts = data.allMdx.nodes; return ( <Layout> <h1>最新文章</h1> {posts.map(post => ( <article key={post.id}> <h2> <Link to={`/blog/${post.slug}`}> {post.frontmatter.title} </Link> </h2> <p>{post.frontmatter.date}</p> <p>{post.excerpt}</p> </article> ))} </Layout> ); } // src/pages/blog/{mdx.slug}.js import * as React from 'react'; import { graphql } from 'gatsby'; import Layout from '../../components/Layout'; export const query = graphql` query BlogPostQuery($id: String) { mdx(id: { eq: $id }) { frontmatter { title date(formatString: "YYYY-MM-DD") } body } } `; export default function BlogPost({ data }) { const post = data.mdx; return ( <Layout> <article> <h1>{post.frontmatter.title}</h1> <p>{post.frontmatter.date}</p> <div dangerouslySetInnerHTML={{ __html: post.body }} /> </article> </Layout> ); } // src/components/Layout.js import * as React from 'react'; import { useStaticQuery, graphql, Link } from 'gatsby'; export default function Layout({ children }) { const data = useStaticQuery(graphql` query LayoutQuery { site { siteMetadata { title } } } `); return ( <div> <header> <h1> <Link to="/">{data.site.siteMetadata.title}</Link> </h1> <nav> <Link to="/">首页</Link> <Link to="/blog">博客</Link> <Link to="/about">关于</Link> </nav> </header> <main>{children}</main> <footer>© {new Date().getFullYear()}</footer> </div> ); }

5. 总结

核心要点

要点说明
主要模式静态站点生成(SSG)
数据层GraphQL 统一数据层
路由文件系统路由 + 动态路由
适用场景博客、文档、营销网站

记忆口诀

Gatsby 静态生成快,GraphQL 数据统一来
博客文档最合适,SEO 友好不用猜


6. 相关资源

  • Gatsby 官方文档
  • Gatsby 教程
  • Gatsby 插件库

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 3:37:09

深度解析S2-045漏洞:OGNL沙箱绕过与远程代码执行实战

1. 项目概述&#xff1a;一次对经典漏洞的深度技术复盘几年前&#xff0c;当S2-045漏洞的预警通告在各个安全应急响应中心刷屏时&#xff0c;整个安全圈和开发社区都为之震动。这个基于Struts2框架的远程代码执行漏洞&#xff0c;因其利用条件简单、影响范围巨大&#xff0c;迅…

作者头像 李华
网站建设 2026/7/6 3:35:55

python-宠物领养平台项目源码(管理端+用户端)

宠物领养平台是一个前后端分离的Web应用系统&#xff0c;面向救助机构和领养人两类用户群体&#xff0c;提供宠物信息发布、领养申请、资质认证、审核管理等核心业务功能。 项目采用前后端分离架构&#xff0c;后端提供RESTful API接口&#xff0c;前端通过HTTP请求调用接口获取…

作者头像 李华
网站建设 2026/7/6 3:33:20

遇到技术难题听谁的?我让千问和DeepSeek“打了一架”!

最近在项目中遇到了一个架构设计难题。在 vSAN 8.0 的网络设计中&#xff0c;服务器有四个物理网口可专门用于 vSAN 网络。手里捏着这四个口&#xff0c;我该怎么规划才能做到性能与冗余的最佳平衡呢&#xff1f;秉承着“遇事不决问 AI”的原则&#xff0c;我先去请教了通义千问…

作者头像 李华
网站建设 2026/7/6 3:32:26

Go后端面试全流程复盘

Go后端面试全流程复盘&#xff1a;Context、MySQL索引、Map并发、K8s、Docker、AIGC工作流 前言 最近面了一家做AIGC平台的中厂&#xff0c;一面全程1小时&#xff0c;面试官很务实&#xff0c;基本没有八股文背诵环节&#xff0c;全是结合项目场景深挖。我把整个过程还原出来&…

作者头像 李华
网站建设 2026/7/6 3:30:47

沪深股票Level2行情数据详解量化下载笔记逐笔毫秒级别数据

沪深股票Level2行情数据详解 昨晚跑因子又把内存给爆了&#xff0c;查了下是数据源的问题&#xff0c;处理Tick数据真是个体力活。今天就来聊聊我平时用的这个数据源&#xff0c;看看里面到底包含了哪些内容&#xff0c;也顺便给想研究高频数据的朋友们提个醒。 这个数据源主要…

作者头像 李华