使用ncc将NestJS应用程序的构建大小减少300MB的故事


由于尝试使Docker映像大小尽可能小时的反复试验,我能够使用ncc减小映像大小,因此备忘

<表格>

使用ncc之前

使用ncc之后

结果


<身体>

599MB

245MB

减少354MB!


Image from Gyazo

建立程序

ncc支持TypeScript。但是,由于无法指定tsconfig.json,因此如果具有多个配置文件(例如tsconfig.app.json),则无法很好地使用它。

然后执行以下步骤。

示例:构建一个名为api 的应用
1.使用nest-cli在Webpack模式下构建:nest build api --webpack
2.使用ncc ncc build dist/api.js -m -o dist/api

进一步构建1的工件

将输出该应用程序所需的所有文件。您要做的就是将它包含在Docker映像中。

Image from Gyazo

ncc太神奇了。您可以建立更多的webpack专家。

这消除了对node_modules的需要,现在仅在Docker映像中仅包含最少的文件。
(当然,node_modules与npm ci --production一起安装)
Image from Gyazo

...尝试要求使用" @ nestjs /微服务",但假设为external.

,则无法解决

(↑我忘记了确切的错误文本,并且没有记录下来,所以我在模糊上半部分...)

当我运行使用

ncc构建的文件时,出现错误,提示无法成功解析@nestjs/microservices的导入。单击此处以获取相关问题:https://github.com/zeit/ncc/issues/463

在我的情况下,@ nestjs / microservices不在主要使用,并且@nestjs/terminus似乎正在动态加载。进行健康检查需要终点,但是它变得不那么重要了,因为不久前我们转移到了无服务器。所以我删除了@nestjs/terminus本身。

ncc工件包括typescript

在某些情况下,typescript可能会全部包含在内。 47.8MB,异常庞大。显然,删除typescript文件夹本身不会引起任何问题。
Image from Gyazo

恩,它减少了300MB吗?这样行吗?忧虑

Image from Gyazo

当我第一次看到↑的结果时,我很着急。它只是真的进行了优化...?一些重要文件没有消失..?
我使用此ncc进行了e2e测试,但是由于测试通过正确,所以没有问题(很高兴我编写了该测试)

另外,某些软件包可能引用该库的旧版本。我检查了一下是否包含具有不同版本的相同软件包,但似乎包含了它(包含4个uuid软件包...)。

此外,如果使用pkg将其制成单个文件,则将是完美的...!?

高山pkg组合无效。我在静态链接周围收到错误消息。
https://github.com/zeit/pkg-fetch/pull/72
首先,pkg是写在自述文件中的,它不用于无服务器使用,因此我放弃了使用它。
https://github.com/zeit/pkg/blob/master/README.md