bower和npm的根本区别是什么?只想要简单明了的东西。我见过我的一些同事在他们的项目中交替使用bower和npm。
当前回答
对于许多使用node.js的人来说,bower的一个主要好处是管理根本不是javascript的依赖关系。如果他们使用的是编译为javascript的语言,那么可以使用npm来管理他们的一些依赖关系。然而,并不是所有的依赖都是node.js模块。一些编译为javascript的代码可能有奇怪的源语言特定的篡改,这使得在用户期望源代码时,将它们传递给编译为javascript是一个不合适的选项。
并非npm包中的所有内容都需要面向用户的javascript,但对于npm库包,至少其中一些应该是面向用户的。
其他回答
对于许多使用node.js的人来说,bower的一个主要好处是管理根本不是javascript的依赖关系。如果他们使用的是编译为javascript的语言,那么可以使用npm来管理他们的一些依赖关系。然而,并不是所有的依赖都是node.js模块。一些编译为javascript的代码可能有奇怪的源语言特定的篡改,这使得在用户期望源代码时,将它们传递给编译为javascript是一个不合适的选项。
并非npm包中的所有内容都需要面向用户的javascript,但对于npm库包,至少其中一些应该是面向用户的。
从中找到了此有用的解释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的文件夹中。正如您所看到的,尽管它们执行类似的任务,但它们的目标是一组非常不同的库。
2017年10月更新
鲍尔终于被弃用了。故事结束。
较旧的答案
Spotify的JavaScript开发人员Mattias Petter Johansson:
在几乎所有情况下,在Bower上使用Browserify和npm更合适。它只是一个比Bower更好的前端应用打包解决方案。在Spotify,我们使用npm来打包整个web模块(html、css、js),而且效果非常好。Bower将自己打造为网络套餐管理者。如果这是真的,那就太棒了——一个能让我作为前端开发人员的生活变得更好的包管理器将太棒了。问题是Bower没有为此提供专门的工具。它提供了我所知的npm没有的任何工具,尤其是对前端开发人员没有特别有用的工具。前端开发人员在npm上使用Bower根本没有好处。我们应该停止使用bower,并围绕npm进行整合。谢天谢地,这就是正在发生的事情:
使用browserify或webpack,将所有模块连接到大的缩小文件中变得非常容易,这对于性能来说非常棒,尤其是对于移动设备。鲍尔则不然,这将需要更多的劳动力才能达到同样的效果。npm还可以同时使用多个版本的模块。如果你没有做过太多的应用程序开发,这可能最初会让你觉得是一件坏事,但一旦你经历了几次依赖性地狱,你就会意识到拥有一个模块的多个版本的能力是一个非常棒的功能。请注意,npm包含一个非常方便的重复数据消除工具,它可以自动确保您在实际需要时仅使用两个版本的模块-如果两个模块都可以使用同一版本的模块,则它们会使用。但如果他们做不到,你就有一个非常方便的解决方案。
(注意,截至2016年8月,Webpack和rollup被普遍认为比Browserify更好。)
我的团队从Bower搬到了npm,因为:
编程使用很痛苦Bower的界面不断变化有些功能,如url速记,完全被破坏了在同一项目中同时使用Bower和npm是很痛苦的保持bower.json版本字段与git标记同步非常困难源代码管理!=包裹管理CommonJS支持并不简单
有关详细信息,请参阅“为什么我的团队使用npm而不是bower”。
这个答案是对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的文档
推荐文章
- 如何使用Jest测试对象键和值是否相等?
- 将长模板文字行换行为多行,而无需在字符串中创建新行
- 如何在JavaScript中映射/减少/过滤一个集?
- Bower: ENOGIT Git未安装或不在PATH中
- 添加javascript选项选择
- 在Node.js中克隆对象
- 为什么在JavaScript的Date构造函数中month参数的范围从0到11 ?
- 使用JavaScript更改URL参数并指定默认值
- 在window.setTimeout()发生之前取消/终止
- 如何删除未定义和空值从一个对象使用lodash?
- 检测当用户滚动到底部的div与jQuery
- 在JavaScript中检查字符串包含另一个子字符串的最快方法?
- 检测视口方向,如果方向是纵向显示警告消息通知用户的指示
- ASP。NET MVC 3 Razor:在head标签中包含JavaScript文件
- 禁用从HTML页面中拖动图像