bower和npm的根本区别是什么?只想要简单明了的东西。我见过我的一些同事在他们的项目中交替使用bower和npm。
当前回答
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”。
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更好。)
所有包管理器都有许多缺点。你只需要选择你能和谁一起生活。
历史
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的工作方式
Bower维护单一版本的模块,它只会帮助您选择正确/最佳的模块。
Javascript依赖管理:npm vs bower vs volo?
NPM对于节点模块更好,因为有一个模块系统,您在本地工作。Bower对浏览器很好,因为目前只有全局范围,您需要对所使用的版本非常有选择。
从中找到了此有用的解释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的文件夹中。正如您所看到的,尽管它们执行类似的任务,但它们的目标是一组非常不同的库。
推荐文章
- 为时刻添加持续时间(moment.js)
- 如何在JavaScript中获得时区名称?
- 在JSON键名中哪些字符是有效的/无效的?
- jQuery中的live()转换为on()
- 如何区分鼠标的“点击”和“拖动”
- IE9是否支持console.log,它是一个真实的功能吗?
- Node.js同步执行系统命令
- 如何转义JSON字符串包含换行字符使用JavaScript?
- jQuery等价于JavaScript的addEventListener方法
- jQuery需要避免的陷阱
- JavaScript中变量字符串的XML解析
- 'React'指的是一个UMD全局,但当前文件是一个模块
- 为什么useState不触发重新渲染?
- 如何使用回调与useState挂钩在反应
- 网络请求失败