web-dev-qa-db-fra.com

Nestjs startup incroyablement lent dans le développement

Mon application en Environnement Dev est gonflée lentement dans sa phase de démarrage. J'ai défini une journalisation de débogage sur divers endroits pour voir ce qui prend tellement de temps et constaté que mon main.ts Utilise réellement presque 9 minutes ???? Juste pour obtenir mon app.module importé!

source

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')}`;
}

sortie

Démarrage de la production:

$ 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: └──────────────────────────────────────────────────────────────────────────┘

Démarrage de développement:

$ 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: └──────────────────────────────────────────────────────────────────────────┘

Oui, je commence cela en utilisant ts-node, Mais c'est ce que Nestjs recommande le développement et le débogage.

Question

Comment puis-je optimiser le démarrage afin que chaque changement mineur dans le backend ici ne nécessite pas de procrastination de 10 minutes? J'ai assez de problèmes avec la concentration tel qu'il est, cela n'aide pas.

Est-ce que j'ai trop de modules? Cela aidera-t-il si je combine certains? J'ai environ 15 modèles d'entités DB incluses chacun dans son propre module basé sur GraphQL pour la lisibilité, mais beaucoup d'entre eux ont des dépendances circulaires résolues par forwardRef() injection dans mes importations de mon module. Est-ce peut-être un problème?

J'essaie d'inclure comme peu de bibliothèques tierces que possible pour éviter que Node_Modules Hell. Ce que j'importe dans mes modules est soit mon propre code de code de Nestjs. Bien sûr, je ne sais pas combien de dépendances implicites sont chargées, mais la quantité de bibliothèques que je traîne avec moi a une incidence sur les performances de démarrage? Et si oui, comment puis-je surveiller ce qui peut surveiller la pile et la quantité de mémoire/CPU chaque script consomme lors de l'évaluation? Et puis-je en quelque sorte précompiler une partie de cela pour augmenter le démarrage?

Je n'ai pas ce problème lorsque vous courez comme compilé JavaScript dans la production.

10
Øystein Amundsen

Une solution logique et quelque chose qui fonctionne la résolution du problème consiste à décompresser les modules que vous n'utilisez pas actuellement à partir de Module d'applications.


@Module({
 imports: [
   TypeOrmModule.forRoot(defaultOptions),
   // Commented for faster reloads 
   // NotUsingModule1
   // NotUsingModule2
   UsingModule1
 ],
 controllers: [AppController],
 providers: [AppService],
})
export class AppModule { }

En cas de travail avec RDBMS, assurez-vous que la consignation de la connexion non définie Vrai et DropSchema n'est pas non plus définie.

  • Dans certains cas, vous risquez de faire face à un problème avec des entités qui ne forment pas de relations correctement à DropSchema true, il effacera toutes les entités de la base de données. Ne faites pas cela en production. TU ÉTAIS PRÉVENU
export const defaultOptions = {
    type: "postgres",
    port: 5432,
    username: "postgres",
    password: "postgres",
    database: "awesome db",
    synchronize: true,
    // logging: true,
    // dropSchema: true,
    entities: ['dist/**/*.entity.js'],
0
Chetan Jain