使用 gatsby-source-wordpress 从 Starter 起步搭建 Gatsby + WordPress 站点:完整配置与大型站点优化指南
【免费下载链接】gatsbyReact-based framework with performance, scalability, and security built in.项目地址: https://gitcode.com/gh_mirrors/ga/gatsby
导读
本文是gatsby-source-wordpress插件的官方入门实战指南,完整覆盖从 WordPress 环境准备、安装 WPGraphQL / WPGatsby 两个必备插件、通过官方 WordPress Starter 创建 Gatsby 站点、修改gatsby-config.js接入 GraphQL 端点,到首次构建与增量更新的完整流程。文中还针对大型站点给出type节点数量限制与develop.hardCacheMediaFiles媒体硬缓存两类性能优化配置,并结合本仓库源码(插件文档、官方 Starter、节点抓取实现)说明其底层原理,读完即可从零跑通一个基于 WordPress 数据源的 Gatsby 站点。
为什么推荐从 Starter 开始
对于需要接入 WordPress 的新 Gatsby 站点,官方推荐的方式是直接基于 Starter 模板创建,而不是从零手写整个工程。这样做的原因是:Starter 已经内置了经过验证的最佳实践——正确的插件组合、合理的目录结构、可复用的页面模板与配置项,你无需把时间浪费在重复实现基础架构上。
本仓库中的 gatsby-starter-wordpress-blog 正是官方为 WordPress 场景准备的基础模板,它已经配置好了gatsby-source-wordpress、gatsby-transformer-sharp、gatsby-plugin-sharp、gatsby-plugin-image以及 PWA 相关的gatsby-plugin-manifest,开箱即可运行。其 gatsby-config.js 中插件的组织方式,就是下面即将介绍的配置形态的"实物样本"。
第一步:准备 WordPress 环境
如果你还没有 WordPress 站点,官方建议使用 Local by Flywheel(LocalWP)在本机创建一个本地 WP 实例;只要你的 WP 实例托管在某个可达的服务器上,都可以直接进入下一步。
安装两个必备插件
登录 WordPress 后台,访问/wp-admin/plugin-install.php,搜索并安装以下两个插件:
| 插件 | 作用 |
|---|---|
| WPGraphQL | 为 WordPress 提供 GraphQL API,是gatsby-source-wordpress高效、灵活地拉取数据的通道。安装后默认在http://[yoursite.com]/graphql暴露 GraphQL 端点 |
| WPGatsby 与 Webhooks 能力,用于在 WP 内容变化时触发构建服务重新构建 |
其中 WPGatsby 之所以"必须",从源码角度可以看得更清楚:它配合 WPGraphQL 记录的变更日志,是gatsby-source-wordpress实现"首次全量拉取、后续只拉增量"这一缓存策略的前提。插件文档 caching.md 明确指出:得益于 WPGatsby 对 WordPress 数据变更的追踪,插件可以激进地使用缓存——第一次运行gatsby develop或gatsby build时拉取全部公开数据,之后只拉取发生变化的数据。
第二步:准备 Gatsby 开发环境
在继续之前,请确保你的电脑上已安装:
- Node.js(Gatsby 的运行环境)
- npm(Node 包管理器)
- Gatsby CLI(用于执行
gatsby new、gatsby develop等命令)
环境准备完成后,即可进入站点创建环节。
第三步:创建并配置 gatsby-source-wordpress 站点
使用官方 Starter 创建站点
打开终端,进入你希望存放站点的目录,然后执行:
gatsby new my-wordpress-gatsby-site https://github.com/gatsbyjs/gatsby-starter-wordpress-blog该命令会拉取gatsby-starter-wordpress-blogStarter,将其放到新建的my-wordpress-gatsby-site目录下,并自动执行npm install安装依赖。你也可以直接在本仓库的 starters/gatsby-starter-wordpress-blog 中查看这个模板的完整结构,它包含:
src/ ├── components/ # 布局、SEO、作者简介等组件 ├── pages/ # 404 页面等 ├── templates/ # post.js、page.js、blog-post-archive.js 页面模板 ├── normalize.css └── style.cssStarter 的 gatsby-node.js 展示了如何从 WP 数据生成页面:它通过 GraphQL 查询allWpPost/allWpPage,用 WordPress 的uri作为 Gatsby 页面路径(这样 WP 内部链接和菜单可以无缝工作),并额外创建了基于 WPreadingSettings.postsPerPage的分页归档页面。
修改 gatsby-config.js 接入 GraphQL 端点
站点创建完成后,用 IDE 或文本编辑器打开项目根目录下的gatsby-config.js。在plugins数组的开头,你会看到 Starter 预置的 WordPress 源插件配置:
{ /** * First up is the WordPress source plugin that connects Gatsby * to your WordPress site. * * visit the plugin docs to learn more * https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-source-wordpress/README.md * */ resolve: `gatsby-source-wordpress`, options: { // the only required plugin option for WordPress is the GraphQL url. url: process.env.WPGRAPHQL_URL || `https://wpgatsbydemo.wpengine.com/graphql`, }, },可以看到,url是gatsby-source-wordpress唯一必需的插件选项,其余参数全部可选(完整选项清单见 plugin-options.md)。Starter 默认使用环境变量WPGRAPHQL_URL,未设置时回退到演示站点地址。你需要把它替换为第一步中 WPGraphQL 插件为你生成的/graphql端点地址:
{ resolve: `gatsby-source-wordpress`, options: { url: `https://demo.wpgraphql.com/graphql`, }, },实践建议:把真实端点写进
.env或 CI 环境变量(如WPGRAPHQL_URL),既便于多环境切换,也能避免把演示地址误留在仓库里。官方演示端点https://demo.wpgraphql.com/graphql可用来快速体验。
第四步:运行站点并理解首轮构建行为
在终端cd进入站点目录并执行:
gatsby develop启动后你会看到插件在终端输出一些日志,显示它正在从 WPGraphQL 抓取哪些类型的数据。随后在浏览器打开http://localhost:8000即可预览站点。
关于数据抓取,需要理解两点关键行为(见 caching.md):
- 首次构建(
gatsby develop或gatsby build):插件从 WPGraphQL 抓取全部可公开访问的数据; - 后续构建:只抓取发生变化的数据,以保持构建速度。
注意:如果远程 schema 发生变化,整个缓存会失效,插件将重新拉取全部数据。每次你新增 npm 包、修改gatsby-config.js或gatsby-node.js时,Gatsby 都会清空缓存,源插件随之需要重新抓取全部数据——这正是下面两个"大型站点优化选项"存在的意义。
大型站点性能优化:两个关键插件选项
如果你的站点规模较大(比如几千篇文章),每次清缓存后的全量重抓会让gatsby develop等待时间很长。gatsby-source-wordpress提供了两个选项来缓解这个问题。
选项一:用type限制每个类型的抓取数量
type选项用于按类型限制从 WordPress 抓取的对象数量。最常用的是特殊的__all类型,它对所有节点类型生效:
{ resolve: `gatsby-source-wordpress`, options: { url: `https://demo.wpgraphql.com/graphql`, type: { __all: { limit: process.env.NODE_ENV === `development` ? 50 : null } } }, },语义拆解:
limit表示该类型最多抓取多少个对象(详见 type.__all.limit 的定义:the maximum amount of objects of this type to fetch from WordPress);process.env.NODE_ENV === 'development' ? 50 : null表示只在开发模式下限制为 50 条,生产构建不受限(null即不限制);- 如果希望限制始终生效(开发与生产都限制),直接写
limit: 50。
也可以按具体类型分别设置,比如只对Post和Page各取 50 条:
{ resolve: `gatsby-source-wordpress`, options: { url: `https://demo.wpgraphql.com/graphql`, type: { Post: { limit: 50 }, Page: { limit: 50 } } }, },围绕这一配置,还有几个同层级、常搭配使用的选项(见 plugin-options.md):
type.__all.where:字符串,作为 WPGraphQL 查询的where参数传入,典型用法是只抓取特定语言的文章(如where: 'language: zh');type.__all.exclude:布尔值,设为true时完全排除某类型,既不抓取节点也不纳入 schema;type.__all.excludeFieldNames:按字段名排除某类型上的特定字段(如['dateGmt', 'parent']);type.__all.nodeInterface:布尔值,决定该类型是否被当作完全由其他 Gatsby 节点类型组成的接口。
该功能的专项文档 limit-nodes-during-development.md 也给出了同样的示例:当你有 1000 甚至 10,000 篇文章时,通过limit让开发环境只拉取最新 50 篇,可以让gatsby develop的启动时间从 20 分钟级降到 20 秒级。需要注意的是,被limit截断的类型在开发环境中不会抓取全量数据,因此页面模板只会基于已抓取的部分节点生成页面——这在本地调试样式与组件时完全够用,但生产构建务必保持全量(或设置足够的数值)。
选项二:用develop.hardCacheMediaFiles硬缓存媒体文件
每次 Gatsby 缓存被清空时,源插件从 WordPress 下载到本地的所有图片文件都会被删除,导致下次运行gatsby develop时必须全部重新下载。hardCacheMediaFiles选项可以把媒体文件硬缓存到 Gatsby 缓存目录之外,从而消除开发环境下的重复下载:
{ resolve: `gatsby-source-wordpress`, options: { url: `https://demo.wpgraphql.com/graphql`, develop: { hardCacheMediaFiles: true, } }, },启用后,图片会被存放在项目根目录的./.wordpress-cache/path/to/media/file.jpeg(与 WP 中路径结构对应),本地机器上每个媒体文件只需要下载一次。源码文档 plugin-options.md 中明确了两点注意事项:
- 该选项目前标记为experimental(实验性),默认值为
false; - 使用它时,请务必把项目根目录下的
.wordpress-cache目录加入.gitignore,避免缓存文件进入版本控制。
与它配套的还有两个同类选项,可按需组合使用:
develop.hardCacheData(实验性):把 WordPress 数据硬缓存到./.wordpress-cache/caches,避免缓存清空后重新拉取全部数据。该硬缓存会在远程 WPGraphQL schema 变化或你修改插件选项时自动清理;production.hardCacheMediaFiles(实验性):与develop.hardCacheMediaFiles行为相同,但作用于生产构建,同样会把媒体硬缓存到./.wordpress-cache,并建议 gitignore 该目录。
在开发环境结合type.__all.limit与develop.hardCacheMediaFiles,可以有效避免"每次改动配置就要全量重抓"的开发等待;在 CI/CD 中把.wordpress-cache纳入缓存,也能显著缩短生产构建时间。
进一步定制与进阶资源
Starter 只是起点。上手后你可以从以下几个方面继续深入:
- 理解 Starter 的页面生成逻辑:阅读 starters/gatsby-starter-wordpress-blog/gatsby-node.js,学习
createPagesAPI 如何把 WP 文章/页面uri映射为 Gatsby 页面路径,并生成带previous/next上下文的文章分页归档; - 使用 WordPress 数据编写页面:Starter 的
src/templates/post.js、page.js、blog-post-archive.js展示了如何通过allWpPost、wp(readingSettings等)查询并在模板中渲染数据; - 配置 WPGatsby 的构建与预览:参考 configuring-wp-gatsby.md,在 WP 后台的
GatsbyJS设置页(/wp-admin/options-general.php?page=gatsbyjs)填入 Builds Webhook / Preview Webhook,即可在 WP 内容更新时触发构建服务重新构建; - 查阅完整的插件选项:所有可选参数(
verbose、debug.*、auth.*、schema.*、html.*、searchAndReplace、catchLinks等)的字段类型、默认值与代码示例,均收录于 plugin-options.md; - 了解插件的数据抓取与媒体处理机制:可继续阅读 features/index.md 下的缓存(caching)、媒体处理(media-item-processing)、预览(preview)等专题文档。
小结
从 Starter 搭建 Gatsby + WordPress 站点的完整链路可以浓缩为四步:
- 准备 WP:安装 WPGraphQL(提供
/graphql端点)与 WPGatsby(提供变更日志、Preview 与 Webhook); - 创建站点:
gatsby new基于 gatsby-starter-wordpress-blog 生成工程; - 接入数据:在 gatsby-config.js 中把
gatsby-source-wordpress的url指向你的 GraphQL 端点; - 按需优化:大型站点使用
type.__all.limit限制开发期抓取量,使用develop.hardCacheMediaFiles/develop.hardCacheData硬缓存媒体与数据,避免清缓存后的全量重抓。
以上所有配置均可在不写一行自定义插件代码的情况下完成,让 WordPress 内容以 GraphQL 的方式高效流入 Gatsby 的数据层,进而获得 Gatsby 带来的性能、可扩展性与安全性收益。
【免费下载链接】gatsbyReact-based framework with performance, scalability, and security built in.项目地址: https://gitcode.com/gh_mirrors/ga/gatsby
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考