Запуск NestJS невероятно медленно развивается - PullRequest
0 голосов
/ 29 января 2019

Мое приложение в среде разработки очень медленно на этапе запуска.Я установил некоторые журналы отладки в разных местах, чтобы посмотреть, что занимает так много времени, и обнаружил, что мой main.ts фактически использует почти 9 минут ? только для того, чтобы импортировать мои app.module!

Источник

import { performance } from 'perf_hooks';
const startTime = performance.now();

import { Log } from 'api/common/util/logger/log';
Log.log.info(`┌────────────────────────────────────────────────────────────┐`);
Log.log.info(`│    Starting: ${new Date().toISOString()}                      │`);
Log.log.info(`└────────────────────────────────────────────────────────────┘`);

// From here -------------------->
import { NestFactory } from '@nestjs/core';
import { ValidationPipe } from '@nestjs/common';
import 'reflect-metadata';
import { existsSync, mkdirSync, writeFile } from 'fs';
import * as express from 'express';
import * as bodyParser from 'body-parser';
import * as helmet from 'helmet';
import * as morgan from 'morgan';
import * as morganBody from 'morgan-body';
// <------ to here, imports fly in as expected.

// Theese take a bit longer, but not enormously
import { Config } from './api/common/config';
import { HttpExceptionFilter } from './api/common/filters/http-exception.filter';
import { LogService } from 'api/common/util/logger/log.service';

// This one takes up the most time on startup (several minutes)
import { AppModule } from './api/app.module';
Log.log.debug(` * imports done in ${(performance.now() - startTime).toFixed(3)}ms`);
Log.log.debug(` * Memory: ${readMem()}`);

function readMem() {
  const mem = process.memoryUsage();
  const convert = { Kb: n => (n / 1024), Mb: n => convert.Kb(n) / 1024 };
  const toHuman = (n, t) => `${convert[t](n).toFixed(2)}${t}`;
  return `Used ${toHuman(mem.heapUsed, 'Mb')} of ${toHuman(mem.heapTotal, 'Mb')} - RSS: ${toHuman(mem.rss, 'Mb')}`;
}

Выход

Запуск производства:

$ node dist/main.js
info: ┌──────────────────────────────────────────────────────────────────────────┐
info: │    Starting: 2019-01-29T13:06:13.751Z                                    │
info: │      Memory: Used 6.54Mb of 11.70Mb - RSS: 25.33Mb                       │
info: │     Runtime: js                                                          │
info: └──────────────────────────────────────────────────────────────────────────┘
debug:  * imports done in 6862.350ms
debug:  * Memory: Used 87.99Mb of 113.76Mb - RSS: 133.58Mb
info: Nest application successfully started
info: ┌──────────────────────────────────────────────────────────────────────────┐
info: │             Memory: Used 93.71Mb of 122.52Mb - RSS: 144.20Mb             │
info: │             Launch: 2019-01-29T13:06:25.377Z                             │
info: │      Time to start: 11991.049ms                                          │
info: │     Bootstrap time: 5124.189ms                                           │
info: └──────────────────────────────────────────────────────────────────────────┘

Запуск разработки:

$ ts-node -r tsconfig-paths/register src/main.ts
info: ┌──────────────────────────────────────────────────────────────────────────┐
info: │    Starting: 2019-01-29T13:08:06.914Z                                    │
info: │      Memory: Used 157.76Mb of 193.62Mb - RSS: 209.77Mb                   │
info: │     Runtime: ts                                                          │
info: └──────────────────────────────────────────────────────────────────────────┘
debug:  * imports done in 471159.063ms
debug:  * Memory: Used 297.45Mb of 385.35Mb - RSS: 408.90Mb
info: Nest application successfully started
info: ┌──────────────────────────────────────────────────────────────────────────┐
info: │             Memory: Used 216.64Mb of 383.35Mb - RSS: 409.11Mb            │
info: │             Launch: 2019-01-29T13:16:05.521Z                             │
info: │      Time to start: 483228.325ms                                         │
info: │     Bootstrap time: 12042.239ms                                          │
info: └──────────────────────────────────────────────────────────────────────────┘

Да, я запускаю это, используя ts-node, но именно это NestJS рекомендует для разработки и отладки.

Вопрос

Как я могу оптимизировать запуск так,что каждое незначительное изменение в бэкэнде здесь не требует 10-минутного промедления?У меня достаточно проблем с концентрацией, как это, это не помогает.

У меня слишком много модулей?Поможет ли мне это объединить?У меня есть около 15 моделей сущностей БД, каждая из которых включена в свой собственный модуль на основе graphql для удобства чтения, но многие из них имеют циклические зависимости, разрешенные путем внедрения forwardRef() в импорт моего модуля.Возможно, это проблема?

Я стараюсь включать как можно меньше сторонних библиотек, чтобы избежать адских узловых модулей.То, что я импортирую в свои модули, это либо мой собственный код, либо материал фреймворка NestJS.Конечно, я не знаю, сколько загруженных неявных зависимостей, но может ли количество библиотек, которые я перетаскиваю со мной, повлиять на производительность запуска?И если да, то как я могу отслеживать, что попадает в стек и сколько памяти / процессора потребляет каждый скрипт при оценке?И могу ли я как-то предварительно скомпилировать это для увеличения запуска?

У меня нет этой проблемы при запуске как скомпилированного javascript в рабочей среде.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Один из вариантов - использовать tsc-watch вместо ts-node и nodemon.Вы можете настроить команду запуска в своем запуске: dev следующим образом:

{
  //this is assuming you're building to the dist folder
  ...
  "start:dev": "tsc-watch --onSuccess \"node dist/main.js\" --onFailure \"echo 
  There was a problem with the build!\" -p tscfonig.json" 
  ...
}

По своему опыту я столкнулся с слишком большим количеством проблем с ts-node и регистрацией маршрутов, плюс время загрузки убивало меня.С tsc-watch я получаю свежую сборку проекта, перестраивая только те файлы, которые были изменены.Таким образом, вы также проверяете, что tsc работает во время разработки.


Я также использую команду tsconfig-bootstrap, чтобы импортировать мои собственные маршруты (определенные в моем tsconfig) и добавить их в мою команду запуска.с node -r path/to/my/script.js dist/main.js.

Надеюсь, это вам немного поможет!

0 голосов
/ 19 марта 2019

Попробуйте установить env TS_NODE_TRANSPILE_ONLY=true.

например, TS_NODE_TRANSPILE_ONLY=true ts-node -r tsconfig-paths/register src/main.ts

документы: https://github.com/TypeStrong/ts-node#cli-and-programmatic-options

Это ускорит запуск моего приложения

...