Gestión de dependencias de JavaScript: npm vs. bower vs. volo [cerrado]

160

¿Cómo se compara npm, bowery volo?

Los tres se pueden usar para instalar dependencias de JavaScript para un proyecto de IU. Entiendo que npmes más específico del nodo.

Entonces, ¿cuándo usar qué?

npmtodavía se mantiene distante, pero bowery voloparecen ser la solución de exactamente el mismo problema, aunque yo no sea capaz de trazar una línea entre npmy bower-volo.

Yugal Jindle
fuente
1
Si está leyendo esta pregunta y quiere una respuesta de 2015, vea mi respuesta actualizada.
gustavohenke
2
Bower podría fusionarse en npm muy pronto.
Dan Dascalescu

Respuestas:

104

Una descripción que mejor describe la diferencia entre npm y bower es: npm administra los módulos JavaScript llamados paquetes y Bower administra los componentes front-end (es decir, css, html y JavaScript) llamados componentes. npm también se usa para instalar bower. Aquí hay un artículo extenso sobre npm y bower (no cubre volo) que entra en muchos detalles.

bucles extraños
fuente
88
Esta no es una muy buena descripción. Npm ciertamente se puede usar para instalar componentes frontales.
BT
Aunque he notado que algunas bibliotecas "frontend" en npm se abandonan en favor de sus contrapartes de Bower. Tomemos por ejemplo Ember , que no se ha publicado en un año.
briangonzalez
44
@Nate El nombre es simplemente donde comenzó. NPM es ahora un sistema de administración de paquetes de propósito muy general. Regularmente uso npm para instalar módulos frontales. No hay diferencia en el uso de NPM para módulos commonjs, vs amd, vs cualquier otra cosa. También podría usar npm para módulos que no sean JavaScript. Por lo tanto, eso simplemente no es una diferencia entre npm y Bower. Ya sea que los llame paquetes o componentes, son los mismos ya que ambos son colecciones de archivos arbitrarios.
BT
2
Esta es una respuesta muy engañosa considerando que bower no tiene una política para tratar con html, css y javascript. npm tampoco tiene una política, excepto que casi todo en npm está escrito para admitir al menos commonjs y, en ocasiones, otros formatos. Puede poner html y css en paquetes npm como puede hacerlo con bower. Hay muchos paquetes frontend-only en npm, incluidos los paquetes que incluyen css y html.
subestima el
3
Si está utilizando browserify , npm es el administrador de paquetes perfecto. No creo que importe qué administrador de paquetes use, pero personalmente me quedaría con solo uno por proyecto.
Eruant
72

cenador

Todavía es muy popular entre los desarrolladores front-end, a pesar de que tiene muy pocas características. Cada paquete front-end lo está usando. También hay una iniciativa para fusionar Bower en npm .

Bower está optimizado para el lado del cliente y solo admite árboles de dependencia planos, es decir, cada biblioteca debe usarse solo una vez (ya que es costoso enviar diferentes versiones de la misma biblioteca al cliente), y el usuario debe resolver las restricciones de dependencia .

Puede esperar encontrar cualquier cosa que esté relacionada con el front-end en el registro de Bower ( bower search <some keyword>); en mi opinión, esa es la mayor ventaja de Bower en relación con otros administradores de paquetes.

volo

Todavía no lo he usado durante más de 5 minutos en años. No lo sé, pero por lo que puedo ver , incluye alguna herramienta de compilación, que es muy familiar para los usuarios de Grunt.

npm

Sí, npm significa Node Package Manager. Pero hoy en día puedes usarlo para todo; la gente ya no solo hace npm installcosas y espera que funcionen solo en el entorno Node. Por ejemplo, hay muchos paquetes npm para Twitter Bootstrap .

Npm está optimizado para el uso del lado del servidor, con un árbol de dependencias anidado. Cada dependencia puede tener sus propias dependencias, que pueden tener las suyas propias, etc. Esta versión de dependencia eliminada entra en conflicto ya que cada dependencia puede usar su propia versión, por ejemplo, Underscore. Sin embargo, la próxima versión 3 de npm aplanará el árbol de dependencias :

Con npm @ 3, su directorio node_modules será mucho más plano. Todas sus dependencias y la mayoría de sus subdependencias (y (sub) + dependencias) se ubicarán una al lado de la otra en el nivel superior. Solo cuando haya conflictos se instalarán módulos en niveles más profundos. Esto debería facilitar mucho las cosas para los usuarios de Windows.

Algunas ventajas que veo al usar npm:

  • Es utilizado por todos los demás administradores de paquetes (componente, bower, volo, JSPM, etc.);
  • Permite usar scripts de compilación;
  • Hay muchas herramientas disponibles para introspección de paquetes basados ​​en npm

npm es el administrador de paquetes para JavaScript.

Captura de pantalla de npmjs.com


A partir de febrero de 2013, mi opinión era la siguiente. Por favor, no lo tenga más en cuenta.

npm

Es mejor seguir con él cuando está con un proyecto Node, también hay muy pocos proyectos disponibles para los navegadores ...

cenador

Bower es el chico pop en este momento. Tienen muchos proyectos bajo su capó, y a los encargados del proyecto les gusta mantenerlos actualizados en el registro de Bower ...

Es una pena que a veces esté un poco caído.

volo

No he probado el volo en más de 5 minutos desde entonces, pero por lo que pude ver parece ser más flexible que el bower.

Un punto negativo para volo es que sus proyectos están muy desactualizados.

gustavohenke
fuente
19
Hay miles de módulos en npm que funcionan solo en navegadores o funcionan tanto en el nodo como en los navegadores. Muchos de ellos incluso tienen insignias ci que le dicen exactamente en qué navegadores trabajan. La mayoría de las cosas en Bower y todo probablemente estén en npm.
subestimar
No entiendo la necesidad de un proyecto como ngBoilerplate para usar Bower mientras ya depende de npm para la instalación
lolski
55
¿Qué es un "chico pop"? Es "pop" una abreviatura. para "popular"?
Bryan Oakley
44
En su captura de pantalla, npm significa manual de planificación nuclear;)
Jim Jones
24

Parecen estar resolviendo el mismo problema pero para entornos / mundos diferentes. NPM para nodejs y volo, bower para el navegador.

La verdad es que puede usar NPM también para administrar javascript y css para el navegador. No hay nada que te impida hacerlo. En ese sentido, usar NPM me parece más natural que tener que administrar dos herramientas diferentes para el mismo propósito.

Parece que Bower tiene más paquetes disponibles, al menos para los más populares. Pero pronto jQuery también estará disponible en NPM directamente y probablemente todas las demás bibliotecas seguirán la misma tendencia.

En mi opinión, dado que existen herramientas como browserify y webmake , que ayudan a usar módulos de nodos en el navegador, ya no hay una necesidad real de bower o volo , a menos que ofrezcan algo más para usted (un módulo en particular existe solo en sus registros).

Tanto Volo como Bower también son buenos, pero desde mi punto de vista, si ya estás usando NPM, podría ser mejor seguirlo.

Tenga en cuenta que puede usar NPM para administrar las dependencias de sus clientes incluso sin usar browserify o webmake . En la mayoría de los proyectos en los que estoy trabajando, después de instalar los módulos npm, ejecuto un script para implementarlos en la ubicación donde los usa mi aplicación cliente. A veces uso gruñido para concatenar ese archivo con otros archivos js y, a veces, lo hago referencia directamente desde los archivos de plantilla de mis aplicaciones web. En cualquier caso, esta es una preferencia personal. Otros podrían encontrar que Bower o Volo son más fáciles de usar, ya que se ajustan más naturalmente a sus flujos de trabajo.

roy riojas
fuente
1
Es bueno tener soluciones competitivas para el mismo problema. ¿Alguna idea de por qué el yeomanproyecto eligió crear un nuevo administrador de paquetes cuando ya teníamos npm? (Era maduro, famoso y rico en características) Este pensamiento me hace sentir que todavía me falta el punto real.
Yugal Jindle
1
En realidad no, pero como dijiste algunas veces es divertido reinventar la rueda, solo porque puedes, y algunas veces al hacerlo, se hacen algunas mejoras al tratar de resolver el mismo problema. Realmente no es por qué eligen hacer uno nuevo, además de facilitar que los desarrolladores frontales encuentren paquetes. No todos los desarrolladores frontend tienen experiencia en nodos, supongo que esa es la razón principal detrás de proyectos como Bower. Intenta que sea más fácil para los usuarios que no son nodos, solo estoy adivinando aquí.
roy riojas
Supongo que querían separar la molestia npma favor de la simplicidad de la interfaz. Por lo tanto, para el desarrollo frontend.
Yugal Jindle
15

La gran ventaja de Bower sobre NPM es que su gestión de dependencia impone el uso de una única versión de un componente (mientras que NPM funciona al tener diferentes copias / versiones como subdependencias de diferentes módulos). Esto es MUY BUENO porque evita que el javascript del lado del cliente se hinche por la necesidad de incluir múltiples copias de un componente en diferentes versiones. La inclusión de múltiples copias de un módulo es fundamental para el funcionamiento de la gestión de dependencias de NPM, y por lo tanto, NPM es totalmente inadecuado para la gestión de paquetes del lado del cliente.

Una consecuencia de lo anterior es que los encargados de mantenimiento de paquetes y los consumidores tienen que ser más conscientes de mantener sus números de versión de dependencia para evitar conflictos, pero es un precio que vale la pena pagar. Y encuentro que los módulos NPM a menudo son descuidados en la emisión de versiones principales, menores y parches, por lo que la administración de dependencias NPM tampoco es exactamente una cama de rosas.

Wheresrhys
fuente
3
Esto solo es cierto si está sirviendo su código de interfaz directamente desde la carpeta en la que el administrador de paquetes puso esos archivos. En mi caso, tengo un script de compilación para procesar los archivos less / js o browserify para crear un paquete a partir de esos archivos. Entonces, ese no es realmente un gran problema en mi caso. El código que se distribuye siempre tiene las versiones correctas, incluso cuando otros subcomponentes pueden tener duplicados durante el desarrollo, nunca llegan a producción.
roy riojas
incluso si inadvertidamente necesita (como subdependencias) dos versiones diferentes de la misma dependencia? Creo que en este caso te equivocas
wheresrhys
Por lo general, no necesito módulos que no controlo, por lo que siempre serán los correctos ... si un módulo intenta inadvertidamente que un módulo dado salga de los calzados, la compilación fallará. No tiene sentido usar bower en mi caso, no se agregó ningún beneficio
roy riojas
Por lo tanto, npm solo se puede decir con seguridad para evitar la duplicación de módulos en su código del lado del cliente si tiene control de todo su árbol de dependencias. Este ciertamente no es el caso con la gran mayoría de las cosas en las que trabajo y probablemente no para la mayoría de los proyectos que usan un administrador de dependencias para incluir módulos del lado del cliente.
wheresrhys
1
A menos que esté trabajando en mashups, su árbol de dependencias no será tan complicado, al menos para el código de terceros. La mayoría de las bibliotecas js exportan un único global, por lo que con browserify-shim puede asegurarse de que puede usarlas desde el ámbito global, por lo tanto, siempre una versión que controle. Mi punto es que puede lograr lo mismo sin la necesidad de otro administrador de paquetes además del que ya tiene. Al final podría ser un asunto de preferencias. Siempre hay compromisos que hacer.
roy riojas
5

Sé que esto no está en el alcance de la pregunta, pero también hay otra alternativa. Jam JS - http://jamjs.org/ Una cosa interesante es que tiene capacidades de gruñido en jam:

jam compile output.js

Alguien debería crear otro administrador de paquetes y nombrarlo: yapm :)

Bruce Lim
fuente
55
Su deseo es concedido: github.com/rlidwka/yapm : P
alex
1
bueno, estaba pensando en el administrador de dependencia del lado del navegador, pero supongo que esto funciona para ambos: p Es por eso que no puedo hacer startups, todas mis ideas ya estaban pensadas.
Bruce Lim
@BruceLim sí, cada vez que creemos que tenemos una buena idea, siempre hay otras personas que ya la tienen.
Evan Hu