JavaScript

Мой подход к документированию проектов на Javascript

Spread the love

В этой короткой статье я поделюсь с вами своим недавним опытом документирования кода JavaScript. Я пришел к довольно интересному решению с использованием JSDocs, которое может быть применено практически к любому javascript — приложению среднего размера.

Чтобы увидеть, то чем я говорю, вы можете посмотреть на: https://softwarebrothers.github.io/admin-bro-dev/index.html и связанный репозиторий GitHub: https://github.com/SoftwareBrothers/admin-bro-dev

Так что если у вас есть приложение, где:

  • Фронтенд написан на React/Angular/Vue/Vanilla
  • API написано на Node.js
  • И у вас также есть пара (микро) сервисов, написанных на JavaScript …

…то эта статья для вас.

Я не буду рассказывать вам о том, как установить JSDoc в вашем проекте и что означает каждый тег JSDoc. Я скорее опишу идею верхнего уровня настройки JSDoc для полного документирования всего проекта. Вы всегда можете посетить мой канал на YouTube и посмотреть 2 эпизода о JSDocs и better-docs.

Но прежде чем мы углубимся в детали — давайте поговорим о: «зачем это нужно?

Какую проблему решает документирование — или зачем нам нужна документация?

Я участвую в нескольких ИТ-проектах уже десять лет, и всегда требовалась какая-то документация по нескольким причинам:

  • Чтобы хранить и делиться «внутренней» информацией о системе, описания часто используемых терминов и т. д.
  • Для описания архитектуры высокого уровня — какой сервис за что отвечает.
  • Для описания деталей реализации низкого уровня — каковы цели данных Class/Module, описания их интерфейсов и объяснения того, как их использовать

В этой статье я хотел бы рассказать вам, как я решил эти проблемы в одном из моих недавних проектов. Все будет сгруппировано в 6 простых концепций.

6 Концепций

Концепция №. 1: Корневой репозитарий

Обычно «Архитектура приложения» и «Знание бизнеса (Business Knowledge)» — это термины, которые относятся ко всем службам в приложении. Вот почему мне нужно было одно место, где я мог бы разместить всю информацию, касающуюся этих 2 моментов.

Поскольку я использовал JSDocs, я собрал весь код в одном репо с помощью git submodule (https://git-scm.com/book/en/v2/Git-Tools-Submodules) — я буду называть его root repo.

Проще говоря, git submodules позволяют вам связывать одно хранилище с другим.

Это структура основной папки моего корневого хранилища:

(git submodule) /fronted
(git submodule) /api
(git submodule) /microservice1
(git submodule) /microservice2
/infrastructure
/docs-src
/docs
package.json
readme.md etc

В /infrastructure я храню все файлы, связанные с docker и docker-compose.

/docs-src содержит файлы, используемые JSDoc, не обязательно связанные с кодом, такие как статические файлы (изображения, screenshots) и учебные пособия (markdown).

/docs — это место, где хранится актуальная документация.

ОК — вот как я создал несколько репозиториев. Затем я установил JSDoc3 в корневом репозитории (поэтому там есть файл package.json)

Концепция № . 2: JSDOC

Теория:

JSDoc — это язык разметки, используемый для описания кода, написанного на javascript. Он выглядит примерно так:

/**
  * Finds one Record in the Resource by its id
  * @param  {String} id      uniq id of the Resource Record
  * @return {Promise<BaseRecord>}   record
  * @abstract
  */ async findOne(id) {
 //...
 }

В приведенном выше примере мы описали функцию findOne:

  • что она на самом деле делает
  • какие аргументы принимает
  • что возвращает
  • и указали что это абстрактный метод

JSDoc3, с другой стороны, это инструмент, который считывает все комментарии JSDoc и генерирует из них HTML-документацию.

Мой подход:

Каждый репозиторий (включенный как submodule) имеет свои собственные комментарии JSDoc. JSDoc3 можно передать файл конфигурации, в котором я определил, что:

  • вся документация должна быть генерируется в папку /docs
  • JSDoc должен прочитать все git submodules
  • место, куда я положу мои уроки, будет /docs-src (читайте следующий пункт)

…и кучу других параметров.

Концепция №. 3: учебники JSDOC

JSDoc сам по себе создает очень хорошую низкоуровневую документацию для классов, модулей и т. д. Но он также позволяет добавлять пользовательские файлы markdown — они называются «учебниками».

Вот почему я создал папку /docs-src в корневом репозитории — это место, где я размещаю файлы учебников.

Учебники очень полезны, когда речь идет о хранении «Бизнес-знаний». Там вы можете описать общую архитектуру, инструкции по установке, отношения между сервисами, моделями баз данных и т. д.

Взгляните на разделы учебников, которые я создал: https://softwarebrothers.github.io/admin-bro-dev

Концепция №. 4: Графики с MERMAID

Следующее, что я использовал, были графики, созданные с помощью Mermaid. По сути, вы можете добавить график в комментарии JSDocs с помощью тега @mermaid (доступно через плагин mermaid jsdoc).

Я также добавил несколько графиков в уроки со следующим хаком:

### Regular Markdown
Since markdown allows you to insert HTML, this is what you can do:
<div class="mermaid">
 graph LR
 A[BaseDatabase] -->|has many| B(BaseResource)
        B --> |has many|C(BaseRecord)
 B --> |has many|D(BaseProperty)
</div>

At the end of the file you also have to include mermaid:

<script src="https://cdn.rawgit.com/knsv/mermaid/7.0.0/dist/mermaid.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/knsv/mermaid/7.0.0/dist/mermaid.css">
<script>mermaid.initialize({ startOnLoad: true });</script>

Концепция №. 5: Внешний вид документации

По умолчанию JSDoc3 генерирует документацию, которая выглядит следующим образом.

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

Наша тема называется better-docs и может быть найдена здесь: https://github.com/SoftwareBrothers/better-docs

И вот как выглядит та же самая документация:

Концепция №. 6: Группировка с помощью @CATEGORY

Когда я настроил JSDoc для анализа всех git submodules, у меня появилась «не очень хорошо организованная» документация (она была абсолютно запутанной). Поэтому я решил написать крошечный плагин JSDoc, который группирует вещи по категориям — он включен в ранее упомянутые better-doc.

Короче говоря, используя его, вы можете разделить документацию по категориям на боковой панели. Опять же — взгляните на https://softwarebrothers.github.io/admin-bro-dev/index.html — где Adapter, Decorators, Errors и PropertyTypes являются категориями.

И это была последняя из 6 концепций, которые я использовал. Все эти вещи не очень новаторские, но в сочетании они создают очень мощный набор инструментов для документации.

Развертывание

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

  • Опубликуйте это в AWS S3 bucket и хост как статическую страницу
  • Сгенерируйте документацию на каком нибудь вашем сервере и настройте Nginx/Apache для его размещения.
  • Используйте GitHub (или BitBucket)

В прошлый раз я использовал третий вариант — поэтому я создал папку /docs внутри корневого репозитория для хранения документации. Вы можете настроить GitHub для использования в качестве источника публикации, и это стоит того чтобы проверить.

После того как вы сгенерировали документацию в исходном коде, помните, что вы должны время от времени обновлять ее. Подумайте о своих коллегах, которые получают PullRequests с 20 файлами обновленной HTML-документации — как минимум они будут разочарованы … :).

Наличие отдельного корневого репозитория для документации решает эту проблему — фиксации кода остаются внутри подмодулей, и PR, обновляющие сгенерированную документацию, отправляются в корневое репо.

Заключение

До сих пор я использовал эту структуру в 3 проектах, и она работает довольно хорошо.

Я, наверное, уже упоминал об этом пару раз, но вы можете увидеть рабочий пример здесь:

Надеюсь, вы нашли статью полезной, а некоторые советы, которыми я поделился, облегчат вашу жизнь разработчика.

Вы также можете следить за мной в твиттере, где я публикую последние новости о наших библиотеках.

Оригинальная статья: Wojciech Krysiak — MY APPROACH TO DOCUMENTING JAVASCRIPT PROJECTS

Была ли вам полезна эта статья?
[3 / 4.3]

Spread the love
Editorial Team

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

10 месяцев ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

10 месяцев ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

2 года ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

2 года ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

2 года ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

2 года ago