我最近买了一个HTML模板,它包含许多放在bower_components
目录中的插件和一个package.js
文件。我想安装另一个我喜欢的软件包,但为此目的决定使用npm
。
当我输入:
npc install pnotify
node_modules
,其中包含大约900个目录和另一个包。
答案 0 :(得分:5)
这是一个非常好的问题,我想指出一些事情。
V8引擎,节点模块(依赖项)和require
Node.JS是基于V8引擎构建的,它的源代码是C ++。这意味着Node.JS的依赖关系基本上是用C ++编写的。
现在,当你 require
一个依赖项时,你实际上正在从c ++程序中取代代码/函数。这就是库/依赖关系的制作方式。
图书馆有很多你不会使用的功能
例如,请查看 express-validator module。它有很多功能。当您需要该模块时,您是否使用它提供的所有功能?答案是否。人们需要这样的包只是为了使用它的一个好处,并且所有的功能最终都被下载,这占用了不必要的空间。
将其他节点依赖关系的节点依赖关系视为解释语言
实施例:
Javascript是用C / C ++语言编写的,这些语言是用Assembly编写的。把它想象成一棵树。您每次都可以创建新分支,以便更方便地使用,最重要的是,节省时间。它使事情更快。这就是创建新依赖项的类似情况,当人们创建一个新的依赖项时,他们使用(require
)已经存在的依赖项,而不是编写一个完整的C ++程序,因为这样可以使一切变得更容易。
当需要其他NPM来创建新的
时出现问题当依赖关系的作者需要其他依赖关系时,只需要使用它们的一些(少量)好处,他们最终会全部下载它们,(他们并不真正关心,因为他们' d而不是在C ++中明确地编写新的插件)这需要额外的空间。例如,您可以看到express-validator模块使用from this link.
的依赖项所以,当你有大量项目使用大量依赖项时,你最终会为它们占用这么多空间。
解决此问题的方法
第1名
2号(几乎不可能)
结论&&注意
所以基本上没有逃避下载所有节点包,但如果您认为可以使用,或者让其他人处理它,您可以使用解决方案编号1。我仍然认为这不是一个好主意。
另外,问自己这个问题,那些包真的会给你带来问题吗?
答案 1 :(得分:0)
不,没有必要在项目中添加大约900个软件包依赖项,因为您想要添加一些模板。但这取决于你!
模板的繁重程度并没有挑战node.js生态系统,也没有挑战他的主要软件包系统npm。
事实上,javascript社区倾向于使最小的模块负责一项任务,而只需一项。 我想这不是一件坏事。但这可能是因为您的项目中存在大量依赖项。
如今硬盘内存很便宜,而且没有人关心如何制作高效/小型应用程序。
与往常一样,这只是一个选择问题。
答案 2 :(得分:0)
为几个kB项目提供数百个重达数百MB的软件包有什么意义。
没有......
如果您打算将其提供给其他开发人员,只需gitignore(或从共享包中删除)node_modules
或bower_components
目录。开发人员只需根据需要再次安装依赖项;)
如果它像HTML模板或类似的东西一样简单,那么节点最有可能只是为了让您作为开发人员更轻松地提供实时重新加载,编译/转换打字稿/ babel / SCSS / SASS / LESS / Coffee ...(列表继续; P)等。
在这种情况下,依赖关系很可能只是dev_dependencies,在生产环境中根本不需要;)
此外,许多软件包都带有单独的生产和开发依赖项,因此您只需要安装生产依赖项......
npm install --only=prod
如果您的项目确实需要生产中的许多项目,并且您真的想避免这些项目,那么只需花一些时间来包含您的项目所需的css / js文件(这可能是一项艰巨的任务)。
更新
制作与默认安装
大多数项目都有不同的开发和生产依赖,
开发依赖项可能包括SASS,打字稿等编译器,uglifiers(缩小),也许像重新加载等等。
生产版本不会减少node_modules
目录的大小。
**否node_modules
**
在某些html模板类型的项目中,您可能不需要生成任何node_modules
,因此您跳过了npm install
。
无法访问node_modules
或者在某些情况下,当服务器服务器本身存在于node_modules中时,可能会阻止对它的访问(因为不需要从前端访问这些服务器)。
答案 3 :(得分:0)
那是什么?为什么他们和我的包装一起安装?
存在依赖性以通过模块化促进代码重用。
...我是否需要在生产中提供包含数百个不必要包的模板?
不应该如此迅速地忽视这种模块性。如果您内联require
并消除死代码,那么您将失去自动应用于代码的依赖项的维护修补程序的好处。您应该将此视为编译的一种形式,因为......好吧...... 它是编译。
尽管如此,如果您获得许可以此编译的形式重新分发所有依赖项,您将很乐意了解这些优化是由编译器执行的,它将Javascript编译为Javascript。 The Closure Compiler,作为我偶然发现的第一个示例,似乎执行advanced compilation,这意味着您可以删除死代码和函数内联 ...这似乎很有希望!
答案 4 :(得分:0)
然而,当您需要证明所有 npm 模块的许可是合理的时,这确实有另一个副作用..因此,当您由于依赖关系而拥有数百个 npm 模块时,这项工作也变得更加繁琐