開発環境のアプリケーションは起動フェーズで非常に遅いです。何がそんなに時間を浪費しているのかを調べるために、さまざまな場所でデバッグログを設定しましたが、実際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 分間の遅延を必要としないように、起動を最適化するにはどうすればよいでしょうか。集中力の問題はすでに十分にあるので、これでは役に立ちません。
モジュールが多すぎますか? いくつか組み合わせると役立ちますか? 読みやすくするために、それぞれ独自の graphql ベースのモジュールに含まれている DB エンティティ モデルが約 15 個ありますが、その多くはforwardRef()
モジュール インポートの挿入によって解決される循環依存関係を持っています。これはおそらく問題でしょうか?
node_modules 地獄を回避するために、サードパーティのライブラリをできるだけ少なくするようにしています。モジュールにインポートするのは、自分のコードか NestJS フレームワークのものです。もちろん、暗黙の依存関係がどれだけロードされるかはわかりませんが、私がドラッグしているライブラリの量が起動パフォーマンスに影響を与える可能性がありますか? もしそうなら、スタックに何が入るか、評価時に各スクリプトがどれだけのメモリ/CPU を消費するかをどのように監視できますか? また、これらの一部を何らかの方法でプリコンパイルして起動時間を短縮できますか?
本番環境でコンパイルされた JavaScript として実行すると、この問題は発生しません。
ベストアンサー1
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
アプリの起動が速くなります