Node.js项目依赖关系的过度recursion

因此,经过漫长的一天工作之后,我坐下来看到系统托盘中的Windows SkyDrive警报:

Files can't be uploaded because the path of this file or folder is too long. Move the item to a different location or shorten its name. C:\Users\Matthew\SkyDrive\Documents\Projects\Programming\angular-app\server\node_modules\grunt-contrib-nodeunit\node_modules\nodeunit\node_modules\tap\node_modules\runforcover\node_modules\bunker\node_modules\burrito\node_modules\traverse\example\stringify.js 

…有一段时间,我嘲笑这种技术限制。

但是,我想知道:Node项目中的目录recursion是否真的有必要? 看起来超出"angular-app\server\node_modules"的path只是整个项目的依赖关系,可能会更好地expression为:

 C:\Users\Matthew\SkyDrive\Documents\Projects\Programming\angular-app\server\node_modules\grunt-contrib-nodeunit\ C:\Users\Matthew\SkyDrive\Documents\Projects\Programming\angular-app\server\node_modules\nodeunit\ C:\Users\Matthew\SkyDrive\Documents\Projects\Programming\angular-app\server\node_modules\tap\ C:\Users\Matthew\SkyDrive\Documents\Projects\Programming\angular-app\server\node_modules\runforcover\ C:\Users\Matthew\SkyDrive\Documents\Projects\Programming\angular-app\server\node_modules\bunker\ C:\Users\Matthew\SkyDrive\Documents\Projects\Programming\angular-app\server\node_modules\burrito\ C:\Users\Matthew\SkyDrive\Documents\Projects\Programming\angular-app\server\node_modules\traverse\ 

我之前并没有真正考虑过这个问题,因为与许多平台相比,Node的包pipe理似乎很神奇。

我会想象一些大规模的Node.js项目甚至包含许多重复的模块(具有相同或相似的版本),这些模块可以合并为较less的数量。 有人可能会认为:

  • 由于重复的依赖关系,存储和传输的数据量增加,增加了开发软件的成本。

  • 较浅的目录结构(特别是在这种情况下)通常更易于浏览和理解。

  • 过长的path名称可能会在某些计算环境中导致问题。

我所build议的(如果这样的事情不存在)是一个Node模块,它:

  • recursion扫描Node项目,收集嵌套的node_modules文件夹的列表,以及相对于项目的根目录埋藏的深度。

  • 将每个嵌套的node_modules文件夹的内容移动到主node_modules文件夹中,编辑每个.js文件的require()调用,以便不引用任何引用。

  • 处理重复依赖项的多个版本

如果没有别的,它会做一个有趣的实验。 你们有什么感想? 我可能遇到什么潜在的问题?

看看

 npm dedupe 

设置你的权利。

API Doc 这里

请参阅fenestrate , npm-flatten , flatten-packages , npm dedupe和多阶段安装 。

从这个StackOverflow问题引用Sam Mikes:

npm默认会在安装时添加重复数据删除。 这比Node的模块系统改变显着更可行,但它仍然不是微不足道的,并且涉及到一些根深蒂固的模式的重做。

这是(最后)目前在npm的工作,去名称multi-stage-install ,并针对npm@3npm开发主pipeForrest Norvell将在新的一年中花一些时间在Windows上运行,所以请在npm问题跟踪器< https://github.com/npm/npm/issues >上创build与Windows相关的问题。