Javascript Node.js项目依赖项的过度递归

Javascript Node.js项目依赖项的过度递归,javascript,node.js,recursion,npm,onedrive,Javascript,Node.js,Recursion,Npm,Onedrive,因此,在漫长的一天工作之后,我坐下来,在系统托盘中看到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-

因此,在漫长的一天工作之后,我坐下来,在系统托盘中看到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 
。。。有一段时间,我嘲笑这种技术限制

但是,我想知道:一个节点项目中的目录递归量真的有必要吗?“angular app\server\node\u模块”之外的路径似乎只是整个项目的依赖项,可以更好地表示为:

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中的包管理似乎很神奇

我可以想象,一些大型Node.js项目甚至包含许多重复的模块(具有相同或类似的版本),这些模块可以合并为较少的模块。可以说:

  • 由于以下原因而存储和传输的数据量增加: 重复的依赖关系增加了开发软件的成本

  • 较浅的目录结构(特别是在这种情况下)是 通常更容易导航和理解

  • 过长的路径名可能会导致某些计算中出现问题 环境

我提议的(如果不存在这样的东西)是一个节点模块:

  • 递归扫描一个节点项目,收集嵌套的
    Node_模块
    文件夹列表,以及它们相对于项目根的埋深

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

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

如果没有别的,这将是一个有趣的实验。你们觉得怎么样?我可能会遇到哪些潜在问题?

看看是否

npm dedupe
你说对了

API文件参见、和

引用Sam Mikes的话:

默认情况下,npm将在安装时添加重复数据消除。这比改变节点的模块系统要可行得多,但这仍然不是一件小事,需要对一些根深蒂固的模式进行大量修改

这(最后)是npm目前正在进行的工作,名称为
多阶段安装
,目标是
npm@3
npm
development lead Forrest Norvell将在新的一年里花一些时间在Windows上运行,因此请务必在
npm
issue tracker上创建与Windows相关的问题


我在的服务器目录中运行了该命令,并且仍然能够导航到上面非常长的
C:\…\example\
路径。是控制台输出(一些冲突)。不幸。值得一试。你可以在这方面找到一些其他的想法,我觉得我不久前在这个问题上看到了另一个想法。如果我再次找到它,我将发布。无论如何,感谢您的回答(我不知道
npm dedupe
)和该链接。听起来@blesh的想法与我上面的建议类似。不客气,尽管令人失望的是它无法解决您的问题。FWIW,我认为模块作者在正确指定依赖项方面的更好实践会有所帮助。好的是这样,坏的只是有“1.2.3”语法,这相当令人恼火,就像有时对库的自反依赖一样,比如安装下划线只是为了使用
。.extend()