===== Стандартизация комментариев JavaScript (JSDoc) =====
===== Предисловие =====
Как говорится, нет правила без правил; хотя код набирается и передается компилятору для интерпретации и выполнения, до тех пор, пока нет грамматических ошибок и ошибок форматирования, независимо от того, насколько античеловечен набор, нет проблем, но код - это еще одно широкое применение, помимо выполнения Просто прочтите его, просмотрите свой прошлый код, разберитесь в исходном коде других людей и т. Д., Так что существует стилизация кода, которая может улучшить внешний вид, но при этом его легко читать.
Конечно, помимо самого кода, дополнительное чтение может быть связано с комментариями к коду. Сами комментарии не будут компилироваться и выполняться компилятором, и их роль заключается в том, чтобы оставить некоторую информацию, чтобы облегчить лучшее понимание самого кода; поэтому прокомментированные Стандартизация - это тоже вопрос, над которым стоит подумать; и следующий вопрос будет представлен**JSDoc** Это такой инструмент;
===== JSDoc =====
Согласно его официальному сайту ([[https://jsdoc.app/index.html|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'' Связанные веб-страницы в каталоге будут отображать контент, подобный следующим страницам;
Домашняя страница:
{{:nodejs:7a790d6680b04ece105b4d5c9c17efb5.png|}}
Укажите страницу функции:
{{:nodejs:17f2a89fe89a9f5ff6fcb0c5a4d43b88.png|}}
\\ Шаблон стиля веб-страницы также можно заменить, просто измените его в соответствии с параметрами командной строки, я не буду рассматривать его здесь, давайте узнаем о формате его комментариев;
==== Формат комментария ====
Пожалуйста, обратитесь к официальному веб-сайту для полного ознакомления с форматом ([[https://jsdoc.app/index.html|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
*/
=== @copyright ===
Опишите информацию об авторских правах текущего файла
/**
* @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.}
*/
var arr = new MyClass();
/**
* Массив строк
* @type {string[]}
*/
var arr2 = ['a', 'b', 'c'];
/**
* Объект, содержащий строку и числовой тип
* @type {object.}
*/
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) {}
}