設定
Methanol は、プロジェクトのルートにある以下の設定ファイルを自動的にスキャンします。
methanol.config.{js,mjs,cjs,ts,jsx,tsx,mts,cts}
設定ファイルが存在しない場合、カレントディレクトリを基準としたデフォルトの構成仕様が適用されます。
設定ファイルの基本構造
設定ファイルは、構築コンテキストを受け取り設定オブジェクトを返す関数を export する必要があります。
export default ({ mode, root, HTMLRenderer }) => ({
// 各種設定値
})
コンテキストプロパティの説明:
mode:developmentまたはproductionroot: プロジェクトのルートパスHTMLRenderer: rEFui の HTML ユーティリティ(rawHTML、serializeなど)
主要なオプション設定
root
プロジェクトの基準となるディレクトリ。デフォルトはカレントディレクトリ(CWD)です。
site
テンプレート内で参照されるサイトのメタ情報。
site.name: サイトのタイトルsite.owner: サイトの所有者/作者(ブログテーマのフッターとフィードで使用)site.logo: ロゴファイルへのパス(文字列)、またはfalse(デフォルトテーマで非表示にする場合)site.favicon: ファビコンへのパス(文字列)、またはfalse(デフォルトテーマで非表示にする場合)site.base: サブパス配信時のベースパス(例:'/docs/')site.repoBase: ソースリポジトリのベース URL。デフォルトテーマの「Edit this page」リンクの生成に使用されます。
注意点:
site.baseは、自動的に先頭と末尾に/を含む形式に正規化されます(例:docs→'/docs/')。vite.baseを明示的に指定しない限り、site.baseの値が Vite のbaseパスとしても使用されます。- 開発モード(
methanol dev)ではsite.baseの設定は無視され、常に/(ルート)として扱われます。サブパス配信の動作を確認するには、build実行後にserveコマンドを使用してください。
pagefind
Pagefind 全文検索の有効化および設定。デフォルト: false。
pagefind: false
// または
pagefind: { enabled: true }
// または詳細設定
pagefind: {
enabled: true,
excerptLength: 30,
build: {
outputSubdir: 'pagefind',
verbose: true
}
}
注意点:
enabledおよびbuild以外のキーは、Pagefind JS のoptions()に直接渡されます。buildオブジェクトはビルド時専用の構成エントリです。
feed
RSS/Atom フィードの生成を有効化します。デフォルト: false。
feed: true
// または
feed: {
enabled: true,
path: '/rss.xml',
limit: 10,
siteUrl: 'https://example.com',
title: 'My Site',
description: 'Updates from my site',
language: 'en',
atom: false
}
注意点:
atom: trueで Atom を出力します(既定のパスは/rss.xmlまたは/atom.xml)。siteUrlは絶対 URL が必要です。未指定の場合はsite.baseを使用するため、https://example.com/のように完全な URL を設定してください。hiddenなページは除外されます。limitの既定値は10です。- フィード項目は
frontmatter.authorがあればそれを使用し、無い場合はsite.ownerを利用します。
pwa
Methanol の内蔵 PWA 機能(カスタム Service Worker とプリキャッシュマニフェスト)を有効化します。デフォルト: false。
pwa: true
// または
pwa: false
// または詳細設定
pwa: {
manifest: {
name: 'My Site',
short_name: 'My Site'
},
precache: {
include: ['**/*.{html,js,css,ico,png,svg,webp,jpg,jpeg,gif,woff,woff2,ttf}'],
exclude: ['**/*.map', '**/pagefind/**'],
priority: null,
limit: null,
batchSize: null
}
}
注意点:
manifestは生成されるmanifest.webmanifestにマージされます。precacheはprecache-manifest.jsonの生成を制御し、内蔵 Service Worker がインストールおよびウォームアップに使用します。precache.priority: 優先的にキャッシュする glob パターンの配列です。マッチした項目はマニフェストの先頭に配置されます。precache.limit: プリキャッシュマニフェストに含めるエントリ数の上限です(nullは無制限)。precache.batchSize: インストールおよびウォームアップ時に Service Worker が同時に取得するリクエスト数です。- PWA の挙動を完全にカスタマイズする場合は
pwa: falseに設定し、独自のマニフェストと Service Worker を提供してください。
starryNight
構文ハイライト(rehype-starry-night)の制御。デフォルト: true。
starryNight: false
// または
starryNight: true
// または詳細設定
starryNight: {
// rehype-starry-night に渡されるオプション
}
starryNightプロパティがオブジェクトの場合、enabled: falseが明示されない限り機能が有効になります。- 各ページのフロントマターで設定された
starryNightの値が常に最優先されます。 - CLI の
--highlight/--no-highlightフラグにより、実行ごとにグローバル設定を切り替えることが可能です。 - フェンスコードに指定された言語に対応する文法は自動で読み込まれます。曖昧な言語の固定や未対応言語の追加が必要な場合のみ
starryNight.grammarsを使用してください。
jobs
ビルド時のワーカースレッド数を指定します。デフォルト: 0(ページ数に応じた自動設定)。
jobs: 0 // 自動(round(ln(ページ数))、CPU コア数以内)
// または
jobs: 4
- CLI の
--jobs(-j)で実行ごとに上書きできます。
gfm
GitHub Flavored Markdown (GFM) の有効/無効設定。デフォルト: true。
有効な場合、GFM 特有の記法(テーブル、タスクリスト、取り消し線、脚注、自動リンクなど)がフルサポートされます。
gfm: true
// または
gfm: false
pagesDir
MDX/MD ソースファイルの配置ディレクトリ。デフォルトは pages です。pages/ が存在しない場合は、自動的に docs をスキャンします。
componentsDir
JSX/TSX コンポーネントの配置ディレクトリ。デフォルトは components です。
pagesDir や componentsDir を明示的に指定(CLI 引数を含む)した場合、対象のディレクトリが存在しないとビルドエラーとなります。
publicDir
静的アセットの配置ディレクトリ(サイトルート直下で配信されます。例: public/foo.png → /foo.png)。デフォルトは public です。
Methanol は、テーマ側の静的アセット(theme.publicDir)も同時に統合します。ユーザープロジェクト側のファイルと同名のパスが衝突した場合は、ユーザー側のファイルが優先的に適用されます。
統合が必要な際、内部的な作業ディレクトリとして node_modules/.methanol/assets(node_modules/ がない場合は {pagesDir}/.methanol/assets)が一時的に構築されます。
publicDir: false を設定すると、テーマ側のアセットを含め、静的アセットの配信機能が完全に無効化されます。
distDir
本番環境用ビルド成果物の出力先。デフォルトは dist です。
buildDir
ビルド時の中間作業用ディレクトリ(emitIntermediate 用)。デフォルトは build です。
emitIntermediate
true に設定すると、ビルド実行時に build/ ディレクトリへレンダリング後の中間 HTML ファイルを出力します。
theme
サイトに使用するテーマを設定します。テーマオブジェクト(下記参照)または文字列を指定可能です。文字列を指定した場合、以下の優先順位で解決されます。
- 組み込みテーマ: Methanol 内蔵のテーマ(
default、blogなど)と照合します。 - パッケージ解決:
methanol-theme-xxx(xxxは入力された文字列)という名前のパッケージを検索します。
プロジェクト内のローカルテーマを使う場合は、methanol.config.* で import して theme に渡してください。
テーマオブジェクトの完全な仕様については、アドバンスド・テーマ を参照してください。
theme.root: テーマのルートディレクトリ(必須設定)。theme.template: HTML テンプレート関数({ ctx, PageContent, ExtraHead, withBase, HTMLRenderer, components }を引数に取ります)。theme.components: テーマ標準の MDX コンポーネント定義。theme.componentsDir: テーマ固有のコンポーネントディレクトリ。theme.pagesDir: テーマ同梱のページディレクトリ。theme.publicDir: テーマ同梱の静的アセット。theme.sources: 仮想パスを物理ファイルにマッピングするための定義。theme.mdx: ユーザー設定とマージされるテーマ標準の MDX オプション。theme.vite: ユーザー設定とマージされるテーマ標準の Vite 設定。
mdx
MDX のコンパイル設定をカスタマイズします。{ mode, root } を引数として受け取ります。
vite
Vite の設定を詳細にマージします。{ command, mode, root, isPreview } を引数として受け取ります。
preBuild / preBundle / postBundle / postBuild
ビルド一連のプロセスにフックを挿入するための設定です。
preBuild: 開発サーバーの起動時、およびビルドプロセスの開始前に実行されます。preBundle: ビルド時のみ実行され、ページレンダリングの完了後かつ Vite バンドル実行前に呼び出されます。postBundle: ビルド時のみ実行され、Vite バンドル完了後かつ Pagefind インデックス生成前に呼び出されます。postBuild: ビルドプロセス全体の完了後にのみ実行されます(開発サーバーでは実行されません)。
いずれも単一の関数、または関数の配列を指定可能です。
フックコンテキストの主要なプロパティ:
mode,root,command,isDev,isBuild,isPreviewHTMLRenderersite(設定オブジェクトのsiteプロパティ)data: フック間で永続的にデータを共有するための可変オブジェクト
CLI による設定の上書きルール
コマンドライン引数で渡された値は、常に設定ファイルの値よりも優先されます。
--inputおよび--components: それぞれpagesDirとcomponentsDirを上書きします。--assets:publicDirを上書きします。--output:distDirを上書きします。--site-name:site.nameを上書きします。--owner:site.ownerを上書きします。--base: 実行時のsite.baseを一時的に上書きします。--search/--no-search:pagefind.enabledを上書きします。--rss/--no-rss:feed.enabledを上書きします。--atom/--no-atom:feed.atomを上書きします。--pwa/--no-pwa:pwa設定を上書きします。-v/--verbose: 詳細なログ出力を有効化します。--config: 使用する設定ファイルのパスを指定します。- 位置引数としての
input/outputは、--input/--outputフラグと同等の動作をします。
設定ファイルの記述例
import tailwindcss from '@tailwindcss/vite'
export default ({ mode }) => ({
site: { name: 'My Docs' },
theme: {
root: '.',
template: ({ PageContent, ExtraHead, ctx, withBase, HTMLRenderer, components }) => (
<>
{HTMLRenderer.rawHTML`<!doctype html>`}
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<ExtraHead />
<title>{ctx.page.title || ctx.site.name}</title>
<link rel="icon" href="/favicon.png" />
</head>
<body>
{components.Callout ? <components.Callout>Hi</components.Callout> : null}
<PageContent />
</body>
</html>
</>
),
components: {
Callout: ({ children }) => <div class="callout">{children}</div>
}
},
mdx: () => ({
development: mode !== 'production'
}),
vite: () => ({
server: { port: 5173 },
plugins: [tailwindcss()]
})
})