JavaScript依赖关系pipe理:npm vs. bower vs. volo

你如何比较npmbowervolo

所有这三个都可以用来为UI项目安装JavaScript依赖项。 我明白npm是更具体的节点。

那么,什么时候用什么?

npm仍然遥远,但是, bowervolo似乎正在解决完全相同的问题,尽pipe我无法在npmbower-volo之间划出一条线。

最好描述npm和bower之间区别的描述是:npmpipe理称为包的JavaScript模块,Bowerpipe理称为组件的前端组件(即css,html和JavaScript)。 npm也用于安装凉亭。 这里是一个广泛的文章npm和鲍尔 (不包括volo)它进入了大量的细节。

亭子

尽pipe它的function很less,但在前端开发者中仍然很受欢迎。 每个前端软件包都在使用它。 还有一个将bower合并到npm的计划 。

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

你可以期望find与registry(registrybower search <some keyword> )中的前端相关的任何东西 – 在我看来,这是与其他软件包pipe理者相比最大的优势。

VOLO

多年来我还没有使用它超过5分钟。 不知道, 但从我所看到的,它包括一些构build工具,这是Grunt用户非常熟悉。

NPM

是的,npm代表节点包pipe理器。 但是现在你可以把它用于一切。 人们不再只是npm install东西,并期望他们只能在Node环境中工作。 例如, Twitter Bootstrap有很多npm包 。

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

用npm @ 3,你的node_modules目录会变得更平坦。 所有的依赖关系和大部分的子依赖关系(和(子)+依赖关系)将在顶层彼此相邻。 只有在冲突的时候,模块才能在更深的层面上安装。 这对于Windows用户来说应该更容易一些。

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

  • 它被所有其他软件包pipe理器(component,bower,volo,JSPM等)使用;
  • 允许使用构build脚本;
  • 许多工具可用于自省基于npm的包

npm是JavaScript的包pipe理器。

npmjs.com截图


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

NPM

当您使用Node项目时,坚持使用它会更好,浏览器中也只有很less的项目可用。

亭子

鲍尔现在是stream行音乐人。 他们有很多项目,项目维护人员喜欢在registry中保持最新状态。

他有时候是一个小小的马车是一个耻辱。

VOLO

从那以后,我还没有尝试过5分多钟的时间,但是从我所能看到的看来,这比弹力更加灵活。

volo的一个负面影响是他们的项目非常落后。

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

事实是你可以使用NPM来pipe理浏览器的javascript和css。 没有什么能阻止你这样做。 从这个意义上讲,使用NPM对于我来说更自然,而不是为了相同的目的而pipe理两种不同的工具。

看来,凉亭有更多的包,至less对于更受欢迎的。 但是很快jQuery也将直接在NPM中使用,其他所有库也可能会遵循相同的趋势。

在我看来,因为有像browserifywebmake这样的工具可以帮助在浏览器中使用节点模块,所以除非他们为你提供其他的东西(一个特定的模块只存在于他们的注册pipe理机构)。

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

请注意, 即使不使用browserify或webmake您也可以使用NPM来pipe理您的客户端依赖项 。 在我正在开发的大多数项目中,在安装了npm模块之后,我运行脚本将它们部署到我的客户端应用程序使用它们的位置。 有时候我用grunt把这个文件和其他js文件连接起来,有时我直接从我的web应用的模板文件中引用它。 无论如何,这是个人喜好。 其他人可以发现鲍尔或沃洛更容易使用,因为他们更适合自己的工作stream程。

Bower与NPM相比的巨大优势在于其依赖pipe理强制使用单个版本的组件(而NPM通过将不同副本/版本作为不同模块的子依赖关系来工作)。 这是一个非常好的事情,因为它可以防止你的客户端JavaScript变得臃肿,需要包含不同版本的组件的多个副本。 包括模块的多个副本是NPM依赖pipe理如何工作的核心,NPM因此完全不适合客户端软件包pipe理。

上述结果是,软件包维护者和消费者必须更加注意维护他们的依赖版本号以避免冲突,但这是一个值得付出的代价。 而且我发现NPM模块在发行主要版本,次要版本和补丁发行版本时通常是sl </s>不驯的,所以NPM依赖pipe理也不完全是玫瑰花。

我知道这不在问题的范围内,但也有另一种select。 果酱JS – http://jamjs.org/有一件有趣的事情是,它拥有果酱的咕噜声function:;

 jam compile output.js 

有人应该做另一个包pipe理器,并命名它:yapm 🙂