フッタのカスタマイズ (ページ単位 編)
目的
- ページ (各 md ファイル) 単位のフッタをカスタマイズする
テンプレートを生成する (Swizzle する)
bash
npx docusaurus swizzle @docusaurus/theme-classic DocItem/Footer
引数の DocItem/Footer
というのが「ページ単位」のフッタを表している。
→ src/theme/DocItem/Footer/index.tsx
が生成される
選択肢
- 1: TypeScript
- 2: Eject
参考:用語
- wrap : 親の動作を維持しつつ機能追加したいとき
- eject : 任意の場所に要素を追加・削除したいとき
生成されたコードの説明とカスタマイズ
この例では、markdown ページの 一番下に、自作のフッタと、AdSense を組み込む。
凡例
- ✓ : カスタマイズポイント
- ★ : ただの説明
ts
import React, {type ReactNode} from 'react';
import clsx from 'clsx';
import {ThemeClassNames} from '@docusaurus/theme-common';
import {useDoc} from '@docusaurus/plugin-content-docs/client';
import TagsListInline from '@theme/TagsListInline';
import EditMetaRow from '@theme/EditMetaRow';
export default function DocItemFooter(): ReactNode {
const {metadata} = useDoc();
const {editUrl, lastUpdatedAt, lastUpdatedBy, tags} = metadata;
const canDisplayTagsRow = tags.length > 0; // ← ★ frontmatter の tags 有無
const canDisplayEditMetaRow = !!(editUrl || lastUpdatedAt || lastUpdatedBy); // ← ★ docusaurus.config.ts の presets.classic.docs.editUrl 設定の有無
/* ★ tags, editUrl どちらもない場合にスキップしようとしてる部分
✓ 固定でフッタ入れたい意図には反するので削除するのが良い
↓
const canDisplayFooter = canDisplayTagsRow || canDisplayEditMetaRow;
if (!canDisplayFooter) {
return null;
}
*/
useEffect(() => {
try {
(window.adsbygoogle = window.adsbygoogle || []).push({});
} catch (e) {
console.warn('AdSense push failed:', e);
}
}, []);
return (
<>
<footer
className={clsx(ThemeClassNames.docs.docFooter, 'docusaurus-mt-lg')}>
{canDisplayTagsRow && (
<div
className={clsx(
'row margin-top--sm',
ThemeClassNames.docs.docFooterTagsRow,
)}>
<div className="col">
<TagsListInline tags={tags} />
</div>
</div>
)}
{canDisplayEditMetaRow && (
<EditMetaRow
className={clsx(
'margin-top--sm',
ThemeClassNames.docs.docFooterEditMetaRow,
)}
editUrl={editUrl}
lastUpdatedAt={lastUpdatedAt}
lastUpdatedBy={lastUpdatedBy}
/>
)}
</footer>
{/* ✅ 自前のフッタをここに書く */}
<div>
aaaa
</div>
{/* ✅ 広告ブロックをここに書く */}
<div style={{ marginTop: '2rem', textAlign: 'center' }}>
<ins
className="adsbygoogle"
style={{ display: 'block' }}
data-ad-client="ca-pub-XXXXXXXXXXXX"
data-ad-slot="YYYYYYYYYY"
data-ad-format="auto"
data-full-width-responsive="true"
/>
</div>
{/* ★ Previous/Next は、この下の位置にレンダリングされる */}
</>
);
}
参考. docusaurus.config.ts の footer 設定は関係ない
このあたりの設定は、「ページ全体」のフッタで使われるので、
ここでは関係ない。
docusaurus.config.ts
themeConfig: {
...,
footer: {
style: 'dark',
links: [