9

在准备部署代码时,我将如何清理node_modules文件夹。

我正在使用node-webkit制作应用程序,并且希望在捆绑应用程序的最终版本时包含尽可能少的文件,因为解压缩过程需要一些时间。

我已经查看npm dedupe并使用它来删除重复文件并仅获取生产文件,npm install --production但是我仍然留下了我不需要的Readme文件和文件。benchmarkstestsbuild

node_modules对于文件夹中的每个模块,我想最终得到的是一个LICENSE文件(如果存在),package.json以及模块运行所需的任何其他内容,但仅此而已。

问题:如何为 SCM 提交自动清理 node_modules 目录在某种程度上朝着相同的方向发展,但它正在谈论提交,所以并不是我真正想要的。

问题:NPM 清洁模块再次与我的路线有些相似,但并不完全如此。

这个答案很有帮助,因为它是dedupe捆绑最终应用程序的更有效版本。

更新
我尝试了从这里链接的自定义模块,但它似乎无法正常工作,即使经过一些摆弄。

说了这么多,我还没有找到正确的答案。


这是我正在寻找的一个例子。

在我的项目中,我目前有两个依赖项:socket.iosocket.io-client.

它们一起构成15 MB ,在110个文件夹中包含550 个文件。

手动清理readme, makefile,VC++构建文件.pdb.obj其他不必要的文件我能够将其缩小到2.74 MB ,在73个文件夹中有265个文件。 这只有两个模块。

我想知道是否有办法自动执行此操作,最好使用npm.

4

6 回答 6

8

此模块尝试智能清理 node_modules 文件夹:

模块清洁

安装:

npm install modclean -g

或者

npm install modclean --save-dev

用法:

modclean

它使用一组默认模式从整个依赖树中的模块中删除不必要的膨胀。

于 2015-12-01T12:10:21.910 回答
3

node_modules为 webkit 应用程序的部署做好清理工作,有点困难,因为node_modules目录中的模块安装有或没有测试文件,其他杂项文件,所以,如果模块的所有者,已经声明了一个.npmignore带有 dir/files 的文件当所有者发布他的模块时testsexamples这些将被排除在打包过程之外,但它会像往常一样存在于存储库(git)中。

排除 npm 包中的测试代码?

以上内容留在模块所有者手中,如果他/她“忘记”制作一个,那么包将包含几乎所有内容。


请注意,由于您不使用developmentsocket.iosocket.io-client它并不意味着您必须使用包,因此npm install socket.io --save-dev简单的npm install socket.io -V将安装生产包,因为它是由其所有者上传的。
一种可能的解决方法是制定一项grunt任务,按照您的意愿清理您的整个设备node_modules

有几条规则是

  • testtests目录或*test*.js文件
  • build目录(不确定它有时可能包含一些必要的二进制文件)
  • history.md

咕噜声


希望我能以某种方式提供帮助,还可以看看Tilemill以及他们如何部署他们的应用程序。

于 2013-12-22T09:29:04.970 回答
3

也许你对这个小find命令感兴趣,我已经随着时间的推移组装了它。请注意,这不是“一刀切”的解决方案!您需要根据您的要求非常仔细地检查它。它适用于 node.js 环境,肯定会破坏浏览器环境。我在 bash 脚本中作为postinstallnpm 中的脚本运行。

不要盲目地复制'N 粘贴。你被警告了!

find node_modules \( \( -name "dist" -or -name "ts" -or -name "logos" -or -name "min" -or -name "test*" -or -name "doc*" -or -name "tst" -or -name "example*" -or -name "build" -or -name "man" -or -name "benchmark*" \) -and -type d \) -or \
   \( \( -iname "readme*" -or -iname "changelog*" -or -iname "notice*" -or -iname "test*.js" -or -iname "*.min.js" \) -and -type f \) -or \
   \( -path "*moment-timezone/data/unpacked*" -and -type d \)

可以肯定的是,我没有添加最后一行| xargs rm -rf。您可以在不删除任何内容的情况下安全地执行上述命令,然后将管道添加到xargswithrm以使其真正发生。

find 命令有什么作用?我将逐个模式地解释它。

  1. \( \( -name "dist" -or -name "ts" -or -name "logos" -or -name "min" -or -name "test*" -or -name "doc*" -or -name "tst" -or -name "example*" -or -name "build" -or -name "man" -or -name "benchmark*" \) -and -type d \)=> 搜索与引号中的文本匹配的目录。是*通配符。

  2. \( \( -iname "readme*" -or -iname "changelog*" -or -iname "notice*" -or -iname "test*.js" -or -iname "*.min.js" \) -and -type f \)=> 在引号中的文本匹配的任何文件夹中搜索文件,无论大小写。特别是这种模式"*.min.js"对某些人来说可能是危险的。

  3. \( -path "*moment-timezone/data/unpacked*" -and -type d \)=> 立即删除解压后的数据。这也节省了大量空间。

随意改进这一点!

于 2016-02-24T16:21:11.517 回答
2

使用 NPM 安装的模块不应包含开发文件(即基准测试、测试等)。如果包含它们,您应该联系模块维护者并要求将它们添加到.npmignore.

注意:在这种情况下,开发文件是指开发实际模块而不是您的应用程序所需的文件。

以前有人建议过,但有一个deploy任务grunt可能是个好主意。只需确保test清理后的应用程序即可。grunt-contrib-clean非常适合清洁。

有关哪些文件/目录不应包含在生产包中的一些想法,请参阅.npmignorefrom 。connect

于 2013-12-22T09:14:18.880 回答
1

我正在研究这个以部署到 AWS 的 elasticbeanstalk。当我运行该eb deploy命令时,它神奇地找到要上传的文件并且没有得到任何bower_componentsor node_modules. 我想知道怎么做。

事实证明,在eb deploy幕后调用git archivegit archive检查您指定的分支并压缩所有文件。

大概您不会将诸如 node_modules 或 bower_components 目录之类的东西提交给 git,因此git archive可能是您问题的解决方案。如果你想避免测试用例和 README 文件之类的东西,你可能仍然需要在 git 中做一些标记。但是你从一个小得多的列表开始,你显然排除了你想要排除的大部分内容。

于 2016-08-12T16:19:47.687 回答
0

我想你正在寻找npm prune

npm 修剪[<name> [<name ...]]

此命令删除“无关”包。如果提供了包名称,则仅删除与提供的名称之一匹配的包。

无关包是未列在父包的依赖项列表中的包。

文档https://docs.npmjs.com/cli/prune

于 2015-08-13T09:55:59.247 回答