Skip to main content

关于 Midway 启动慢的问题

Midway 在本地开发时会使用 ts-node 实时扫描并 require 模块,如果 ts 文件太多(比如 200+)个,启动时可能会导致比较慢,在 Windows 下非 SSD 硬盘的情况下特别明显,导致 ts-node 的类型检查的 Server 频繁 fullGC,每个文件加载可能会达到 1-2s。

一般 Mac 都是 SSD,所以基本没有问题,而 Windows 会有出现,构建后执行无此问题。

如下图所示。

如何判断#

1、先清理下 ts-node 缓存。

在临时目录中有一个 ts-node-*  的目录,删除即可(不知道临时目录的可以在命令行执行 require('os').tmpdir()  输出查看)。

删了下面类似的这个目录。

2、用 ts-node 启动 Midway

执行下面的启动命令。

// midway v1cross-env DEBUG=midway* NODE_ENV=local midway-bin dev --ts
// midway v2cross-env NODE_DEBUG=midway* NODE_ENV=local midway-bin dev --ts

会出现每个文件的 require 时长,如果时间比较久一般就是了。

解决问题#

由于 TS_NODE_TYPE_CHECK  内部会启动一个 Server,在文件特别的多的情况下,每次 require 都会做类型检查,如果造成严重启动影响,建议关闭。代价是启动运行时不会做类型校验,由于一般在编辑器里已经有提示,运行时不再做检查也可以。

在执行命令前增加下面两个环境变量。

TS_NODE_TYPE_CHECK=false TS_NODE_TRANSPILE_ONLY=true

比如:

cross-env TS_NODE_TYPE_CHECK=false TS_NODE_TRANSPILE_ONLY=true NODE_DEBUG=midway* NODE_ENV=local midway-bin dev --ts

下面是使用相同的项目的对比效果。

第一次执行(无缓存)第二次执行(有缓存)
不加优化参数约 258s约 5.6s
加优化参数约 15s约 4.7s

其他#

如果任有问题,请提交你的仓库 + node_modules 给我们。