===== Стандартизация комментариев 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) {} }