073 Eslint и prettier
Установим prettier и eslint вместе с плагинами, парсерами и конфигами
npm i -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin prettier eslint-config-prettier eslint-plugin-prettier typescript- одиночные кавычки
- висячая
, - использование табов
;в конце- пробелы между фигурными скобочками
- максимальная длина
- конечная строка: автоматически
.prettierrc
{
"singleQuote": true,
"trailingComma": "all",
"useTabs": true,
"semi": true,
"bracketSpacing": true,
"printWidth": 100,
"endOfLine": "auto"
}no-unused-vars- не используемые переменные (включая функции и объекты) - отключено у насexplicit-function-return-type- нужно явно указывать, что возвращает функцияno-explicit-any- запрещает использоватьany- убираем эту настройку
.eslintrc
{
"root": true,
"parser": "@typescript-eslint/parser",
"plugins": [
"@typescript-eslint"
],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
"plugin:prettier/recommended"
],
"rules": {
"@typescript-eslint/ban-types": "off",
"@typescript-eslint/no-unused-vars": [
"off"
],
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/explicit-function-return-type": [
"warn"
],
"prettier/prettier": [
"error",
{
"singleQuote": true,
"useTabs": true,
"semi": true,
"trailingComma": "all",
"bracketSpacing": true,
"printWidth": 100,
"endOfLine": "auto"
}
]
}
}Если мы будем работать в VSCode, то нужно будет сохранить эти настройки. Тут мы устанавливаем в качестве форматтиера eslint и форматирование будет происходить при сохранении
.vscode > settings.json
{
"[typescript]": {
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}
}Далее нам нужно добавить эти два скрипта линтера, чтобы он форматировал все файлы в проекте
"scripts": {
"lint": "eslint ./src/**",
"lint:fix": "eslint ./src/** --fix"
},Далее нам нужно будет протипизировать возвраты функции
export interface IBootstrapReturn {
app: App;
appContainer: Container;
}
function bootstrap(): IBootstrapReturn {
const appContainer = new Container();
appContainer.load(appBindings);
const app = appContainer.get<App>(TYPES.Application);
app.init();
return { appContainer, app };
}Так же нужно будет проставить все невозвратные функции void
useRoutes(): void {
this.app.use('/users', this.userController.router);
}Тут уже, так как функция асинхронная async, то она возвращает Promise<void>
public async init(): Promise<void> {
this.useRoutes();
this.useExeptionFilters();
this.server = this.app.listen(this.port);
this.logger.log(`Сервер запущен на http://localhost:${this.port}`);
}074 Подключение nodemon
ts-node - это плагин, который позволяет запускать приложения непосредственно на TS (компиляция происходит уже под капотом)
nodemon - это плагин, который будет перезагружать node-приложение после каждого сохранения изменений (работает почти как webpack, но на стороне сайта)
npm i -D nodemon ts-nodewatch- это та папка, за которой будет следить мониторext- это расширения, за изменениями которых будет следить плагинignore- указывает на то, что нужно игнорировать при перезапускеexec- путь до нашего основного файла приложения (а именно для его запуска)
nodemon.json
{
"watch": [
"src"
],
"ext": "ts,json",
"ignore": [
"src/**/*.spec.ts"
],
"exec": "ts-node ./src/main.ts"
}Так же данная строка в скриптах будет запускать сам монитор нод-приложения:
package.json
"scripts": {
"dev": "nodemon"
},И теперь при каждом изменении одного из файлов проекта будет перезагружаться наш сервер

075 Отладка
Первым делом, чтобы нормально отлаживать приложение, нужно в конфиге ТСа добавить компиляцию карт, чтобы отладчик понимал, к какой части приложения он сейчас обращается
tsconfig.json
{
"sourceMap": true,
}Далее, если мы работаем в VSCode, то нужно указать данные настройки для отладчика
.vscode > launch.json
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "nodemon",
"runtimeExecutable": "${workspaceFolder}/node_modules/nodemon/bin/nodemon.js",
"restart": true,
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}Во вкладке отладки после настроек должен находиться наш nodemon

Далее нам нужно поставить точку останова в нужное место приложения и запустить приложение через команду npm run dev. После этих приготовлений, мы наконец-то сможем отправить запрос на сервер, что и триггернёт дебаггер на работу

076 Анализ памяти
-e- экстеншены, которые мы хотим запускать--exec- наш файл запуска--inspect- подключает наш отладчик к определённому хосту-r- подключает дополнительный обработчик
package.json
"scripts": {
"dev:inspect": "nodemon -e ts,json --exec node --inspect=localhost:9222 -r ts-node/register src/main.ts"
},Далее переходим в хроме по ссылке в about:inspect и там настраиваем наше подключение

Дальше мы можем перейти во вкладку Memory, где мы можем посмотреть, сколько памяти съедает наше приложение и сделать снэпшот того, какие компоненты и сколько съедают

В самом снэпшоте можно просмотреть дерево компонентов и сколько они в отдельности съедают памяти

Далее у нас идёт профилировщик. В нём мы конкретно можем посмотреть, что происходит во время запросов на сервер. Сначала нужно запустить профилировщик, затем отправить запросы на сервер и уже потом остановить профилировщик, чтобы просмотреть подробно, какие данные и в каком промежутке отправлялись

Тут мы можем увидеть flame graph с блоками выполняемых задач. Чем длиннее будет блок, тем больше времени тратится на его выполнение. Длинные блоки стоит оптимизировать .

077 Мониторинг производительности
Далее идёт удобный инструмент, который позволит нам мониторить наше приложение, его потребляемые ресурсы и производительность

Первым делом нужно установить саму клинику. Так же в пару с ней модуль имитации нагрузки на систему.
npm install -g clinic autocannonclinic- вызываем пакетdoctor- определяем какой именно инструмент будем использовать--on-port- определяем настройкиautocannon- через модуль нагрузки-m- метод запросаPOST- отправка сообщения на серверlocalhost...- куда будем стучаться- Дальше нужно вызвать нодовскую команду, которая запустит конечное приложение
clinic doctor --on-port 'autocannon -m POST localhost:8000/users/register' -- node dist/main.jsПосле запуска инструмента сформируется папка .clinic с отчётом о производительности системы. Конкретно тут показан хороший график.

Далее немного нагрузим систему тяжёлым запросом, который будет сохранять в массив прочтённый файл видео
const data = [];
register(req: Request, res: Response, next: NextFunction): void {
data.push(readFileSync('../../1.mp4'));
this.ok(res, 'register');
}И попробуем выполнить запрос. Тут мы уже получили плохой график, который явно указывает на огромный рост длительности выполнения ивент лупа.
