主题实现指南

本指南将详细介绍如何构建符合 Methanol 架构的自定义主题。你将学习如何实现导航、目录、多语言支持等文档站点的核心功能。

推荐目录结构

一个标准的主题通常遵循以下结构:

配置启用主题

methanol.config.js 中通过指定主题根目录和模板组件来启用自定义主题:

import PageTemplate from './theme/page.jsx'

export default () => ({
	theme: {
		root: './theme',
		template: PageTemplate
	}
})

主题对象定义

主题配置也可以在其入口文件(index.js)中定义。这对于可分发的主题特别有用:

import PageTemplate from './page.jsx'

export default () => ({
	theme: {
		root: '.',
		template: PageTemplate,
		componentsDir: './components',
		pagesDir: './pages',
		publicDir: './public',
		sources: {
			'/theme': './sources'
		}
	}
})

发布与解析

主题可以作为名为 methanol-theme-xxx 的 npm 包发布。Methanol 按照以下优先级自动解析主题名称:

  1. 内置主题: 内部预设(如 defaultblog)。
  2. 包解析: 搜索名为 methanol-theme-xxx 的包。
  3. 本地路径: 解析为指向文件或目录的直接路径。

使用已发布的主题

通过 CLI:

methanol build --theme xxx

通过 methanol.config.js

export default () => ({
	theme: 'xxx'
})

模板接口规范

theme.template 函数接收一个包含以下属性的上下文对象:

最小实现示例

import { HTMLRenderer } from 'methanol'

export default ({ PageContent, ExtraHead, ctx }) => (
	<>
		{HTMLRenderer.rawHTML`<!doctype html>`}
		<html lang="zh">
			<head>
				<meta charset="UTF-8" />
				<meta name="viewport" content="width=device-width" />
				<ExtraHead />
				<title>{ctx.page.title || ctx.site.name}</title>
			</head>
			<body>
				<PageContent />
			</body>
		</html>
	</>
)

关于实际主题开发中的详细实现,请参阅以下专项指南: