Gatsby 主题系统提供了一个框架,用于将 Gatsby 功能打包成可重用、可组合和可定制的单元。它扩展了标准的 Gatsby 插件系统,允许将完整的站点实现作为 npm 包安装,同时通过一种称为组件遮蔽(component shadowing)的技术实现站点特定的定制。
本文档详细介绍了主题系统在内部如何工作,主题如何与 Gatsby 核心集成,以及开发者如何创建、使用和定制主题。
Gatsby 主题是专业的插件,它们包含一套完整的 Gatsby 配置文件(gatsby-config.js、gatsby-node.js 等)、组件、模板、样式以及可能的数据。与通常为 Gatsby 构建过程添加特定功能的标准插件不同,主题可以提供完整的站点实现。
主题的配置(插件、数据源等)在构建时会与站点的配置合并。这种合并遵循特定的规则,以确保在使用多个主题时行为可预测。
来源:starters/gatsby-starter-theme-workspace/example/package.json, package.json
组件遮蔽是 Gatsby 主题系统的关键创新。它允许站点开发者覆盖主题中的任何组件、模板或资源,而无需完全分叉(fork)或脱离(eject)主题。
遮蔽机制遵循确定性的文件解析模式
例如,要遮蔽来自 gatsby-theme-blog 且位于 src/components/bio.js 的组件,您需要创建
your-site/src/gatsby-theme-blog/components/bio.js
此文件将自动替换主题版本,而无需修改主题本身。遮蔽算法遵循以下查找过程
来源:starters/gatsby-starter-theme-workspace/example/package.json
主题可以组合在一起并相互构建,创建可重用的功能层。有两种主要的组合模式
组合遵循以下规则
当多个主题一起使用时,必须考虑遮蔽中潜在的命名空间冲突。主题应使用清晰的命名约定以避免冲突。
来源:starters/gatsby-starter-theme-workspace/example/package.json, starters/blog/package.json
Gatsby 主题被构建为包含 Gatsby 特定文件的 Node.js 包
gatsby-theme-example/
├── gatsby-config.js // Theme configuration
├── gatsby-node.js // Data creation and schema customization
├── gatsby-browser.js // Browser-specific functionality (optional)
├── gatsby-ssr.js // Server-side rendering functionality (optional)
├── package.json // Theme metadata and dependencies
└── src/
├── components/ // React components
├── templates/ // Page templates
├── pages/ // Static pages
└── hooks/ // React hooks (optional)
要创建可发布的主题
来源:starters/gatsby-starter-theme-workspace/example/package.json, package.json
要在您的站点中实现 Gatsby 主题
使用多个主题时也适用相同的模式。插件数组中主题声明的顺序对于遮蔽优先级很重要。
来源:starters/gatsby-starter-theme-workspace/example/package.json, starters/blog/package.json
主题可以接受选项来定制其行为,而无需组件遮蔽。这些选项在站点的 gatsby-config.js 中提供
在主题内部,这些选项可在 gatsby-config.js 和 gatsby-node.js 中访问
主题选项允许主题更灵活,同时保持一致的 API。
来源:starters/gatsby-starter-theme-workspace/example/package.json
Gatsby 提供了一个专门用于使用 Yarn 工作区进行主题开发的启动器。这使您能够同时开发主题并使用示例站点进行测试
启动器工作区结构如下
gatsby-starter-theme-workspace/
├── package.json // Workspace configuration
├── example/ // Example site using the theme
│ ├── gatsby-config.js
│ ├── package.json
│ └── src/
└── gatsby-theme-minimal/ // Theme package
├── gatsby-config.js
├── package.json
└── src/
要创建新的主题工作区
此设置通过允许您在示例站点中立即测试更改来简化主题开发。
来源:starters/gatsby-starter-theme-workspace/example/package.json
来源:starters/gatsby-starter-theme-workspace/example/package.json, starters/blog/package.json
Gatsby 生态系统包含针对常见用例的多个主题
| 主题 | 目的 | 特性 |
|---|---|---|
| gatsby-theme-blog | 博客功能 | 文章、标签、作者 |
| gatsby-theme-notes | 笔记应用 | 分层笔记、MDX 支持 |
| gatsby-theme-shopify | 电子商务 | 产品页面、购物车功能 |
| gatsby-theme-documentation | 文档网站 | 侧边栏导航、搜索 |
主题可以组合起来创建全面的解决方案。例如,一个带有博客的文档站点可以同时使用 gatsby-theme-documentation 和 gatsby-theme-blog。
来源:starters/blog/package.json, starters/gatsby-starter-wordpress-blog/package.json