我在开发环境中的应用程序在启动阶段非常慢,我在不同的地方设置了一些调试日志,看看是什么占用了这么多时间,发现我的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个DB实体模型,每个模型都包含在自己的基于graphql的模块中,以便于阅读,但是其中许多模型都有循环依赖关系,通过在模块导入中注入forwardRef()
来解决。这可能是个问题吗?
我尽量少包含第三方库,以避免node_modules的麻烦。我在模块中导入的不是我自己的代码就是NestJS框架的东西。当然,我不知道加载了多少隐式依赖项,但是我拖动的库的数量会影响启动性能吗?如果会的话,我如何监视栈上的内容以及每个脚本在计算时消耗多少内存/cpu?2我是否可以预编译其中的一些来提高启动速度?
我在生产中运行编译后的javascript时没有这个问题。
8条答案
按热度按时间ghhkc1vu1#
尝试设置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
它加快了我的应用程序启动速度
wljmcqd82#
一种选择是使用tsc-watch代替ts-node和nodemon。您可以在start:dev中设置start命令,如下所示:
根据我的经验,我在
ts-node
和注册路由时遇到了太多的问题,加上加载时间,让我快死了。使用tsc-watch
,我得到了一个新的项目版本,只重建了被修改的文件。这样你也可以在开发时测试tsc
是否工作。我还使用tsconfig-bootstrap命令导入我的自定义路由(在我的tsconfig中定义),并使用
node -r path/to/my/script.js dist/main.js
将其添加到我的start命令中。希望这对你有一点帮助!
piah890a3#
如果有人遇到这个问题,我们有一个Nest API,有40个模块,节点v12的启动时间是2-3分钟,而节点v14+的启动时间是5-10秒。对于本地开发,我建议使用NVM,并尝试使用更高版本的节点(如果包兼容ofc)。
uqxowvwt4#
我在升级到nest@8.0.0并开始使用node v16后遇到了这个问题。在我降级nodejs版本后,这个问题就消失了。
编辑:问题与
pg
模块有关,它一直在无声下降,更新到pg@latest
后,NestJs正常启动。a14dhokn5#
一个合乎逻辑的解决方案和解决这个问题的方法是取消注解当前不使用的模块。
此外,在使用RDBMS的情况下,请确保logging in未设置为true,dropSchema也未设置为true。
oxiaedzo6#
只是为了防止其他人可能有同样的原因,我的问题是由于导入grpc客户端,两者都不够具体,哪些proto(s)包括,也在太多不同的地方。
我们的protos结构非常大,所以grpc加载器加载非常慢,这导致nest需要几分钟才能启动。
因此,请确保您只使用配置的protoPath中直接需要的服务,我认为includeDirs选项并不重要,所以只使用protoPath即可。
6xfqseft7#
附言:在大多数情况下,远程连接会影响您的服务器,使其变慢
mwg9r5ms8#
安装最新版本的
@nestjs/cli
,包括全局安装和本地安装:替换/确保您在package.json中定义了以下脚本
确保在x1c 0d1x上有vs代码自动附加
运行