JavaScript 依赖管理:npm vs. bower vs.volo [关闭]

     2023-02-22     264

关键词:

【中文标题】JavaScript 依赖管理:npm vs. bower vs.volo [关闭]【英文标题】:JavaScript dependency management: npm vs. bower vs. volo [closed] 【发布时间】:2013-02-12 02:16:07 【问题描述】:

你如何比较npmbowervolo

这三个都可用于为 UI 项目安装 JavaScript 依赖项。 我知道npm 更具体。

那么,什么时候用什么?

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

【问题讨论】:

***.com/questions/18641899/… 如果您在这里阅读此问题并希望获得 2015 年的答案,请参阅我的更新答案。 Bower might be merged into npm 很快。 【参考方案1】:

最能描述 npm 和 bower 之间区别的描述是:npm 管理称为包的 JavaScript 模块,而 Bower 管理称为组件的前端组件(即 css、html 和 JavaScript)。 npm 也用于安装 bower。这是一个expansive article on npm and bower(不包括volo),它涉及很多细节。

【讨论】:

这不是一个很好的描述。 npm当然可以用来安装前端组件。 虽然我注意到 npm 上的一些“前端”库被弃用,取而代之的是它们的凉亭同行。以Ember 为例,一年未发布。 @Nate 这个名字就是它开始的地方。 NPM 现在是一个非常通用的包管理系统。我经常使用 npm 安装前端模块。将 NPM 用于 commonjs 模块、amd 和其他任何东西没有区别。您也可以将 npm 用于非 javascript 模块。因此,这根本不是 npm 和 bower 之间的区别。无论您称它们为包还是组件,它们都是相同的,因为它们都是任意文件的集合。 考虑到 bower 没有处理 html、css 和 javascript 的政策,这是一个非常具有误导性的答案。 npm 也没有任何政策,除了 npm 上的几乎所有内容都至少支持 commonjs 和偶尔的其他格式。您可以像使用 bower 一样将 html 和 css 放入 npm 包中。 npm 上有许多仅前端的包,包括包含 css 和 html 的包。 如果你使用browserify,npm 是完美的包管理器。我认为您使用哪个包管理器并不重要,但我个人会坚持每个项目只使用一个。【参考方案2】:

凉亭

它在前端开发人员中仍然很受欢迎,尽管它的功能很少。每个前端包都在使用它。还有一个initiative to merge bower into npm。

Bower 针对客户端进行了优化,仅支持平面依赖树,即each library must be used only once(因为将同一库的不同版本发送到客户端很昂贵),并且依赖约束必须由用户解决。

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

volo

多年来,我仍然没有使用超过 5 分钟。不知道,but from what I can see 确实包含了一些构建工具,对于 Grunt 用户来说是非常熟悉的。

npm

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

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

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

我看到使用 npm 的一些优势:

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

npm 是 JavaScript 的包管理器。


截至 2013 年 2 月,我的看法如下。 请不要再考虑了。

npm

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

凉亭

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

很遗憾,他有时有点马车。

volo

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

volo 的缺点是他们的项目非常过时。

【讨论】:

npm 上有数以千计的模块,它们要么只在浏览器中工作,要么在节点和浏览器中都工作。他们中的许多人甚至有 ci 徽章,可以准确地告诉你他们在哪些浏览器中工作。bower et all 上的大多数东西都可能在 npm 上。 我不明白像 ngBoilerplate 这样的项目需要使用 bower,而它已经依赖 npm 进行安装 什么是“流行音乐人”? “流行”是一个缩写。为“流行”? 在你的截图中,npm 代表核计划手册;)【参考方案3】:

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

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

似乎 bower 有更多可用的包,至少对于更受欢迎的包来说是这样。但很快jQuery will be also be available in NPM directly 可能所有其他库都会遵循同样的趋势。

在我看来,由于有像 browserifywebmake 这样的工具可以帮助在浏览器中使用节点模块,因此不再有bowervolo 的真正需求,除非他们为您提供其他东西(仅存在于他们的注册表中的特定模块)。

VoloBower 都不错,但在我看来,如果你已经在使用 NPM,最好还是坚持下去。

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

【讨论】:

对于同一个问题有相互竞争的解决方案是件好事。知道为什么 yeoman 项目在我们已经拥有 npm 时选择提出一个新的包管理器吗? (它成熟、有名且功能丰富)这个想法让我觉得我仍然没有抓住实际意义。 不是真的,但正如你所说,重新发明***有时很有趣,只是因为你可以,有时通过这样做,在尝试解决相同问题时会做出一些改进。除了让前端开发人员更容易找到包之外,这并不是他们选择制作新包的真正原因。并非所有前端开发人员都有节点经验,我想这是 Bower 等项目背后的主要原因。尽量让非节点用户更容易,我只是在这里猜测。 我猜他们想将npm 的麻烦分开,以支持前端的简单性。因此用于前端开发。【参考方案4】:

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

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

【讨论】:

仅当您直接从包管理器放置这些文件的文件夹中提供前端代码时才适用。在我的情况下,我要么有构建脚本来处理 less/js 文件,要么使用 browserify 来从这些文件中创建一个包。所以在我的情况下,这并不是一个大问题。分发的代码总是有正确的版本,即使其他子组件在开发过程中可能有重复,它们永远不会投入生产。 即使您无意中需要(作为子依赖项)同一依赖项的两个不同版本?我认为在这种情况下你错了 我通常不需要我无法控制的模块,所以它们总是正确的......失败。在我的情况下使用凉亭没有任何好处 因此,如果您可以控制整个依赖关系树,则只能说 npm 可以避免在客户端代码中重复模块。我从事的绝大多数事情当然不是这种情况,而且对于大多数使用依赖管理器来包含客户端模块的项目来说可能不是这样。 除非您正在处理混搭,否则您的依赖关系树不会那么复杂,至少对于第三方代码而言。大多数 js 库都导出单个全局,因此使用 browserify-shim 可以确保可以在全局范围内使用它们,因此始终是您可以控制的版本。我的观点是,您可以在不需要另一个包管理器的情况下实现相同的目标。最后可能是偏好问题。总要做出妥协。【参考方案5】:

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

jam compile output.js

应该有人再做一个包管理器并将其命名为:yapm :)

【讨论】:

你的愿望已经实现:github.com/rlidwka/yapm:P 好吧,我在考虑浏览器端依赖管理器,但我想这对两者都适用:p 这就是为什么我不能做初创公司,我所有的想法都已经考虑过了。 @BruceLim 是的,每当我们认为我们有一个好主意时,总会有其他人已经得到它。

npm包的发布和管理(代码片段)

...具呢?因为我们在Node.js上开发时,会用到很多别人写的JavaScript代码。如果我们要使用别人写的某个包,每次都根据名称搜索一下官方网站,下载代码,解压,再使用,非常繁琐。于是一个集中管理的工具应运而生:大家都把自... 查看详情

如何使用npm?cnpm又是什么?

...具呢?因为我们在Node.js上开发时,会用到很多别人写的JavaScript代码。如果我们要使用别人写的某个包,每次都根据名称搜索一下官方网站,下载代码,解压,再使用,非常繁琐。于是一个集中管理的工具应运而生:大家都把自... 查看详情

如何管理客户端javascript依赖项?[关闭]

...依赖关系,但我找不到任何满足我所有需求的连接客户端JavaScript依赖关系管理工作流程。我想满足这5个要求:以类似于npm的package.json或bower的bower.json格式管理我的客户端依赖项它应该可以灵活地指向我的dependency.json文件中的gitr... 查看详情

nodejsyarn替代npm的包管理——快速安全可靠性高的依赖管理

Yarn能帮你解决的五件事转自: http://www.qingpingshan.com/jb/javascript/185590.html 长话短说(TL;DR):在JavaScript领域有多个包管理器,举几个来说: npm , bower , component 和 volo 。截至写本文,最 查看详情

npm--nodepackagemanager

...可以称为包。当我们开发网站时,可能需要引入包A,A又依赖于B,B又依赖于C,我们则需要把B和C都引入进来,如果手动去各个网站下载的话会十分麻烦,而使用NPM的话就简单许多---npminstall<packagename>安装npm是Node.js下的包管... 查看详情

如何管理客户端 JavaScript 依赖项? [关闭]

】如何管理客户端JavaScript依赖项?[关闭]【英文标题】:Howtomanageclient-sideJavaScriptdependencies?[closed]【发布时间】:2012-10-0506:35:42【问题描述】:尽管有很好的解决方案来管理服务器端的依赖关系,但我找不到任何能满足我所有需... 查看详情

Angular 和 NPM 依赖 VS devDependencies

】Angular和NPM依赖VSdevDependencies【英文标题】:AngularandNPMdependenciesVSdevDependencies【发布时间】:2020-06-1513:18:22【问题描述】:在阅读了很多关于这个问题的文章并关注了这个非常有用的帖子:What\'sthedifferencebetweendependencies,devDependen... 查看详情

node_modules?(代码片段)

...用ls-snode_modules%APPDATA%Roamingpmode_modulesnodejs中package.json中的依赖必须每个项目都有自己的node_modules文件夹,而无法在多个项目之间共用一套node_modules(像Java中的Maven那样)。依赖管理是每个现代语言的标配。依赖管理和打包工具是... 查看详情

npm包管理工具(代码片段)

NPM包管理工具NPM全程是NodePackageManager,他是JavaScript的包管理工具,是Node.js平台默认的包管理工具,通过NPM可以安装、共享、分发代码、管理项目依赖关系。可以从NPM服务器下载别人编写的第三方包到本地。可以从NPM服务器下载... 查看详情

bower程序包管理器与npm的对比及handlebars包的使用实例

...类似npm,主要用于前端优化。bower可以管理包含HTML,CSS,JavaScript,字体甚至是图像文件的组成部分。bower并没有做别的事-它仅仅安装你需要的包及其依赖的正确版本。2、**依赖node环境,window用户必须安装git工具。安装和升级bowe... 查看详情

NPM vs. Bower vs. Browserify vs. Gulp vs. Grunt vs. Webpack [关闭]

...7-06-2009:42:00【问题描述】:我正在尝试总结我对最流行的JavaScript包管理器、捆绑器和任务运行器的了解。如果我错了,请纠正我:npm&bower是包管理器 查看详情

使用 NPM 管理文件依赖项

】使用NPM管理文件依赖项【英文标题】:ManagefiledependencieswithNPM【发布时间】:2015-04-0600:03:20【问题描述】:我正在与一个中型团队一起开发一个大型前端应用程序。到目前为止,我们一直在使用requirejs和AMD模块来管理我们约500... 查看详情

转如何使用npm来管理你的node.js依赖

npm是Node.js的模块依赖管理工具。作为开发者使用的工具,主要解决开发Node.js时会遇到的问题。如同RubyGems对于Ruby开发者和Maven对于Java开发者的重要性,npm对与Node.js的开发者和社区的重要性不言而喻。本文包括五点:package.json、... 查看详情

golang依赖管理

...言大多都有非常成熟的依赖管理工具,java的maven和gradle,javascript的npm,python的pip,这些工具极大地降低了我们使用第三方库的成本,提高了生产效率,而c++比较奇葩,并没有这样统一的依赖管理工具,大公司好一点,有专门的... 查看详情

golang依赖管理

...言大多都有非常成熟的依赖管理工具,java的maven和gradle,javascript的npm,python的pip,这些工具极大地降低了我们使用第三方库的成本,提高了生产效率,而c++比较奇葩,并没有这样统一的依赖管理工具,大公司好一点,有专门的... 查看详情

如何通过 NPM 管理非节点模块作为 Node Project 的依赖项?

】如何通过NPM管理非节点模块作为NodeProject的依赖项?【英文标题】:Howtomanageanon-nodemoduleasdependencyforNodeProjectthorughNPM?【发布时间】:2020-04-1509:05:03【问题描述】:我在我的项目中使用bower进行依赖管理。但现在我想转向node和npm... 查看详情

NPM 何时会恢复依赖包之后发布的依赖项?

】NPM何时会恢复依赖包之后发布的依赖项?【英文标题】:When,ifever,willNPMrestoredependenciespublishedafterthedependentpackage?【发布时间】:2019-05-3111:18:22【问题描述】:假设package.json中的所有引用都是^1.0.0,我只修改补丁版本。我有A依... 查看详情

npm 链接多个本地(相互依赖)模块

】npm链接多个本地(相互依赖)模块【英文标题】:npmlinkmultiplelocal(inter-dependant)modules【发布时间】:2014-10-1710:31:56【问题描述】:我有3个node.js模块,A、B和C。所有这些都是私人git存储库。A依赖于B依赖于C。Git克隆A并执行npminst... 查看详情