bower和npm的根本区别是什么?只想要简单明了的东西。我见过我的一些同事在他们的项目中交替使用bower和npm。


当前回答

这个答案是对Sindre Sorhus答案的补充。npm和Bower之间的主要区别在于它们处理递归依赖关系的方式。请注意,它们可以在单个项目中一起使用。

关于npm常见问题解答:(archive.org链接,2015年9月6日)

如果没有嵌套,就很难避免依赖冲突依赖关系。这是npm工作方式的基础事实证明这是一种非常成功的方法。

在Bower主页上:

Bower针对前端进行了优化。Bower使用平面依赖关系树,每个包只需要一个版本,减少了页面负载最低限度。

简而言之,npm的目标是稳定。Bower的目标是将资源负载降至最低。如果绘制依赖关系结构,您将看到:

npm:

project root
[node_modules] // default directory for dependencies
 -> dependency A
 -> dependency B
    [node_modules]
    -> dependency A

 -> dependency C
    [node_modules]
    -> dependency B
      [node_modules]
       -> dependency A 
    -> dependency D

如您所见,它递归地安装一些依赖项。依赖项A已安装三个实例!

鲍尔:

project root
[bower_components] // default directory for dependencies
 -> dependency A
 -> dependency B // needs A
 -> dependency C // needs B and D
 -> dependency D

在这里,您可以看到所有唯一的依赖项都在同一级别上。

那么,为什么要使用npm呢?

可能依赖项B需要依赖项a的不同版本,而不是依赖项C。npm安装了这两个版本的依赖项,所以它无论如何都可以工作,但是Bower会给您带来冲突,因为它不喜欢复制(因为在网页上加载相同的资源效率很低,成本也很高,而且会导致一些严重的错误)。您必须手动选择要安装的版本。这可能会导致其中一个依赖关系中断,但无论如何都需要修复。

因此,常见的用法是Bower,用于您希望在网页上发布的包(例如,运行时,避免重复),并将npm用于其他事情,如测试、构建、优化、检查等(例如,开发时间,重复不太重要)。

npm 3的更新:

与鲍尔相比,npm 3的表现仍然有所不同。它将全局安装依赖项,但仅适用于遇到的第一个版本。其他版本安装在树中(父模块,然后是node_modules)。

[节点模块]dep A v1.0版dep B v1.0版dep A v1.0(使用根版本)dep C v1.0版dep A v2.0(此版本与根版本不同,因此将是嵌套安装)

有关更多信息,我建议阅读npm 3的文档

其他回答

这个答案是对Sindre Sorhus答案的补充。npm和Bower之间的主要区别在于它们处理递归依赖关系的方式。请注意,它们可以在单个项目中一起使用。

关于npm常见问题解答:(archive.org链接,2015年9月6日)

如果没有嵌套,就很难避免依赖冲突依赖关系。这是npm工作方式的基础事实证明这是一种非常成功的方法。

在Bower主页上:

Bower针对前端进行了优化。Bower使用平面依赖关系树,每个包只需要一个版本,减少了页面负载最低限度。

简而言之,npm的目标是稳定。Bower的目标是将资源负载降至最低。如果绘制依赖关系结构,您将看到:

npm:

project root
[node_modules] // default directory for dependencies
 -> dependency A
 -> dependency B
    [node_modules]
    -> dependency A

 -> dependency C
    [node_modules]
    -> dependency B
      [node_modules]
       -> dependency A 
    -> dependency D

如您所见,它递归地安装一些依赖项。依赖项A已安装三个实例!

鲍尔:

project root
[bower_components] // default directory for dependencies
 -> dependency A
 -> dependency B // needs A
 -> dependency C // needs B and D
 -> dependency D

在这里,您可以看到所有唯一的依赖项都在同一级别上。

那么,为什么要使用npm呢?

可能依赖项B需要依赖项a的不同版本,而不是依赖项C。npm安装了这两个版本的依赖项,所以它无论如何都可以工作,但是Bower会给您带来冲突,因为它不喜欢复制(因为在网页上加载相同的资源效率很低,成本也很高,而且会导致一些严重的错误)。您必须手动选择要安装的版本。这可能会导致其中一个依赖关系中断,但无论如何都需要修复。

因此,常见的用法是Bower,用于您希望在网页上发布的包(例如,运行时,避免重复),并将npm用于其他事情,如测试、构建、优化、检查等(例如,开发时间,重复不太重要)。

npm 3的更新:

与鲍尔相比,npm 3的表现仍然有所不同。它将全局安装依赖项,但仅适用于遇到的第一个版本。其他版本安装在树中(父模块,然后是node_modules)。

[节点模块]dep A v1.0版dep B v1.0版dep A v1.0(使用根版本)dep C v1.0版dep A v2.0(此版本与根版本不同,因此将是嵌套安装)

有关更多信息,我建议阅读npm 3的文档

对于许多使用node.js的人来说,bower的一个主要好处是管理根本不是javascript的依赖关系。如果他们使用的是编译为javascript的语言,那么可以使用npm来管理他们的一些依赖关系。然而,并不是所有的依赖都是node.js模块。一些编译为javascript的代码可能有奇怪的源语言特定的篡改,这使得在用户期望源代码时,将它们传递给编译为javascript是一个不合适的选项。

并非npm包中的所有内容都需要面向用户的javascript,但对于npm库包,至少其中一些应该是面向用户的。

Bower维护单一版本的模块,它只会帮助您选择正确/最佳的模块。

Javascript依赖管理:npm vs bower vs volo?

NPM对于节点模块更好,因为有一个模块系统,您在本地工作。Bower对浏览器很好,因为目前只有全局范围,您需要对所使用的版本非常有选择。

所有包管理器都有许多缺点。你只需要选择你能和谁一起生活。

历史

npm最初是管理node.js模块的(这就是为什么默认情况下包会进入node_modules),但当与Browserify或webpack结合时,它也适用于前端。

Bower专为前端而设计,并为此进行了优化。

回购规模

npm比bower大得多,包括通用JavaScript(如国家信息的国家数据或排序功能的排序,可在前端或后端使用)。

鲍尔的包裹数量要少得多。

样式处理等

Bower包括款式等。

npm专注于JavaScript。样式可以单独下载,也可以根据npm-sass或sas-npm等要求下载。

依赖关系处理

最大的区别是,npm执行嵌套依赖关系(但默认情况下是扁平的),而Bower需要一个扁平的依赖关系树(将依赖关系解析的负担推给用户)。

嵌套的依赖关系树意味着您的依赖关系可以有自己的依赖关系,这些依赖关系可以是自己的,依此类推。这允许两个模块需要相同依赖关系的不同版本,并且仍然可以工作。注意,自npm v3以来,依赖关系树默认为平面(节省空间),仅在需要时嵌套,例如,如果两个依赖关系需要自己的Undercore版本。

一些项目同时使用这两种工具:他们使用Bower作为前端包,使用npm作为开发工具,如Yeoman、Grunt、Gulp、JSHint、CoffeeScript等。


资源

嵌套依赖关系-深入了解node_modules的工作方式

从中找到了此有用的解释http://ng-learn.org/2013/11/Bower-vs-npm/

一方面,创建npm是为了安装node.js环境中使用的模块,或使用node.js构建的开发工具,如Karma、lint、minifier等。npm可以在项目中本地安装模块(默认情况下在node_modules中),也可以在全局安装模块,供多个项目使用。在大型项目中,指定依赖项的方法是创建一个名为package.json的文件,其中包含依赖项列表。当您运行npm安装时,npm会识别该列表,然后下载并安装它们。另一方面,创建bower是为了管理前端依赖关系。jQuery、AngularJS、下划线等库。与npm类似,它有一个文件,您可以在其中指定一个名为bower.json的依赖项列表。在这种情况下,您的前端依赖项是通过运行bowerinstall来安装的,默认情况下,它会将它们安装在名为bowr_components的文件夹中。正如您所看到的,尽管它们执行类似的任务,但它们的目标是一组非常不同的库。