繁体   English   中英

Heroku Slug 尺寸太大 - nodejs

[英]Heroku Slug Size too large - nodejs

这是我的第一个 heroku 应用程序...我看到我的 heroku slug 大小是 296MB...接近 300MB 的快速启动时间令人不安。

这是一个安装了 ejs、path 和 express 的 puppeteer 应用程序。 我有一堆 static 文件,但它们似乎没有占用大部分空间..

我真的很感激这方面的帮助!

公共文件夹中的静态文件

编辑:我的 package.json 现在看起来像这样(看不出我如何真正削减我的 node_modules - 事实上,我想在进一步开发我的应用程序时添加更多依赖项):

    "scripts": {
    "start": "node server.js",
    "heroku-postbuild": "curl -sf https://gobinaries.com/tj/node-prune | PREFIX=. sh&&./node-prune"
  },
  "dependencies": {
    "ejs": "^3.1.5",
    "express": "^4.17.1",
    "path": "^0.12.7",
    "puppeteer": "^5.3.1"
  }

在评论中的所有讨论之后,我意识到一件事:您不能在 Heroku dynos 中删除文件夹! 而且您可能无论如何都不想...这些文件夹看起来很重要(请记住:Heroku dynos 通常是迷你 linux 操作系统,因此.apt文件夹可能包含其中一些迷你 linux 操作系统文件)。 当然,那些.apt.heroku文件夹可能不会增加您的 slug 大小。 对不起,那次大雁追逐。

所以? 让我们减少真正重要的东西的大小。

第一:减少你的node_modules大小。

由于您的node_modules文件夹是您可以控制的最大文件夹,让我们从那里开始。 我们将关注这篇文章。 我将修改一些指令,以便它们与 Heroku 一起使用。

  1. 减少依赖项的数量:这听起来很简单,但它有很大帮助。 想想你安装的包。 你真的需要它们吗? 如果你这样做了,是否有一个更轻量级的包可以替代? 例子:

很多时候我看到人们安装 Jest 只是为了简单的单元测试(大约 460 多个依赖项,+/-60MB),而当有更小的库可以做完全相同的事情时(Mocha – 115 个依赖项,12MB)。 2.删除不必要的文件:除了安装包时通常安装的文件( .js文件等),还有很多......包括不需要的垃圾( README s、 CHANGELOG s、源文件......)。 因为您无法手动删除这些文件(以及谁想要删除),所以您需要使用自动化工具和Heroku 构建脚本 这是一个示例(将其放入package.json时删除注释)。

"scripts": {
  // Other scripts...
  // The following script dowloads node-prune (https://github.com/tj/node-prune)
  // in the current build directory and runs it.
  // The following script is run AFTER Heroku installs dependencies, but BEFORE
  // Heroku caches them.
  // EDIT: You have to do `./node-prune` instead of `node-prune`.
  "heroku-postbuild": "curl -sf https://gobinaries.com/tj/node-prune | PREFIX=. sh&&./node-prune"
}

安恩...

这就是你所能做的。 那篇文章中提到的其他步骤对 Heroku 没有帮助。 正如您已经提到的,您的静态文件并没有真正占用太多空间——它实际上只是node_modules 我想不出任何其他方法来减少您的 slug 大小(除非您想将静态文件移动到外部存储设施并执行一些模糊的获取和缓存操作以将它们提供给客户端......)。

注意:我还没有尝试过这些步骤中的任何一个。 这些理论上应该有效,但我不确定它们是否有效。

由于 Puppeteer 占用了如此多的 Heroku slug 大小,因此几乎没有回旋余地。 目前,坚持使用 Node 12 和 Puppeteer 2.0.0 将确保您可以设法将 Heroku slug 大小保持在 300M 以下。

在 package.json 中使用这些:

"dependencies": {
    "puppeteer": "2.0.0"
}

"engines": {
    "node": "12.x"
}

如果你升级 node 或 puppeteer 的版本号,即使你的其他依赖很少,你的 slug 大小也会超​​过 300M。

我使用 Puppeteer 2.0.0 的另一个原因是我需要使用 waitForFileChooser() 函数将媒体文件上传到某些网站。 但是 waitForFileChooser() 在 Puppeteer 2.1.1 中被破坏了。 而且它在 5.5.0 中仍然被破坏。

另外,我认为 Node 12 和 Puppeteer 实际上非常稳定。 所以我可以接受一点版本延迟,以帮助 Heroku 管理其出色的免费服务的成本。

我想加入这个讨论,因为我遇到了同样的问题,并且因为 500MB 的限制而无法让它工作而感到非常沮丧。 我尝试了各种方法来减少它,但我发现即使我将它减小到 500MB 以下,性能也会大大降低。 所以我决定做的是为 Puppeteer 提供一个单独的专用服务器,并从我的代码库中完全删除 Puppeteer 部分,这将我的 slug 大小减少了 200+MB。 看一看: https://github.com/davidjuhyung/puppeteer-api

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM