162

你如何比较npmbowervolo

这三个都可用于为 UI 项目安装 JavaScript 依赖项。我了解npm更多是特定于节点的。

那么,什么时候用什么?

npm仍然遥遥无期,但bower似乎volo正在解决完全相同的问题,尽管我无法在npm和之间划清界限bower-volo

4

5 回答 5

106

最能描述 npm 和 bower 之间区别的描述是:npm 管理称为包的 JavaScript 模块,而 Bower 管理称为组件的前端组件(即 css、html 和 JavaScript)。npm 也用于安装 bower。这是一篇关于 npm 和 bower 的扩展文章(不包括 volo),其中包含大量细节。

于 2013-04-15T22:45:13.297 回答
74

凉亭

它在前端开发人员中仍然很受欢迎,尽管它的功能很少。每个前端包都在使用它。还有一个将 bower 合并到 npm 的倡议

Bower 针对客户端进行了优化,仅支持平面依赖树,即每个库只能使用一次(因为将同一库的不同版本发送到客户端很昂贵),并且依赖约束必须由用户解决.

您可以期望在 bower 注册表 ( ) 中找到任何与前端相关的东西bower search <some keyword>——在我看来,这是 bower 相对于其他包管理器的最大优势。

沃洛

多年来,我仍然没有使用超过 5 分钟。不知道,但据我所知,它确实包含一些构建工具,这是 Grunt 用户非常熟悉的。

npm

是的,npm 代表节点包管理器。但是现在你可以用它来做任何事情。人们不再只npm installing 事物并期望它们在 Node 环境中工作。例如,有许多用于 Twitter Bootstrap 的 npm 包

Npm 针对服务器端使用进行了优化,具有嵌套的依赖树。每个依赖项都可以有自己的依赖项,这些依赖项可以有自己的依赖项,依此类推。这消除了依赖版本冲突,因为每个依赖都可以使用它们自己的版本,例如下划线。然而,即将到来的npm 版本 3 将扁平化依赖树

使用 npm@3,你的 node_modules 目录会更平坦。您的所有依赖项和大多数子依赖项(和(子)+依赖项)将在顶层彼此相邻。只有当存在冲突时,才会安装更深层次的模块。这应该使 Windows 用户的事情变得更容易。

我在使用 npm 时看到的一些优点:

  • 它被所有其他包管理器(组件、bower、volo、JSPM 等)使用;
  • 允许使用构建脚本;
  • 许多工具可用于自省基于 npm 的包

npm 是 JavaScript 的包管理器。

npmjs.com 截图


截至 2013 年 2 月,我的意见如下。请不要再考虑它了。

npm

当您使用 Node 项目时,最好坚持使用它,浏览器可用的项目也很少......

凉亭

鲍尔是现在的流行音乐人。他们有很多项目,项目维护者喜欢让他们在凉亭注册表中保持最新......

很遗憾他有时有点毛病。

沃洛

从那以后,我已经有超过 5 分钟没有尝试过 Volo,但据我所知,它看起来比 Bower 更灵活。

对volo 不利的一点是,他们的项目非常过时。

于 2013-02-26T17:33:03.673 回答
24

他们似乎正在解决相同的问题,但针对不同的环境/世界。用于 nodejs 和 Volo 的 NPM,用于浏览器的 bower。

事实上,你也可以使用 NPM 来管理浏览器的 javascript 和 css。没有什么能阻止你这样做。从这个意义上说,使用 NPM 对我来说比为同一目的管理两个不同的工具更自然。

似乎凉亭有更多可用的软件包,至少对于更受欢迎的软件包。但很快jQuery 也将直接在 NPM 中可用,并且可能所有其他库都将遵循相同的趋势。

在我看来,由于那里有诸如browserifywebmake之类的工具,可以帮助在浏览器中使用节点模块,因此不再需要bowervolo,除非它们为您提供其他东西(特定模块仅存在于他们的注册表)。

VoloBower也都不错,但从我的角度来看,如果你已经在使用 NPM,那么坚持下去可能会更好。

请注意,即使不使用 browserify 或 webmake,您也可以使用 NPM 来管理您的客户端依赖项。在我从事的大多数项目中,安装 npm 模块后,我运行一个脚本将它们部署到我的客户端应用程序使用它们的位置。有时我使用 grunt 将该文件与其他 js 文件连接起来,有时我直接从我的 Web 应用程序的模板文件中引用它。无论如何,这是个人喜好。其他人会发现 Bower 或 Volo 更易于使用,因为它们更自然地融入他们的工作流程。

于 2013-11-25T10:02:56.080 回答
15

Bower 相对于 NPM 的最大优势在于它的依赖管理强制使用单个版本的组件(而 NPM 通过将不同的副本/版本作为不同模块的子依赖项来工作)。这是一件非常好的事情,因为它可以防止您的客户端 javascript 通过需要包含不同版本的组件的多个副本而变得臃肿。包含一个模块的多个副本是 NPM 依赖管理工作方式的核心,因此 NPM 完全不适合客户端包管理。

上述结果是 bower 包维护者和消费者必须更加注意维护他们的依赖版本号以避免冲突,但这是值得付出的代价。而且我发现 NPM 模块在发布主要、次要和补丁版本时经常马虎,所以 NPM 依赖管理也不是完美的。

于 2014-02-28T16:54:12.803 回答
5

我知道这不在问题的范围内,但还有另一种选择。Jam JS - http://jamjs.org/有趣的一件事是它在 jam 中具有 grunt 功能:

jam compile output.js

有人应该制作另一个包管理器并将其命名为:yapm :)

于 2014-02-10T05:59:45.043 回答