为生产减少 node_modules 的大小

Posted

技术标签:

【中文标题】为生产减少 node_modules 的大小【英文标题】:reduce size of node_modules for production 【发布时间】:2017-10-07 21:00:12 【问题描述】:

我创建了 node_modules 用于在 ngrok 的帮助下从本地主机上传插件到在线站点,并在 CommandPrompt 中使用 npm install。但创建的 node_modules 文件夹大小为 78mb。在这种情况下,我必须通过删除不需要的文件夹来减小大小,所以我上网并得到了两个建议,因为减小大小可能很有效,它们是:使用 --production mode 和另一个正在使用 shrinkwrap

作为第一步,我使用了此处指定的命令 npm install --productionnpm install --only=production:How do you prevent install of "devDependencies" NPM modules for Node.js (package.json)?,但我没有查看文件夹大小的任何变化。

然后参考了如何使用shrinkwrap来减小本网站给出的尺寸并尝试了:https://docs.npmjs.com/cli/shrinkwrap,但没有成功。

另外我在这里提到:https://www.npmjs.com/package/modclean,使用命令 modclean -n default:safe 我减少了 10-11mb。

但是,我仍然在 node_modules 中有大量不需要的文件夹。我在 package.json 中指定了几个需要的依赖项,如下所示,

"dependencies": 
    "atlassian-connect-express": "2.0.0",
    "body-parser": "^1.14.2",
    "compression": "^1.6.0",
    "cookie-parser": "^1.4.0",
    "errorhandler": "^1.4.2",
    "express": "^4.13.3",
    "express-hbs": "*",
    "jugglingdb-sqlite3": "0.0.5",
    "morgan": "^1.6.1",
    "static-expiry": ">=0.0.5"

我在 package.json 中给出的依赖项很少,但我看到在 node_modules 中创建了大量的文件夹。 node_modules如何减小大小,有没有其他的处理?

【问题讨论】:

请注意,运行npm install --production 不会从node_modules 中删除您的devDependancies;您需要先删除 node_modules 才能看到大小减小。 【参考方案1】:

从 NPM v3 开始,您的应用程序中的所有依赖项都尽可能保留在您的 node_modules 的顶层 - 这使 NPM 更容易删除重复项,并防止一些讨厌的“路径太长” Windows 上的错误。

要意识到的重要一点是,当我说“您的应用程序中的所有依赖项”时,我不仅仅指您的 package.json 中的那些依赖项 - 所有 那些 包都将具有它们自己的依赖关系(并且它们的依赖关系可能具有它们自己的依赖关系,等等)。这就是为什么node_modules 里面总是有这么多文件夹的原因。

作为示例 - express 有 28 个依赖项,因此如果这是您安装的唯一内容,那么您的 node_modules 中至少有 29 个文件夹 - 并且不考虑子依赖项。

所以,回答您的问题 - 除了您指定的内容之外,您不能使您的 node_modules 更小,因为您正在使用所有这些文件夹!只是并不总是以最直接的方式。

【讨论】:

我不明白的是,为什么即使使用 --production 标志,NPM 也会在 node_modules 中包含非缩小的 javascript 文件?不应该有办法只提供缩小的包裹吗? @nocarrier:--production 所做的只是排除开发依赖项,仅此而已。 NPM 并没有真正为你做出任何关于缩小的决定——如果包作者以这种方式发布它,你只能从 NPM 获得缩小的代码。如果您想知道为什么不这样做,您必须询问 NPM 开发人员,因为我不是通灵者:p

以上是关于为生产减少 node_modules 的大小的主要内容,如果未能解决你的问题,请参考以下文章

在生产数据库中减少列大小并修剪数据,处理同一列上的约束/依赖关系

使用 INSTALL_MOD_STRIP 在 modules_install 的时候 strip 驱动, 减少磁盘占用

node_modules/ng2-bs3-modal/components/modal-header.d.ts.ModalHeaderComponent.html(3,107) 中的错误:属性“mod

关于VUE的安装和一些简单属性

用于生产的 Preact 和 Webpack

如何使用捆绑包中的 node_modules 依赖项正确构建用于生产的 NestJS 应用程序?