zfb
GitHub リポジトリ

検索したい単語を入力

いつでも検索バーを開ける

読了時間

Opt-in
作成 2026年6月24日Takeshi Takatsudo

推定読了時間を、コンパイル済みモジュールから利用できる MDX の名前付きエクスポートとして注入する。

readingTime 機能は、パースした Markdown の AST をたどって単語数を数え、コンパイル済み MDX モジュールに export const readingTimeMinutes = N; を注入します。MDX ファイルからこの名前付きエクスポートを直接インポートして、ページ内で利用できます。

有効化

ブール値の短縮形で有効化します(デフォルトの 200 WPM を使用):

// zfb.config.ts
export default defineConfig({
  markdown: {
    features: {
      readingTime: true,
    },
  },
});

または { wpm: N } を渡して、1 分あたりの単語数(words-per-minute)を独自に設定します:

// zfb.config.ts
export default defineConfig({
  markdown: {
    features: {
      readingTime: { wpm: 250 },
    },
  },
});

readingTime: true はデフォルトの 200 WPM を維持します。未知のフィールド(例: { bogus: true })はデシリアライズ時に明確なエラーで拒否されます。

TSX ページでの利用

コンパイル済み MDX モジュールから名前付きエクスポートを直接インポートします:

// src/pages/blog/[...slug].tsx
import { readingTimeMinutes } from "./my-page.mdx";

// readingTimeMinutes は数値 — レイアウトで利用する:
<p>{readingTimeMinutes} min read</p>

単語カウントの計算式

このプラグインは 2 つのパスを組み合わせます:

  1. ラテン文字のテキスト — テキストを空白で分割し、各トークンを 1 単語として数えます。トークンに付随する句読点(例: don'thello-world)は、remark-reading-time と同様に 1 単語として数えます。

  2. CJK 文字 — CJK のテキストは単語間に空白を使わないため、以下の Unicode ブロックに含まれる各文字を 1 単語として数えます:

    • CJK 統合漢字 + 拡張 A(U+3400–U+9FFF)

    • CJK 互換漢字(U+F900–U+FAFF)

    • ひらがな(U+3040–U+309F)

    • カタカナ(U+30A0–U+30FF)

    • ハングル音節(U+AC00–U+D7AF)

    出典: remark-reading-time — 「単語間に空白を使わない言語については、CJK の文字数も使用する。」

総単語数(ラテン文字のトークン + CJK 文字)を、設定された WPM(デフォルト 200)で割り、最も近い整数の分に切り上げ、最小値を 1 とします。

コードブロックは除外される

フェンス付きコードブロックとインラインコードは 数えません。コードブロックに数百行を含むドキュメントでも、コードの内容によって過大に見積もられることはありません。

入力結果(200 WPM の場合)
ラテン文字 200 単語1 分
ラテン文字 600 単語3 分
CJK 200 文字1 分
5 単語1 分(最小値)

補足

  • 記事の長さに関わらず、返される最小値は常に 1 分 です。

  • WPM は設定可能です(デフォルト 200)。{ wpm: N } を渡して上書きします。

  • 読了時間は 本文コンテンツのみ を対象に計算されます — 見出し、段落、リスト、引用、強調はすべて寄与しますが、コードブロック、生の HTML、数式ブロックは寄与しません。

  • このエクスポートは mdast フェーズ(HTML/JSX 変換の前)で注入されるため、常にドキュメントの内容と一致します。

Revision History

Takeshi Takatsudo作成: 2026-06-25T05:17:25+09:00更新: 2026-06-25T05:17:25+09:00

AI Assistant

Ask a question about the documentation.