提问者:小点点

鲍尔和NPM有什么区别?


bowernpm之间的根本区别是什么?只是想要一些简单明了的东西。我看到我的一些同事在他们的项目中互换使用bowernpm


共3个答案

匿名用户

所有的包管理器都有很多缺点。你只需要选择你能接受的。

npm开始管理node.js模块(这就是为什么包默认进入node_modules的原因),但是当与Browserify或WebPack结合时,它也适用于前端。

Bower完全是为前端创建的,并在此基础上进行了优化。

npm比bower大得多,包括通用JavaScript(如country-data用于国家信息,或者sorts用于排序功能,可在前端或后端使用)。

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

鲍尔包括风格等。

npm主要关注JavaScript。样式要么是单独下载的,要么是npm-sasssass-npm之类的东西需要的。

最大的区别在于,npm做嵌套的依赖(但默认情况下是平面的),而Bower需要平面的依赖树(将依赖解析的负担放在用户身上)。

嵌套依赖树意味着依赖项可以有自己的依赖项,而依赖项也可以有自己的依赖项,以此类推。这允许两个模块需要相同依赖项的不同版本,并且仍然可以工作。注意,自NPMV3以来,依赖项树默认情况下是扁平的(节省空间),只在需要的地方嵌套,例如,如果两个依赖项需要它们自己版本的下划线。

有些项目同时使用这两种工具,他们将Bower用于前端包,将npm用于开发工具,如Yeoman,Grunt,Gulp,JSHint,CoffeeScript等。

  • 嵌套依赖项-深入了解node_modules的工作方式

匿名用户

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

关于国家预防机制的常见问题:(Archive.org链接,从6 Sep 2015)

在没有嵌套依赖关系的情况下,避免依赖关系冲突要困难得多。这是国家预防机制工作方式的基础,并已被证明是一种极为成功的方法。

在鲍尔主页上:

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的更新:

与鲍尔相比,NPM3仍然做着不同的事情。它将在全局范围内安装依赖项,但仅针对它遇到的第一个版本。其他版本安装在树中(父模块,然后是node_modules)。

  • [node_modules]
    • DEP A v1.0
    • 电子设备B v1.0
      • dep A v1.0(使用根版本)
      • DEP A v2.0(此版本与根版本不同,因此将是嵌套安装)

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

匿名用户

TL;DR:日常使用中最大的区别不是嵌套依赖。。。这是模块和全局的区别。

我认为以前的海报已经很好地涵盖了一些基本的区别。(NPM对嵌套依赖项的使用在管理大型复杂应用程序方面确实非常有帮助,尽管我认为这不是最重要的区别。)

然而,我感到惊讶的是,没有人明确解释鲍尔和NPM之间最基本的区别之一。如果您阅读了上面的答案,您将会看到“模块”这个词经常在NPM的上下文中使用。但它被随便提到,好像它甚至可能只是句法上的差异。

但是模块与全局(或者模块与“脚本”)的区别可能是Bower和NPM之间最重要的区别。将所有内容放入模块中的npm方法要求您改变为浏览器编写Javascript的方式,几乎可以肯定是为了更好。

在根目录下,Bower是关于加载普通旧脚本文件的。无论这些脚本文件包含什么,Bower都会加载它们。这基本上意味着Bower就像是在HTML的中包含了所有纯旧的