Инструменты пользователя

Инструменты сайта


nodejs:jsdoc

Стандартизация комментариев JavaScript (JSDoc)

Предисловие

Как говорится, нет правила без правил; хотя код набирается и передается компилятору для интерпретации и выполнения, до тех пор, пока нет грамматических ошибок и ошибок форматирования, независимо от того, насколько античеловечен набор, нет проблем, но код - это еще одно широкое применение, помимо выполнения Просто прочтите его, просмотрите свой прошлый код, разберитесь в исходном коде других людей и т. Д., Так что существует стилизация кода, которая может улучшить внешний вид, но при этом его легко читать.

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

JSDoc

Согласно его официальному сайту (https://jsdoc.app/index.html) Введение, JSDoc - это генератор документов API для JavaScript, похожий на Javadoc в Java или phpDocumentor в PHP; добавьте комментарии в указанном формате в исходный код, и инструмент JSDoc автоматически просканирует ваш код и сгенерирует API Веб-сайт документа (сгенерировать связанные файлы веб-страницы в указанном каталоге);

Создание документации по API - это только один аспект. Его основной вклад заключается в стандартизации формата комментариев кода. Возможно, вы не использовали его, но большинство из вас где-то видели в исходном коде формат комментариев, подобный следующему:

/**
 * Returns the sum of a and b
 * @param {number} a
 * @param {number} b
 * @returns {number}
 */
function sum(a, b) {
    return a + b;
}

использовать

Пользоваться инструментом очень просто, сначала установите его:

npm install -g jsdoc

Во-вторых, предположим, что в doc.js Напишите в файл следующий код:

/**
 * Returns the sum of a and b
 * @param {number} a
 * @param {number} b
 * @returns {number}
 */
function sum(a, b) {
    return a + b;
}
/**
 * Return the diff fo a and b
 * @param {number} a
 * @param {number} b
 * @returns {number}
 */
function diff(a, b) {
    return a - b;
}

Затем выполните следующую команду в текущем каталоге:

jsdoc doc.js

Наконец, файл с именем out Содержимое текущего каталога станет следующим:

├── doc.js
└── out
    ├── index.html
    ├── doc.js.html
    ├── global.html
    ├── fonts
    │   ├── OpenSans-BoldItalic-webfont.eot 
    │   ├── OpenSans-BoldItalic-webfont.svg 
    │   ├── OpenSans-BoldItalic-webfont.woff
    │   ├── OpenSans-Bold-webfont.eot       
    │   ├── OpenSans-Bold-webfont.svg       
    │   ├── OpenSans-Bold-webfont.woff      
    │   ├── OpenSans-Italic-webfont.eot     
    │   ├── OpenSans-Italic-webfont.svg     
    │   ├── OpenSans-Italic-webfont.woff    
    │   ├── OpenSans-LightItalic-webfont.eot
    │   ├── OpenSans-LightItalic-webfont.svg
    │   ├── OpenSans-LightItalic-webfont.woff
    │   ├── OpenSans-Light-webfont.eot
    │   ├── OpenSans-Light-webfont.svg
    │   ├── OpenSans-Light-webfont.woff
    │   ├── OpenSans-Regular-webfont.eot
    │   ├── OpenSans-Regular-webfont.svg
    │   └── OpenSans-Regular-webfont.woff
    ├── scripts
    │   ├── linenumber.js
    │   └── prettify
    │       ├── Apache-License-2.0.txt
    │       ├── lang-css.js
    │       └── prettify.js
    └── styles
        ├── jsdoc-default.css
        ├── prettify-jsdoc.css
        └── prettify-tomorrow.css

Посетите это через браузер out Связанные веб-страницы в каталоге будут отображать контент, подобный следующим страницам;

Домашняя страница:

Укажите страницу функции:


Шаблон стиля веб-страницы также можно заменить, просто измените его в соответствии с параметрами командной строки, я не буду рассматривать его здесь, давайте узнаем о формате его комментариев;

Формат комментария

Пожалуйста, обратитесь к официальному веб-сайту для полного ознакомления с форматом (https://jsdoc.app/index.html), текущая версия - JSDoc 3. Ниже представлены только несколько часто используемых тегов и приведены примеры; конечно, если сложно написать кучу тегов, многие редакторы (например, VS Code) теперь предоставляют соответствующие загрузки подключаемых модулей непосредственно в подключаемом модуле. Будет много поисковых ключевых слов jsdoc, которые генерируются с подсказками или автоматически распознают текущий код, что очень удобно;

Комментарий

JSDoc использует следующий формат символов комментария для обертывания тегов, которые будут добавлены на уровне блока:

/**
 * 
 * 
 */

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

/**
   * Оставьте пробел перед описанием
   * Или многострочное описание
   * @param {number} описание параметра
 */

Встроенный пакет:

/** @function */

@description

Также можно написать@desc, Чтобы описать подробную информацию о текущем объекте аннотации;

/**
 * @function
   * @description о введении функции
 */
function myFn() {}
 
/**
   * Вы также можете написать введение прямо здесь
 * @function
   * @description. Если вы продолжите использовать теги для добавления содержимого сюда, оно перезапишет вводное содержимое в первой строке.
 */
function myFn() {}

@file

Комментарий записывается в начале файла, чтобы описать соответствующую информацию о текущем файле; например:

/**
   * @file Это файл для ..., содержит ... функции
 */
 
// Тогда тело кода ...

@author

Опишите соответствующую информацию об авторе текущего файла или кода;

/**
 * @author Jack <jack@example.com>
 */

Опишите информацию об авторских правах текущего файла

/**
 * @copyright Jack 2020
 */

@license

Опишите информацию, относящуюся к текущей лицензии на файл;

/**
 * @license MIT
 */

или:

/**
 * @license
 * Copyright (c) 2015 Example Corporation Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * ...
 */

@version

Опишите номер версии текущего проекта;

/**
   * Эта версия исправляет ... проблемы
 * @version 1.2.3
 */

@since

Опишите, в какой версии была введена функция;

/**
 * Обеспечить ... функцию
 * @since 1.2.1
 */
function newFn() {}

@see

Подобно значениям «см. Также» и «см. Подробно», вы также можете использовать его для навигации в другие места.@link Перейти к определенному сетевому адресу;

/**
 * @see fn2
 */
function fn1() {}
 
/**
 * @see {@link http://example.com|some text}
 */
function fn2() {}

@todo

Опишите, что делать дальше;

/**
   * @todo add ... функция
   * @todo fix ... ошибка
 */
function myFn() {}

@function

против @func, @method То же самое означает описание функции;

/** @function */
var myFn = function() {}

@type

Опишите тип переменной;

/**
   * Переменная типа объекта
 * @type {object}
 */
var val1 = {};
 
/**
   * Переменная символьного или числового типа
 * @type {(string|number)}
 */
var val2;
 
/**
   * Тип - числовой или пустой
 * @type {?number}
 */
var val3;
 
/**
   * Тип числовой или не может быть пустым
 * @type {!number}
 */
var val4;
 
/**
   * Массив экземпляров класса MyClass
 * @type {Array.<MyClass>}
 */
var arr = new MyClass();
 
/**
   * Массив строк
 * @type {string[]}
 */
var arr2 = ['a', 'b', 'c'];
 
/**
   * Объект, содержащий строку и числовой тип
 * @type {object.<string, number>}
 */
var obj1 = {a: 'one', b: 2}
 
/**
   * Укажите конкретные ключи и типы объектов
 * @type {{a: string, b: number}}
 */
var obj2 = {a: 'one', b: 2}
 
/**
   * Укажите конкретные ключи и типы именованных объектов
 * @type {object} obj3
 * @type {string} obj3.a
 * @type {number} obj3.b
 */
var obj3 = {a: 'one', b: 2}

@param

против @arg, @argument То же самое означает описание информации о параметрах функции;

/**
   * За меткой следует тип параметра, затем имя параметра и, наконец, описание параметра.
   * @param {number} a Напишите здесь описание переменной
   * @param {string} b- или добавьте дефис для удобства чтения
   * @param {string} c-Или этот параметр имеет очень длинный, очень длинный
   * Очень длинное, очень длинное, очень длинное, очень длинное, очень длинное описание, которое может занимать несколько строк
 */
function myFn(a, b, c) {}
 
/**
   * Переданный параметр является объектом
   * @param {object} option - параметр объекта, переданный в
   * @param {строка} option.name - свойство имени объекта
   * @param {number} option.age - свойство возраста объекта
 */
function myFn(option) {
    var name = option.name;
    var age = option.age;
}
 
/**
   * Переданный параметр представляет собой массив строк
   * @param {string []} arr - параметр входящего объекта
 */
function myFn(arr) {
    var name = option.name;
    var age = option.age;
}
 
/**
   * Указывает, что параметр необязательный
   * @param {number} a-это обязательный параметр
   * @param {number} [b] - это необязательный параметр.
   * @param {number =} c-другое представление необязательных параметров
 */
function myFn(a, b, c) {}
 
/**
   * Указывает значение по умолчанию необязательного параметра
 * @param {number} a
   * @param {number} [b = 3] - значение по умолчанию 3
 */
function myFn(a, b) {}
 
/**
   * Различные представления типов параметров
   * @param {number} a-type - это число
   * @param {number | string} b-тип - число или строка
   * @param {? number} c-тип - число или null (null)
   * @param {! number} d-тип - это число, а не пусто
   * @param {*} e-Нет ограничений по типу, это может быть любой тип
 */
function myFn(a, b, c, d, e) {}
 
/**
   * Означает функцию с любым количеством параметров
   * Следующая функция возвращает сумму всех входящих параметров
   * @param {... number} num - любое количество параметров, но все они имеют числовой тип
 */
function sum(num) {
    var len = arguments.length;
    var result = 0;
 
    for (let i = 0; i < len; i++) {
        result += arguments[i];
    }
    return result;
}

@typedef

Используется для описания типов пользовательских переменных;

/**
   * Описание нестандартного типа
 * @typedef {(string|number)} myType
 */
 
/**
   * Описание нестандартного типа
   * @type {myType} val - использовать произвольный тип
 */
function myFn(val) {}

@callback

Опишите информацию о параметрах указанной функции как функцию обратного вызова;

/**
   * Это описание функции обратного вызова
 * @callback myCallback
   * @param {string} aa - параметры, принимаемые функцией обратного вызова
   * @param {number} [bb] - еще один необязательный параметр, принимаемый функцией обратного вызова
 */
 
/**
   * Это описание самой функции
 * @param {string} a
   * @param {myCallback} функция обратного вызова-обратного вызова
 */
function myFn(a, callback) {}

@returns

Или напишите @return, Информация, описывающая возвращаемое значение функции;

/**
 * @param {number} a
   * @returns {number} описание возвращаемого значения
 */
function myFn(a) {
    return a + 1;
}
 
/**
 * @param {number} a
   * @returns {(number | string)} Возвращаемое значение может быть числом или символьным типом.
 */
function myFn2(a) {
    if (a > 1) {
        return 1;
    } else {
        return 'no.';
    }
}

@example

Опишите пример использования указанного кода;

/**
   * Добавьте образец кода (формат будет выделен)
 * @param {string} a
 * @param {string} b
 * @returns {string} return a concat b.
 *
 * @example
 * console.log(myFn('hello ', 'world!'));
 * // "hello world!"
 */
function myFn(a, b) {
    return a + b;
}

@class

Опишите class учебный класс;

/**
   * Описание категории
 * @class
 */
class MyClass {}
 
/**
   * Или конструктор
 * @class
 */
function MyClass() {}
var ins = new MyClass();

@namespace

Опишите пространство имен;

/**
   * Укажите объект в пространстве имен
 * @namespace
 */
var MyNamespace = {
    /**
           * Представлен как MyNamespace.fn
     * @returns {*}
     */
    fn: function() {},
    /**
           * Представлен как MyNamespace.a
     * @type {number}
     */
    a: 1
}
 
/**
   * Вручную укажите пространство имен
 * @namespace MyNamespace
 */
/**
   * Функция-член MyNamespace.myFn
 * @function
 * @returns {*}
 * @memberof MyNamespace
 */
function myFn() {}

@member

Описать член текущего класса;

/**
 * @class
 */
function MyClass() {
    /** @member {string} */
    this.name = 'knightyun';
 
    /**
           * Или виртуальный участник
     * @member {number} age
     */
}

@memberof

Опишите класс, к которому принадлежит член;

/**
 * @class
 */
class MyClass {
    /**
     * @constructor
     * @memberof MyClass
     */
    constructor() {}
    /*
     * @param {string} val
     * @returns {*}
     * @memberof MyClass
     */
    myFn(val) {}
}
nodejs/jsdoc.txt · Последние изменения: 2023/01/12 12:18 (внешнее изменение)