Другое

Создание интерактивной документации с JSDoc JSON для

Создайте сайт интерактивной документации, похожий на DevDocs, используя вывод JSDoc JSON. Реализуйте мгновенную фильтрацию, навигацию и поиск без перезагрузки страниц.

Как создать интерактивный сайт документации из исходного кода JavaScript, используя JSON‑вывод JSDoc

Я работаю над проектом Electron и сгенерировал JSON‑документацию из моего JavaScript‑исходного кода с помощью JSDoc командой:

bash
jsdoc -X > data.json

Хочу использовать этот JSON‑вывод для создания живого, поискового сайта документации, похожего на DevDocs, с такими функциями:

  • мгновенная фильтрация (например, ввод get_ сразу отфильтровывает и отображает все соответствующие функции, классы или переменные)
  • кликабельная навигация к подробным страницам документации для каждого символа
  • чёткое указание, к какому модулю или файлу принадлежит каждый символ
  • клиентский поиск и навигация без перезагрузки страниц

Как можно использовать JSON, сгенерированный из моего исходного кода, чтобы построить сайт документации с этими поисковыми и навигационными возможностями?

Я открыт к альтернативам JSDoc и буду благодарен за рекомендации существующих инструментов или фреймворков, которые могут помочь достичь этой цели.

JSDoc JSON‑вывод предоставляет отличную основу для создания интерактивных сайтов‑документации, и вы можете добиться желаемых функций поиска и навигации, либо создав собственное решение с использованием современных веб‑фреймворков, либо воспользовавшись уже существующими инструментами, которые поддерживают JSON‑вывод и интерактивные возможности.

Содержание

Понимание JSON‑вывода JSDoc

При выполнении jsdoc -X > data.json JSDoc генерирует структурированный JSON‑файл, содержащий всю документацию, извлечённую из вашего JavaScript‑кода. Этот JSON‑вывод обычно включает:

  • Определения функций с параметрами, типами возвращаемых значений и описаниями
  • Определения классов с методами и свойствами
  • Организацию модулей и файлов
  • Теги JSDoc и метаданные
  • Ссылки на исходный код и номера строк

Согласно официальной документации JSDoc, этот формат JSON предоставляет гибкую основу для пользовательских реализаций документации. Структура JSON позволяет создавать богатые, интерактивные интерфейсы, которые могут обеспечивать мгновенную фильтрацию и навигацию, которые вы ищете.

Создание пользовательской интерактивной документации

Для получения опыта, похожего на DevDocs, с вашим JSON‑выводом JSDoc, рассмотрите следующие подходы:

Интеграция с фронтенд‑фреймворком

Используйте современные JavaScript‑фреймворки, такие как React, Vue или Svelte, чтобы создать интерактивный интерфейс документации:

javascript
// Пример React‑компонента для фильтрации
function DocumentationViewer({ jsonData }) {
  const [searchTerm, setSearchTerm] = useState('');
  const [filteredResults, setFilteredResults] = useState([]);

  useEffect(() => {
    const filtered = jsonData.filter(item => 
      item.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
      item.description?.toLowerCase().includes(searchTerm.toLowerCase())
    );
    setFilteredResults(filtered);
  }, [searchTerm, jsonData]);

  return (
    <div>
      <input 
        type="text" 
        placeholder="Фильтровать функции, классы..." 
        value={searchTerm}
        onChange={(e) => setSearchTerm(e.target.value)}
      />
      <div className="results">
        {filteredResults.map(item => (
          <DocumentationItem key={item.name} item={item} />
        ))}
      </div>
    </div>
  );
}

Реализация поиска в реальном времени

Для мгновенной фильтрации, похожей на DevDocs, реализуйте дебаунс‑поиск с клиентской фильтрацией:

javascript
function setupInstantSearch(jsonData) {
  const searchInput = document.getElementById('search-input');
  const resultsContainer = document.getElementById('results');
  
  searchInput.addEventListener('input', debounce((e) => {
    const query = e.target.value.toLowerCase();
    const results = jsonData.filter(item => 
      item.name.startsWith(query) ||
      item.longname.toLowerCase().includes(query)
    );
    renderResults(results);
  }, 100));
}

Организация модулей и файлов

Чтобы явно указать, к какому модулю или файлу принадлежит каждый символ, улучшите отображение JSON‑вывода JSDoc:

javascript
function renderWithModuleInfo(item) {
  return `
    <div class="documentation-item">
      <div class="module-path">${item.memberof || 'Глобальный'} </div>
      <h3>${item.name}</h3>
      <p>${item.description}</p>
      <div class="source-file">Файл: ${item.meta.filename}</div>
    </div>
  `;
}

Существующие фреймворки и инструменты

Несколько инструментов помогут вам достичь интерактивных целей документации без необходимости писать всё с нуля:

Docma

Docma — мощный инструмент для генерации красивой HTML‑документации из JavaScript (JSDoc), Markdown и HTML‑файлов. Он предоставляет:

  • Интерактивную навигацию: встроенный поиск и фильтрация
  • Адаптивный дизайн: хорошо работает на разных устройствах
  • Настраиваемые темы: возможность подстроить под бренд вашего проекта
  • Множественные форматы вывода: HTML, JSON и другие

ESDoc

ESDoc предлагает отличные возможности для интерактивной документации:

  • Встроенный поиск: ESDoc поддерживает поиск в документах только с JavaScript (без серверной реализации)
  • Генерация JSON‑индекса: ESDoc создаёт индекс (JSON) во время генерации документации
  • Система плагинов: расширяемый набор плагинов для дополнительной функциональности

Documentation.js

Documentation.js — современный генератор документации, который может:

  • Выводить HTML, JSON или Markdown: обеспечивает гибкость для разных случаев использования
  • Поддерживать TypeScript и Flow: отлично подходит для современных JavaScript‑проектов
  • Коллекция плагинов: обширный набор плагинов для различных потребностей документации

Шаги реализации

Ниже приведён пошаговый подход к созданию вашего интерактивного сайта документации:

Шаг 1: Генерация расширенного JSON‑вывода

Измените команду JSDoc, чтобы включить более полные данные:

bash
jsdoc -X --configure jsdoc.json --destination ./docs-data > data.json

Создайте файл конфигурации jsdoc.json:

json
{
  "source": {
    "include": ["src"],
    "includePattern": ".+\\.js(doc)?$"
  },
  "opts": {
    "destination": "./docs-data/",
    "recurse": true
  },
  "plugins": ["plugins/markdown"],
  "templates": {
    "cleverLinks": false,
    "monospaceLinks": false
  }
}

Шаг 2: Настройка генератора статического сайта

Используйте генератор статических сайтов, такой как Next.js, Gatsby или Eleventy, чтобы обслуживать вашу документацию:

bash
# Используем Next.js
npx create-next-app docs-site
cd docs-site
npm install js-yaml lodash

Шаг 3: Создание компонентов документации

Разработайте компоненты React/Vue/Svelte для отображения документации:

javascript
// DocumentationViewer.vue
<template>
  <div class="documentation-site">
    <div class="search-sidebar">
      <input 
        v-model="searchQuery" 
        placeholder="Поиск функций, классов..."
        @input="filterResults"
      />
      <nav class="module-navigation">
        <h3>Модули</h3>
        <ul>
          <li 
            v-for="module in modules" 
            :key="module"
            @click="filterByModule(module)"
          >
            {{ module }}
          </li>
        </ul>
      </nav>
    </div>
    
    <div class="main-content">
      <div class="search-results">
        <div 
          v-for="item in filteredItems" 
          :key="item.name"
          class="documentation-item"
          @click="showDetails(item)"
        >
          <div class="item-header">
            <span class="item-type">{{ item.kind }}</span>
            <h4>{{ item.name }}</h4>
            <span class="module-name">{{ item.memberof }}</span>
          </div>
          <p class="item-description">{{ item.description }}</p>
        </div>
      </div>
      
      <div class="detail-view" v-if="selectedItem">
        <DetailPage :item="selectedItem" />
      </div>
    </div>
  </div>
</template>

Шаг 4: Реализация клиентского поиска

Добавьте мощную функциональность поиска:

javascript
// search.js
export class DocumentationSearch {
  constructor(jsonData) {
    this.data = jsonData;
    this.index = this.createSearchIndex();
  }

  createSearchIndex() {
    return this.data.map(item => ({
      name: item.name.toLowerCase(),
      longname: item.longname.toLowerCase(),
      description: (item.description || '').toLowerCase(),
      memberof: (item.memberof || '').toLowerCase(),
      filename: (item.meta?.filename || '').toLowerCase(),
      item: item
    }));
  }

  search(query) {
    if (!query) return this.data;
    
    const lowercaseQuery = query.toLowerCase();
    return this.index
      .filter(entry => 
        entry.name.includes(lowercaseQuery) ||
        entry.longname.includes(lowercaseQuery) ||
        entry.description.includes(lowercaseQuery) ||
        entry.memberof.includes(lowercaseQuery) ||
        entry.filename.includes(lowercaseQuery)
      )
      .map(entry => entry.item);
  }

  searchByPrefix(prefix) {
    const lowercasePrefix = prefix.toLowerCase();
    return this.index
      .filter(entry => entry.name.startsWith(lowercasePrefix))
      .map(entry => entry.item);
  }
}

Шаг 5: Добавление навигации и маршрутизации

Реализуйте клиентскую маршрутизацию для детальных представлений:

javascript
// router.js
export function setupNavigation() {
  const detailView = document.getElementById('detail-view');
  
  document.addEventListener('click', (e) => {
    const itemElement = e.target.closest('.documentation-item');
    if (itemElement) {
      const itemName = itemElement.dataset.name;
      showItemDetail(itemName);
    }
  });

  function showItemDetail(itemName) {
    const item = findItemByName(itemName);
    if (item) {
      detailView.innerHTML = renderDetailView(item);
      history.pushState(null, null, `#${itemName}`);
    }
  }
}

Альтернативные генераторы документации

Если JSDoc не удовлетворяет всем вашим требованиям, рассмотрите следующие альтернативы:

ESDoc

ESDoc предоставляет отличную встроенную поисковую систему и генерацию JSON‑индекса:

bash
npm install -g esdoc
esdoc -c esdoc.json

ESDoc автоматически создаёт поисковый индекс и предоставляет чистый, современный интерфейс «из коробки».

Документация TypeScript

Если вы используете TypeScript, воспользуйтесь его встроенными возможностями документации:

bash
# Генерация документации из TypeScript
tsc --declaration
typedoc --out docs src/

Documentation.js

Documentation.js предлагает современные функции и гибкий вывод:

bash
npm install -g documentation
documentation build src/** -f html -o docs

Лучшие практики и оптимизация

Оптимизация производительности

Для больших кодовых баз оптимизируйте ваш сайт документации:

javascript
// Ленивый загрузка элементов документации
function setupLazyLoading() {
  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const item = entry.target;
        loadItemDetails(item.dataset.name);
        observer.unobserve(item);
      }
    });
  });

  document.querySelectorAll('.documentation-item').forEach(item => {
    observer.observe(item);
  });
}

Оптимизация поискового индекса

Создайте оптимизированный поисковый индекс для лучшей производительности:

javascript
function createOptimizedSearchIndex(jsonData) {
  return jsonData.reduce((index, item) => {
    const searchableText = [
      item.name,
      item.longname,
      item.description,
      item.memberof,
      item.params?.map(p => p.name).join(' '),
      item.returns?.description
    ].filter(Boolean).join(' ').toLowerCase();
    
    index[item.name] = {
      ...item,
      searchableText
    };
    
    return index;
  }, {});
}

Адаптивный дизайн

Убедитесь, что ваша документация работает хорошо на всех устройствах:

css
/* Адаптивный макет документации */
.documentation-site {
  display: grid;
  grid-template-columns: 300px 1fr;
  min-height: 100vh;
}

@media (max-width: 768px) {
  .documentation-site {
    grid-template-columns: 1fr;
  }
  
  .search-sidebar {
    position: fixed;
    top: 0;
    left: -300px;
    height: 100vh;
    width: 300px;
    transition: left 0.3s;
    z-index: 1000;
  }
  
  .search-sidebar.open {
    left: 0;
  }
}

Источники

  1. Официальная документация JSDoc – Getting Started
  2. ESDoc – интерактивная документация с встроенным поиском
  3. Docma – генерация красивой HTML‑документации из JSDoc
  4. RealWorldJS – автоматическая документация для JavaScript‑проектов
  5. Let’s Talk JS Documentation – современный генератор документации
  6. Stack Overflow – Генерация интерактивной документации из исходного кода JavaScript
  7. Jeffrey Knox – Создание веб‑сайта документации JavaScript
  8. Deno – Как задокументировать ваш пакет JavaScript

Заключение

Создание интерактивного сайта документации из JSON‑вывода JSDoc возможно несколькими способами:

  • Пользовательские решения с использованием React/Vue/Svelte дают максимальную гибкость и позволяют достичь точного опыта, похожего на DevDocs
  • Существующие фреймворки как Docma и ESDoc предлагают готовые решения с встроенным поиском и навигацией
  • Современные JavaScript‑техники как клиентский поиск, ленивую загрузку и адаптивный дизайн создают отличные пользовательские впечатления

Начните с изучения структуры JSON‑вывода JSDoc, чтобы понять, какие данные доступны, а затем выберите между созданием собственного решения и использованием существующих инструментов в зависимости от сложности проекта и сроков. Для большинства проектов комбинация пользовательских компонентов фронтенда с JSON‑выводом JSDoc обеспечивает лучший баланс контроля и эффективности разработки.

Авторы
Проверено модерацией
Модерация