seo-review について
33 JavaScript Conceptsプロジェクトの概念解説ページを対象とするSEO監査エージェントスキルです。キーワード計画、ページ要素やコンテンツ構成のチェック項目、レポート手順を提供します。
主な機能
- 01概念別キーワード群の計画
- 02ページ内SEO要素の確認
- 03強調スニペット向け構成の評価
- 04内部リンクの確認
- 05レポートテンプレートで所見を記録
活用シーン
- 01概念ページ公開前のSEO監査
- 02検索実績が低いページの改善
- 03大幅なコンテンツ更新後の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ leonardomso/ 33-js-concepts --skill seo-reviewインストール後、Claude Code で/seo-reviewを入力して読み込まれたか確認します。
詳細
スキル:概念ページの SEO 監査
このスキルを使って、33 JavaScript Concepts プロジェクトの概念ドキュメントページに対する、対象を絞った SEO 監査を実施します。目標は、JavaScript 開発者が検索したときの表示順位を最大化することです。
使用するタイミング
- 新しい概念ページを公開する前
- パフォーマンスが低いページを最適化するとき
- 定期的なコンテンツ監査
- 大幅なコンテンツ更新の後
- 新しいキーワードをターゲットにするとき
目標
各概念ページは、次のような検索で上位に表示されることを目指します。
- 「JavaScript の [概念] とは」
- 「JavaScript では [概念] はどのように機能するか」
- 「[概念] の JavaScript での解説」
- 「[概念] の JavaScript チュートリアル」
- 「[概念] の JavaScript の例」
SEO 監査の方法
完全な SEO 監査を実施するには、次の 5 つのステップに従います。
ステップ 1:ターゲットキーワードを特定する
監査の前に、その概念のキーワードクラスターを特定します。
キーワードクラスターのテンプレート
| 種類 | パターン | 例(クロージャ) |
|---|---|---|
| 主要 | [概念] JavaScript | closures JavaScript |
| とは | what is [concept] in JavaScript | what is a closure in JavaScript |
| どのように機能するか | how does [concept] work | how do closures work |
| 使い方 | how to use/create [concept] | how to use closures |
| 理由 | why use [concept] | why use closures JavaScript |
| 例 | [concept] examples | closure examples JavaScript |
| 比較 | [concept] vs [related] | closures vs scope |
| 面接 | [concept] interview questions | closure interview questions |
ステップ 2:ページ内 SEO 監査
ページ内の SEO 要素をすべて体系的に確認します。
ステップ 3:強調スニペット向けに最適化する
強調スニペットの獲得につながるように、コンテンツが構成されていることを確認します。
ステップ 4:内部リンクを監査する
内部リンクの構造を確認します。
ステップ 5:レポートを作成する
レポートテンプレートを使って、調査結果を記録します。
概念別のキーワードクラスター
各概念向けにあらかじめ用意された、次のキーワードクラスターを使用します。
| 種類 | キーワード | |------|----------| | 主要 | JavaScript call stack、call stack JavaScript | | とは | what is the call stack in JavaScript | | どのように機能するか | how does the call stack work | | エラー | maximum call stack size exceeded、stack overflow JavaScript | | 視覚化 | call stack visualization、call stack explained | | 面接 | call stack interview questions JavaScript | | 種類 | キーワード | |------|----------| | 主要 | JavaScript primitive types、primitives in JavaScript | | とは | what are primitive types in JavaScript | | 一覧 | JavaScript data types、types in JavaScript | | 比較 | primitives vs objects JavaScript | | typeof | typeof JavaScript、JavaScript typeof operator | | 面接 | JavaScript types interview questions | | 種類 | キーワード | |------|----------| | 主要 | JavaScript value vs reference、pass by reference JavaScript | | とは | what is pass by value in JavaScript | | どのように機能するか | how does JavaScript pass objects | | 比較 | value types vs reference types JavaScript | | コピー | how to copy objects JavaScript、deep copy JavaScript | | 種類 | キーワード | |------|----------| | 主要 | JavaScript type coercion、type conversion JavaScript | | とは | what is type coercion in JavaScript | | どのように機能するか | how does type coercion work | | 暗黙的 | implicit type conversion JavaScript | | 明示的 | explicit type conversion JavaScript | | 面接 | type coercion interview questions | | 種類 | キーワード | |------|----------| | 主なキーワード | JavaScript の等価性、JavaScript の == と === | | とは | == と === の違いとは | | 比較 | JavaScript における緩い等価性と厳密な等価性 | | ベストプラクティス | == と === はいつ使うべきか | | 面接 | JavaScript の等価性に関する面接の質問 | | 種類 | キーワード | |------|----------| | 主なキーワード | JavaScript のクロージャ、JavaScript のスコープ | | とは | JavaScript のクロージャとは、スコープとは | | 仕組み | クロージャの仕組み、スコープの仕組み | | 種類 | JavaScript のスコープの種類、レキシカルスコープ | | 用途 | クロージャの用途、クロージャを使う理由 | | 面接 | JavaScript のクロージャに関する面接の質問 | | 種類 | キーワード | |------|----------| | 主なキーワード | JavaScript のイベントループ、JavaScript のイベントループ | | とは | JavaScript のイベントループとは | | 仕組み | イベントループの仕組み | | 図解 | イベントループの視覚化、イベントループの解説 | | 関連 | コールスタックとイベントループ、JavaScript のタスクキュー | | 面接 | イベントループに関する面接の質問 | | 種類 | キーワード | |------|----------| | 主なキーワード | JavaScript の Promise、JavaScript における Promise | | とは | JavaScript の Promise とは | | 方法 | Promise の使い方、Promise のチェーン方法 | | メソッド | Promise.all、Promise.race、Promise.allSettled | | エラー | Promise のエラー処理、Promise の catch | | 比較 | Promise とコールバック、Promise と async await | | 種類 | キーワード | |------|----------| | 主なキーワード | JavaScript の async await、JavaScript の async await | | とは | JavaScript の async await とは | | 方法 | async await の使い方、async await のチュートリアル | | エラー | async await のエラー処理、async の try catch | | 比較 | async await と Promise | | 面接 | async await に関する面接の質問 | | 種類 | キーワード | |------|----------| | 主なキーワード | JavaScript の this キーワード、JavaScript の this | | とは | JavaScript の this とは | | 仕組み | JavaScript における this の仕組み | | バインディング | JavaScript の call、apply、bind、this のバインディング | | アロー関数 | アロー関数における this | | 面接 | this キーワードに関する面接の質問 | | 種類 | キーワード | |------|----------| | 主なキーワード | JavaScript のプロトタイプ、JavaScript のプロトタイプチェーン | | とは | JavaScript のプロトタイプとは | | 仕組み | プロトタイプ継承の仕組み | | チェーン | プロトタイプチェーンの解説 | | 比較 | JavaScript のプロトタイプとクラス | | 面接 | JavaScript のプロトタイプに関する面接の質問 | | 種類 | キーワード | |------|----------| | 主なキーワード | JavaScript の DOM、JavaScript の DOM 操作 | | とは | JavaScript の DOM とは | | 方法 | JavaScript で DOM を操作する方法 | | メソッド | getElementById、JavaScript の querySelector | | イベント | JavaScript の DOM イベント、イベントリスナー | | パフォーマンス | DOM のパフォーマンス、仮想 DOM と DOM | | 種類 | キーワード | |------|----------| | 主なキーワード | JavaScript の高階関数、高階関数 | | とは | 高階関数とは | | 例 | JavaScript の map、filter、reduce | | 方法 | 高階関数の使い方 | | 面接 | 高階関数に関する面接 | | 種類 | キーワード | |------|----------| | 主なキーワード | JavaScript の再帰、JavaScript における再帰 | | とは | JavaScript における再帰とは | | 方法 | 再帰関数の書き方 | | 例 | JavaScript の再帰の例 | | 比較 | JavaScript の再帰と反復の比較 | | 面接 | 再帰に関する面接の質問 |監査チェックリスト
タイトルタグのチェックリスト(4 点)
| # | チェック項目 | 点数 | 確認方法 |
|---|---|---|---|
| 1 | 50~60 文字 | 1 | title フロントマターの文字数を数えます |
| 2 | 前半に主要キーワードがある | 1 | 概念名が前半にあることを確認します |
| 3 | 「in JavaScript」で終わる | 1 | タイトルの末尾を確認します |
| 4 | 魅力的なフックが含まれている | 1 | 読者に価値やメリットを提示していることを確認します |
採点:
- 4/4:✅ 優秀
- 3/4:⚠️ 良好。多少の改善が可能です
- 0-2/4:❌ 大幅な改善が必要です
タイトルの形式:
[Concept]: [What You'll Understand] in JavaScript
良い例:
| 概念 | タイトル(文字数) |
|---|---|
| クロージャ | "Closures: How Functions Remember Their Scope in JavaScript"(58 文字) |
| イベントループ | "Event Loop: How Async Code Actually Runs in JavaScript"(54 文字) |
| Promise | "Promises: Handling Async Operations in JavaScript"(49 文字) |
| DOM | "DOM: How Browsers Represent Web Pages in JavaScript"(51 文字) |
悪い例:
| 問題 | 悪いタイトル | より良いタイトル |
|---|---|---|
| 短すぎる | "Closures" | "Closures: How Functions Remember Their Scope in JavaScript" |
| 長すぎる | "Understanding JavaScript Closures and How They Work with Examples"(66 文字) | "Closures: How Functions Remember Their Scope in JavaScript"(58 文字) |
| フックがない | "JavaScript Closures" | "Closures: How Functions Remember Their Scope in JavaScript" |
| "JavaScript" がない | "Understanding Closures and Scope" | 末尾に "in JavaScript" を追加します |
メタディスクリプションのチェックリスト(4 点)
| # | チェック項目 | 点数 | 確認方法 |
|---|---|---|---|
| 1 | 150~160 文字 | 1 | description フロントマターの文字数を数えます |
| 2 | 行動を表す語で始まる | 1 | 「Learn」「Understand」「Discover」(「Master」は不可) |
| 3 | 主要キーワードを含む | 1 | 概念名と「JavaScript」が含まれていることを確認します |
| 4 | 具体的な価値を提示している | 1 | 読者が学べる内容を列挙します |
ディスクリプションの形式:
[Action word] [what it is] in JavaScript. [Specific things they'll learn]: [topic 1], [topic 2], and [topic 3].
良い例:
| 概念 | ディスクリプション |
|---|---|
| クロージャ | "Learn JavaScript closures and how functions remember their scope. Covers lexical scoping, practical use cases, memory considerations, and common closure patterns."(159 文字) |
| イベントループ | "Discover how the JavaScript event loop manages async code execution. Understand the call stack, task queue, microtasks, and why JavaScript is single-threaded but non-blocking."(176 文字。短くしてください!) |
| DOM | "Learn how the DOM works in JavaScript. Understand how browsers represent HTML as a tree, select and manipulate elements, traverse nodes, and optimize rendering."(162 文字) |
悪い例:
| 問題 | 悪いディスクリプション | 修正方法 |
|---|---|---|
| 短すぎる | "Learn about closures" | 具体的な内容を加えて150~160文字にします |
| 「Master」で始まる | "Master JavaScript closures..." | "Learn JavaScript closures..." |
| 抽象的すぎる | "A guide to closures" | 扱う具体的なトピックを列挙します |
| キーワードがない | "Functions can remember things" | 「closures」と「JavaScript」を含めます |
キーワード配置チェックリスト(5ポイント)
| # | チェック項目 | ポイント | 確認方法 |
|---|---|---|---|
| 1 | タイトルに主要キーワードが含まれている | 1 | フロントマターの title を確認 |
| 2 | メタディスクリプションに主要キーワードが含まれている | 1 | フロントマターの description を確認 |
| 3 | 最初の100語以内に主要キーワードが含まれている | 1 | 冒頭の段落を確認 |
| 4 | 少なくとも1つのH2見出しにキーワードが含まれている | 1 | すべての ## 見出しを確認 |
| 5 | キーワードを不自然に詰め込んでいない | 1 | コンテンツが自然に読めることを確認 |
キーワード配置マップ:
┌─────────────────────────────────────────────────────────────────────────┐
│ KEYWORD PLACEMENT │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 🔴 CRITICAL (Must have keyword) │
│ ───────────────────────────────── │
│ • title frontmatter │
│ • description frontmatter │
│ • First paragraph (within 100 words) │
│ • At least one H2 heading │
│ │
│ 🟡 RECOMMENDED (Include naturally) │
│ ────────────────────────────────── │
│ • "What you'll learn" Info box │
│ • H3 subheadings │
│ • Key Takeaways section │
│ • First sentence after major H2s │
│ │
│ ⚠️ AVOID │
│ ───────── │
│ • Same phrase >4 times per 1000 words │
│ • Forcing keywords where pronouns work better │
│ • Awkward sentence structures to fit keywords │
│ │
└─────────────────────────────────────────────────────────────────────────┘
コンテンツ構成チェックリスト(6ポイント)
| # | チェック項目 | ポイント | 確認方法 |
|---|---|---|---|
| 1 | 問いかけで始まっている | 1 | 最初の段落で読者の関心を引く質問をしている |
| 2 | 最初の200語以内にコード例がある | 1 | 冒頭に簡単な例がある |
| 3 | 「学べること」の情報ボックスがある | 1 | 冒頭の後に <Info> コンポーネントがある |
| 4 | 段落が短い(2〜4文) | 1 | 長いブロックがないかコンテンツを確認 |
| 5 | 1,500語以上ある | 1 | 語数を確認 |
| 6 | 重要な用語が初出時に太字になっている | 1 | 重要な用語に **bold** を使用 |
コンテンツ構成テンプレート:
┌─────────────────────────────────────────────────────────────────────────┐
│ IDEAL PAGE STRUCTURE │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. QUESTION HOOK (First 50 words) │
│ "How does JavaScript...? Why do...?" │
│ │
│ 2. BRIEF ANSWER + CODE EXAMPLE (Words 50-200) │
│ Quick explanation + simple code demo │
│ │
│ 3. "WHAT YOU'LL LEARN" INFO BOX │
│ 5-7 bullet points │
│ │
│ 4. PREREQUISITES WARNING (if applicable) │
│ Link to required prior concepts │
│ │
│ 5. MAIN CONTENT SECTIONS (H2s) │
│ Each H2 answers a question or teaches a concept │
│ Include code examples, diagrams, tables │
│ │
│ 6. COMMON MISTAKES / GOTCHAS SECTION │
│ What trips people up │
│ │
│ 7. KEY TAKEAWAYS │
│ 8-10 numbered points summarizing everything │
│ │
│ 8. TEST YOUR KNOWLEDGE │
│ 5-6 Q&A accordions │
│ │
│ 9. RELATED CONCEPTS │
│ 4 cards linking to related topics │
│ │
│ 10. RESOURCES (Reference, Articles, Videos) │
│ MDN links, curated articles, videos │
│ │
└─────────────────────────────────────────────────────────────────────────┘
フィーチャードスニペットチェックリスト(4ポイント)
| # | チェック項目 | ポイント | 確認方法 |
|---|---|---|---|
| 1 | 「Xとは何か」に40〜60語の定義がある | 1 | 「What is」H2の後に続く最初の段落の語数を数える |
| 2 | 質問形式のH2見出しが少なくとも1つある | 1 | 「What is」「How does」「Why」のH2見出しがあるか確認 |
| 3 | 「方法」のコンテンツに番号付きの手順がある | 1 | <Steps> コンポーネントまたは番号付きリストを使用 |
| 4 | 比較表がある(該当する場合) | 1 | 「X vs Y」のコンテンツに表がある |
フィーチャードスニペットのパターン:
┌─────────────────────────────────────────────────────────────────────────┐
│ FEATURED SNIPPET FORMATS │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ QUERY TYPE WINNING FORMAT YOUR CONTENT │
│ ─────────── ────────────── ──────────── │
│ │
│ "What is X" Paragraph 40-60 word definition │
│ after H2, bold keyword │
│ │
│ "How to X" Numbered list <Steps> component or │
│ 1. 2. 3. markdown │
│ │
│ "X vs Y" Table | Feature | X | Y | │
│ comparison table │
│ │
│ "Types of X" Bullet list - **Type 1** — desc │
│ - **Type 2** — desc │
│ │
│ "[X] examples" Code block ```javascript │
│ + explanation // example code │
│ │
└─────────────────────────────────────────────────────────────────────────┘
定義段落の例(40〜60語):
## What is a Closure in JavaScript?
A **closure** is a function that retains access to variables from its outer
(enclosing) scope, even after that outer function has finished executing.
Closures are created every time a function is created in JavaScript, allowing
inner functions to "remember" and access their lexical environment.
(これは52語です。フィーチャードスニペットに最適です)
内部リンクチェックリスト(4ポイント)
| # | チェック項目 | ポイント | 確認方法 |
|---|---|---|---|
| 1 | 本文内で関連する概念に3〜5件リンクしている | 1 | 本文中の /concepts/ リンク数を数える |
| 2 | 内容がわかるアンカーテキストを使用している | 1 | 「ここをクリック」「ここ」「これ」を使っていない |
| 3 | 警告ボックスに前提条件が記載されている | 1 | 冒頭にリンク付きの <Warning> がある |
| 4 | 関連する概念のセクションにカードが4枚ある | 1 | 最後に4枚のカードを含む <CardGroup> がある |
適切なアンカーテキスト:
| ❌ 不適切 | ✓ 適切 |
|---|---|
| 「ここをクリック」 | 「イベントループの概念」 |
| 「ここ」 | 「JavaScriptのクロージャ」 |
| 「この記事」 | 「Promisesのガイド」 |
| 「続きを読む」 | 「コールスタックを理解する」 |
リンク配置の戦略:
<Warning>
**Prerequisite:** This guide assumes you understand [Promises](/concepts/promises)
and the [Event Loop](/concepts/event-loop). Read those first if needed.
</Warning>
When the callback finishes, it's added to the task queue — managed by
the [event loop](/concepts/event-loop).
<CardGroup cols={2}>
<Card title="Promises" icon="handshake" href="/concepts/promises">
async/await is built on top of Promises
</Card>
</CardGroup>
テクニカル SEO チェックリスト(3 点)
| # | チェック項目 | 点数 | 確認方法 |
|---|---|---|---|
| 1 | 1 ページにつき H1 は 1 つ | 1 | # 見出し(タイトル)が 1 つだけであること |
| 2 | URL スラッグにキーワードが含まれている | 1 | /concepts/topic-1 ではなく /concepts/closures |
| 3 | 孤立ページがない | 1 | 少なくとも 1 つの他のページからリンクされていること |
H1 のルール:
すべてのページには、H1(メインタイトル)が必ず 1 つだけ存在する必要があります。これは SEO にとって極めて重要です:
- H1 は、そのページが何について書かれているかを Google に伝えます
- H1 が複数あると、検索エンジンがページ階層を誤解します
- その他の見出しはすべて H2(
##)以下にする必要があります - H1 には主要キーワードを含める必要があります
# Closures in JavaScript ← This is your H1 (only one!)
## What is a Closure? ← H2 for sections
### Lexical Scope ← H3 for subsections
## How Closures Work ← Another H2
URL/スラッグのベストプラクティス:
| ✅ 良い | ❌ 悪い |
|---|---|
/concepts/closures | /concepts/c1 |
/concepts/event-loop | /concepts/topic-7 |
/concepts/type-coercion | /concepts/abc123 |
/concepts/async-await | /concepts/async_await |
スラッグのルール:
- 主要キーワードを含める — URL に概念名を含める必要があります
- アンダースコアではなくハイフンを使用する —
event_loopではなくevent-loop - スラッグは短く読みやすく保つ — 50 文字以内
- UUID、データベース ID、ランダムな文字列は使用しない
- 小文字のみ —
/concepts/Event-Loopではなく/concepts/event-loop
孤立ページの検出:
孤立ページとは、他のページから内部リンクが 1 つも張られていないページです。これは以下の理由で SEO に悪影響を与えます:
- Google がそのページを頻繁に発見・クロールできない可能性があります
- サイト構造にとってそのページが重要でないというシグナルになります
- ユーザーが自然にそのページへ移動できません
- リンクエクイティがそのページに流れません
孤立ページを確認する方法:
- コードベースでこの概念へのリンクを検索します:
grep -r "/concepts/[slug]" docs/ - 少なくとも 1 つの他の概念の「Related Concepts」セクションに掲載されていることを確認します
- このページを前提条件として挙げているページが、適切にリンクを張り返していることを確認します
- ナビゲーション(
docs.json)に含まれていることを確認します
孤立ページの修正:
- 関連ページの「Related Concepts」CardGroup にこの概念を追加します
- 関連する概念の本文コンテンツ内で自然にリンクします
- 双方向リンクを確保します(A が B にリンクしている場合、関連する箇所で B からも A にリンクを張り返す必要があります)
スコアリングシステム
合計点数の上限: 30
| カテゴリ | 最大点数 |
|---|---|
| タイトルタグ | 4 |
| メタディスクリプション | 4 |
| キーワードの配置 | 5 |
| コンテンツ構造 | 6 |
| 強調スニペット | 4 |
| 内部リンク | 4 |
| テクニカル SEO | 3 |
| 合計 | 30 |
スコアの解釈
| スコア | 割合 | ステータス | 対応 |
|---|---|---|---|
| 27-30 | 90-100% | ✅ 優秀 | 公開可能 |
| 23-26 | 75-89% | ⚠️ 良好 | 軽微な最適化が必要 |
| 17-22 | 55-74% | ⚠️ 普通 | いくつかの改善が必要 |
| 0-16 | <55% | ❌ 不良 | 大幅な作業が必要 |
よくある SEO の問題と修正方法
タイトルタグの問題
| 問題 | 現状 | 修正 |
|---|---|---|
| 短すぎる(50 文字未満) | 「Closures」(8) | 「Closures: How Functions Remember Their Scope in JavaScript」(58) |
| 長すぎる(60 文字超) | 「Understanding JavaScript Closures and How They Work with Examples」(66) | 「Closures: How Functions Remember Their Scope in JavaScript」(58) |
| キーワードが欠けている | 「Understanding Scope」 | 概念名を追加: 「Closures: Understanding Scope in JavaScript」 |
| フックがない | 「JavaScript Closures」 | ベネフィットを追加: 「Closures: How Functions Remember Their Scope in JavaScript」 |
| 「JavaScript」が欠けている | 「Closures Explained」 | 末尾に追加: 「Closures Explained in JavaScript」 |
メタディスクリプションの問題
| 問題 | 現在の内容 | 修正方法 |
|---|---|---|
| 短すぎる(<120 文字) | "Learn about closures"(20) | 具体的な内容を加えて、150~160 文字にします |
| 長すぎる(>160 文字) | [途中で切り捨てられる] | 必要な情報に絞り、思い切って編集します |
| 「Master」で始まる | "Master JavaScript closures..." | "Learn JavaScript closures..." |
| キーワードがない | "Functions that remember" | "closures" と "JavaScript" を含めます |
| 曖昧すぎる | "A guide to closures" | 「X、Y、Z を解説」のように具体的なトピックを挙げます |
コンテンツ構成の問題
| 問題 | 修正方法 |
|---|---|
| 質問形式の導入がない | 「How does...?」または「Why...?」で始めます |
| コード例が後半にある | 簡単な例を最初の 200 語以内に移動します |
| Info ボックスがない | 「学べる内容」を記載した <Info> を追加します |
| 段落が長い | 2~4 文のまとまりに分割します |
| 1,500 語未満 | 詳細、例、エッジケースを追加します |
| 太字の用語がない | 重要な概念が初めて登場する箇所で太字にします |
強調スニペットの問題
| 問題 | 修正方法 |
|---|---|
| 「What is」の定義がない | 40~60 語の定義段落を追加します |
| 定義が長すぎる | 40~60 語に簡潔化します |
| 質問形式の H2 がない | 「What is X?」または「How does X work?」の H2 を追加します |
| 手順に番号がない | <Steps> または番号付き Markdown を使います |
| 比較表がない | 「X vs Y」のセクションに表を追加します |
内部リンクの問題
| 問題 | 修正方法 |
|---|---|
| 内部リンクがない | 関連する概念へのリンクを 3~5 件追加します |
| アンカーテキストが不適切 | 「click here」を説明的なテキストに置き換えます |
| 前提条件がない | 前提条件へのリンクを含む <Warning> を追加します |
| Related Concepts が空 | 関連トピックにリンクする Cards を 4 つ追加します |
技術的な SEO の問題
| 問題 | 修正方法 |
|---|---|
| H1 タグが複数ある | # 見出しはタイトルの 1 つだけにし、すべてのセクションには ## を使います |
| スラッグにキーワードがない | 概念名を含むファイル名に変更します(例:closures.mdx) |
| 孤立ページになっている | 関連する概念ページの本文または Related Concepts セクションからリンクを追加します |
| スラッグにアンダースコアがある | event_loop.mdx ではなく、event-loop.mdx のようにハイフンを使います |
| スラッグに大文字がある | Async-Await.mdx ではなく、async-await.mdx のように小文字のみを使います |
| スラッグが長すぎる | understanding-javascript-closures-and-scope.mdx ではなく、closures.mdx のように主要なキーワードに短縮します |
SEO 監査レポートのテンプレート
このテンプレートを使用して、調査結果を記録します。
# SEO Audit Report: [Concept Name]
**File:** `/docs/concepts/[slug].mdx`
**Date:** YYYY-MM-DD
**Auditor:** [Name/Claude]
**Overall Score:** XX/30 (XX%)
**Status:** ✅ Excellent | ⚠️ Needs Work | ❌ Poor
---
## Score Summary
| Category | Score | Status |
|----------|-------|--------|
| Title Tag | X/4 | ✅/⚠️/❌ |
| Meta Description | X/4 | ✅/⚠️/❌ |
| Keyword Placement | X/5 | ✅/⚠️/❌ |
| Content Structure | X/6 | ✅/⚠️/❌ |
| Featured Snippets | X/4 | ✅/⚠️/❌ |
| Internal Linking | X/4 | ✅/⚠️/❌ |
| Technical SEO | X/3 | ✅/⚠️/❌ |
| **Total** | **X/30** | **STATUS** |
---
## Target Keywords
**Primary Keyword:** [e.g., "JavaScript closures"]
**Secondary Keywords:**
- [keyword 1]
- [keyword 2]
- [keyword 3]
**Search Intent:** Informational / How-to / Comparison
---
## Title Tag Analysis
**Current Title:** "[current title from frontmatter]"
**Character Count:** XX characters
**Score:** X/4
| Check | Status | Notes |
|-------|--------|-------|
| Length 50-60 chars | ✅/❌ | XX characters |
| Primary keyword in first half | ✅/❌ | [notes] |
| Ends with "in JavaScript" | ✅/❌ | [notes] |
| Contains compelling hook | ✅/❌ | [notes] |
**Issues Found:** [if any]
**Recommended Title:** "[suggested title]" (XX chars)
---
## Meta Description Analysis
**Current Description:** "[current description from frontmatter]"
**Character Count:** XX characters
**Score:** X/4
| Check | Status | Notes |
|-------|--------|-------|
| Length 150-160 chars | ✅/❌ | XX characters |
| Starts with action word | ✅/❌ | Starts with "[word]" |
| Contains primary keyword | ✅/❌ | [notes] |
| Promises specific value | ✅/❌ | [notes] |
**Issues Found:** [if any]
**Recommended Description:** "[suggested description]" (XX chars)
---
## Keyword Placement Analysis
**Score:** X/5
| Location | Present | Notes |
|----------|---------|-------|
| Title | ✅/❌ | [notes] |
| Meta description | ✅/❌ | [notes] |
| First 100 words | ✅/❌ | Found at word XX |
| H2 heading | ✅/❌ | Found in: "[H2 text]" |
| Natural reading | ✅/❌ | [no stuffing / stuffing detected] |
**Missing Keyword Placements:**
- [ ] [Location where keyword should be added]
---
## Content Structure Analysis
**Word Count:** X,XXX words
**Score:** X/6
| Check | Status | Notes |
|-------|--------|-------|
| Question hook opening | ✅/❌ | [notes] |
| Code in first 200 words | ✅/❌ | Code appears at word XX |
| "What you'll learn" box | ✅/❌ | [present/missing] |
| Short paragraphs | ✅/❌ | [notes on paragraph length] |
| 1,500+ words | ✅/❌ | X,XXX words |
| Bolded key terms | ✅/❌ | [notes] |
**Structure Issues:**
- [ ] [Issue and recommendation]
---
## Featured Snippet Analysis
**Score:** X/4
| Check | Status | Notes |
|-------|--------|-------|
| 40-60 word definition | ✅/❌ | Currently XX words |
| Question-format H2 | ✅/❌ | Found: "[H2]" / Not found |
| Numbered steps | ✅/❌ | [notes] |
| Comparison tables | ✅/❌/N/A | [notes] |
**Snippet Opportunities:**
1. **"What is [concept]" snippet:**
- Current definition: XX words
- Action: [Expand to/Trim to] 40-60 words
2. **"How to [action]" snippet:**
- Action: [Add Steps component / Already present]
---
## Internal Linking Analysis
**Score:** X/4
| Check | Status | Notes |
|-------|--------|-------|
| 3-5 internal links in body | ✅/❌ | Found X links |
| Descriptive anchor text | ✅/❌ | [notes] |
| Prerequisites in Warning | ✅/❌ | [present/missing] |
| Related Concepts section | ✅/❌ | X cards present |
**Current Internal Links:**
1. [Anchor text] → `/concepts/[slug]`
2. [Anchor text] → `/concepts/[slug]`
**Recommended Links to Add:**
- Link to [concept] in [section/context]
- Link to [concept] in [section/context]
**Bad Anchor Text Found:**
- Line XX: "click here" → change to "[descriptive text]"
---
## Technical SEO Analysis
**Score:** X/3
| Check | Status | Notes |
|-------|--------|-------|
| Single H1 per page | ✅/❌ | [Found X H1 tags] |
| URL slug contains keyword | ✅/❌ | Current: `/concepts/[slug]` |
| Not an orphan page | ✅/❌ | Linked from X other pages |
**H1 Tags Found:**
- Line XX: `# [H1 text]` ← Should be the only one
- [List any additional H1s that need to be changed to H2]
**Slug Analysis:**
- Current slug: `[slug].mdx`
- Contains keyword: ✅/❌
- Format correct: ✅/❌ (lowercase, hyphens, no special chars)
**Incoming Links Found:**
1. `/concepts/[other-concept]` → Links to this page in [section]
2. `/concepts/[other-concept]` → Links in Related Concepts
**If orphan page, add links from:**
- [Suggested concept page] in [section]
- [Suggested concept page] in Related Concepts
---
## Priority Fixes
### High Priority (Do First)
1. **[Issue]**
- Current: [what it is now]
- Recommended: [what it should be]
- Impact: [why this matters]
2. **[Issue]**
- Current: [what it is now]
- Recommended: [what it should be]
- Impact: [why this matters]
### Medium Priority
1. **[Issue]**
- Recommendation: [fix]
### Low Priority (Nice to Have)
1. **[Issue]**
- Recommendation: [fix]
---
## Competitive Analysis (Optional)
**Top-Ranking Pages for "[primary keyword]":**
1. **[Competitor 1 - URL]**
- What they do well: [observation]
- Word count: ~X,XXX
2. **[Competitor 2 - URL]**
- What they do well: [observation]
- Word count: ~X,XXX
**Our Advantages:**
- [What we do better]
**Gaps to Fill:**
- [What we're missing that competitors have]
---
## Implementation Checklist
After making fixes, verify:
- [ ] Title is 50-60 characters with keyword and hook
- [ ] Description is 150-160 characters with action word and value
- [ ] Primary keyword in title, description, first 100 words, and H2
- [ ] Opens with question hook
- [ ] Code example in first 200 words
- [ ] "What you'll learn" Info box present
- [ ] Paragraphs are 2-4 sentences
- [ ] 1,500+ words total
- [ ] Key terms bolded on first mention
- [ ] 40-60 word definition for featured snippet
- [ ] At least one question-format H2
- [ ] 3-5 internal links with descriptive anchor text
- [ ] Prerequisites in Warning box (if applicable)
- [ ] Related Concepts section has 4 cards
- [ ] Single H1 per page (title only)
- [ ] URL slug contains primary keyword
- [ ] Page linked from at least one other concept page
- [ ] All fixes implemented and verified
---
## Final Recommendation
**Ready to Publish:** ✅ Yes / ❌ No - [reason]
**Next Review Date:** [When to re-audit, e.g., "3 months" or "after major update"]
クイックリファレンス
文字数
| 要素 | 理想的な長さ |
|---|---|
| タイトル | 50~60 文字 |
| メタディスクリプション | 150~160 文字 |
| 定義段落 | 40~60 語 |
キーワード密度
- 1,000 語あたり、完全一致するフレーズの使用は 3~4 回までにします
- バリエーションを自然に使います(例:「closures」「closure」「JavaScript closures」)
コンテンツの長さ
| 長さ | 評価 |
|---|---|
| <1,000 語 | 内容が薄すぎます — 詳細を追加します |
| 1,000~1,500 | 最低限の実用水準 |
| 1,500~2,500 | 良好 |
| 2,500~4,000 | 非常に優れている |
| >4,000 | 分割を検討します |
まとめ
SEO のために概念ページを監査する際は、次の手順に従います。
- ターゲットキーワードを特定する — その概念のキーワードクラスターを使用します
- タイトルタグを確認する — 50~60 文字、キーワードを先頭に置き、関心を引く内容にして、「JavaScript」で終わらせます
- メタディスクリプションを確認する — 150~160 文字、行動を促す語句、キーワード、具体的な価値を含めます
- キーワードの配置を確認する — タイトル、説明文、最初の 100 語、H2 を確認します
- コンテンツ構成を監査する — 質問形式の導入、早めのコード例、Info ボックス、短い段落を確認します
- 強調スニペット向けに最適化する — 40~60 語の定義、番号付き手順、表を用意します
- 内部リンクを確認する — 3~5 件のリンク、適切なアンカーテキスト、Related Concepts セクションを確認します
- レポートを作成する — スコア、問題、優先順位を付けた修正内容を記録します
覚えておいてください: SEO は検索エンジンの攻略ではなく、必要な開発者がコンテンツを見つけやすくすることです。最適化のすべてが、読者にとっての使いやすさも向上させるようにしましょう。