javascript - tutorial - node js package manager




¿Cuál es la diferencia entre Bower y npm? (6)

¿Cuál es la diferencia fundamental entre npm y npm ? Solo quiero algo sencillo y simple. He visto a algunos de mis colegas usar bower y npm indistintamente en sus proyectos.


Actualización de octubre-octubre

Bower finalmente ha sido deprecated . Fin de la historia.

Respuesta anterior

De Mattias Petter Johansson, desarrollador de JavaScript en Spotify :

En casi todos los casos, es más apropiado usar Browserify y npm sobre Bower. Es simplemente una mejor solución de empaquetado para aplicaciones front-end que Bower. En Spotify, usamos npm para empaquetar módulos web completos (html, css, js) y funciona muy bien.

Bower se marca a sí mismo como el gestor de paquetes para la web. Sería increíble si esto fuera cierto: un administrador de paquetes que mejoró mi vida como desarrollador de aplicaciones sería increíble. El problema es que Bower no ofrece herramientas especializadas para este propósito. No ofrece NINGUNA herramienta que yo sepa que npm no, y especialmente ninguna que sea específicamente útil para desarrolladores front-end. Simplemente, no hay ningún beneficio para un desarrollador de aplicaciones para usuario de usar Bower sobre npm.

Debemos dejar de usar bower y consolidar alrededor de npm. Afortunadamente, eso es lo que está sucediendo :

Con browserify o webpack, se vuelve súper fácil concatenar todos sus módulos en grandes archivos minificados, lo que es increíble para el rendimiento, especialmente para dispositivos móviles. No es así con Bower, que requerirá mucho más trabajo para obtener el mismo efecto.

npm también le ofrece la posibilidad de usar múltiples versiones de módulos simultáneamente. Si no ha hecho mucho desarrollo de aplicaciones, esto inicialmente podría parecerle algo malo, pero una vez que haya pasado por algunos episodios de Dependencia, se dará cuenta de que tener la capacidad de tener múltiples versiones de un módulo es bastante difícil gran característica Tenga en cuenta que npm incluye una herramienta de deduplicación muy útil que se asegura automáticamente de que solo use dos versiones de un módulo si realmente tiene que hacerlo; si dos módulos pueden usar la misma versión de un módulo, lo harán. Pero si no pueden , tienes una muy útil.

(Tenga en cuenta que se Webpack que Webpack y el Webpack rollup son mejores que Browserify a partir de agosto de 2016).


Bower mantiene una única versión de los módulos, solo intenta ayudarte a seleccionar la correcta / mejor para ti.

Gestión de la dependencia de Javascript: npm vs bower vs volo?

NPM es mejor para módulos de nodo porque hay un sistema de módulos y está trabajando localmente. Bower es bueno para el navegador porque actualmente solo existe el alcance global y desea ser muy selectivo con la versión con la que trabaja.


Encontré esta explicación útil en http://ng-learn.org/2013/11/Bower-vs-npm/

Por un lado, npm se creó para instalar módulos utilizados en un entorno node.js, o herramientas de desarrollo creadas utilizando node.js, como Karma, pelusa, minificadores, etc. npm puede instalar módulos localmente en un proyecto (por defecto en node_modules) o globalmente para ser utilizado por múltiples proyectos. En proyectos grandes, la forma de especificar dependencias es creando un archivo llamado package.json que contenga una lista de dependencias. Npm reconoce esa lista cuando ejecuta npm install, que luego los descarga y los instala por usted.

Por otro lado, Bower fue creado para administrar sus dependencias frontend. Bibliotecas como jQuery, AngularJS, guiones bajos, etc. Similar a npm, tiene un archivo en el que puede especificar una lista de dependencias llamada bower.json. En este caso, las dependencias de frontend se instalan ejecutando bower install, que de forma predeterminada las instala en una carpeta llamada bower_components.

Como puede ver, aunque realizan una tarea similar, están dirigidos a un conjunto muy diferente de bibliotecas.


Esta respuesta es una adición a la respuesta de Sindre Sorhus. La principal diferencia entre npm y Bower es la forma en que tratan las dependencias recursivas. Tenga en cuenta que se pueden utilizar juntos en un solo proyecto.

Preguntas frecuentes sobre las NPM : (archive.org enlace desde el 6 de septiembre de 2015)

Es mucho más difícil evitar conflictos de dependencia sin dependencias de anidamiento. Esto es fundamental para la forma en que funciona npm, y ha demostrado ser un enfoque extremadamente exitoso.

En la página principal de Bower :

Bower está optimizado para el front-end. Bower utiliza un árbol de dependencia plano, que requiere solo una versión para cada paquete, lo que reduce la carga de la página al mínimo.

En resumen, npm apunta a la estabilidad. Bower apunta a una carga de recursos mínima. Si dibuja la estructura de dependencia, verá esto:

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

Como se puede ver instala algunas dependencias recursivamente. La dependencia A tiene tres instancias instaladas!

Cenador:

project root
[bower_components] // default directory for dependencies
 -> dependency A
 -> dependency B // needs A
 -> dependency C // needs B and D
 -> dependency D

Aquí se ve que todas las dependencias únicas están en el mismo nivel.

Entonces, ¿por qué molestarse en usar npm?

Tal vez la dependencia B requiere una versión diferente de la dependencia A que la dependencia C. npm instala ambas versiones de esta dependencia para que funcione de todos modos, pero Bower le dará un conflicto porque no le gusta la duplicación (porque cargar el mismo recurso en una página web es Muy ineficiente y costoso, también puede dar algunos errores graves). Tendrás que elegir manualmente qué versión quieres instalar. Esto puede tener el efecto de que una de las dependencias se romperá, pero eso es algo que deberá corregir de todos modos.

Por lo tanto, el uso común es Bower para los paquetes que desea publicar en sus páginas web (por ejemplo, tiempo de ejecución , donde evita la duplicación), y utiliza npm para otras cosas, como pruebas, construcción, optimización, verificación, etc. (por ejemplo , tiempo de desarrollo). , donde la duplicación es de menor preocupación).

Actualización para npm 3:

npm 3 todavía hace las cosas de manera diferente en comparación con Bower. Instalará las dependencias globalmente, pero solo para la primera versión que encuentre. Las otras versiones se instalan en el árbol (el módulo principal, luego node_modules).

  • [node_modules]
    • dep A v1.0
    • dep B v1.0
      • dep A v1.0 (usa la versión de root)
    • dep C v1.0
      • dep A v2.0 (esta versión es diferente de la versión raíz, por lo que será una instalación anidada)

Para más información, sugiero leer los documentos de npm 3


Para muchas personas que trabajan con node.js, una de las principales ventajas de Bower es la gestión de dependencias que no son javascript en absoluto. Si están trabajando con lenguajes que se compilan a javascript, npm puede usarse para administrar algunas de sus dependencias. sin embargo, no todas sus dependencias serán módulos de node.js. Algunos de los que compilan en javascript pueden tener una extraña manipulación específica del lenguaje de origen que hace que pasarlos de compilado a javascript sea una opción poco elegante cuando los usuarios esperan el código fuente.

No todo en un paquete npm tiene que ser un javascript para el usuario, pero para los paquetes de biblioteca npm, al menos parte debería ser.


Todos los gestores de paquetes tienen muchas desventajas. Sólo tienes que elegir con qué puedes vivir.

Historia

npm comenzó a administrar los módulos de node.js (es por eso que los paquetes entran en node_modules de forma predeterminada), pero también funciona para el front-end cuando se combina con Browserify o Browserify .

Bower se crea únicamente para el front-end y se optimiza con eso en mente.

Tamaño de repo

npm es mucho, mucho más grande que bower, incluyendo JavaScript de propósito general (como country-data de país para información de país o sorts para funciones de clasificación que se pueden usar en el extremo frontal o el extremo trasero).

Bower tiene una cantidad mucho menor de paquetes.

Manejo de estilos etc

Bower incluye estilos, etc.

npm se centra en JavaScript. Los estilos son descargados por separado o requeridos por algo como npm-sass o sass-npm .

Manejo de dependencias

La mayor diferencia es que npm hace dependencias anidadas (pero es plana por defecto), mientras que Bower requiere un árbol de dependencia plano (coloca la carga de la resolución de dependencia en el usuario) .

Un árbol de dependencias anidado significa que sus dependencias pueden tener sus propias dependencias que pueden tener las suyas, y así sucesivamente. Esto permite que dos módulos requieran versiones diferentes de la misma dependencia y aún funcionen. Tenga en cuenta que a partir de npm v3, el árbol de dependencias será plano por defecto (ahorrando espacio) y solo se anidará donde sea necesario, por ejemplo, si dos dependencias necesitan su propia versión de subrayado.

Algunos de los proyectos que usan ambos es que usan Bower para paquetes front-end y npm para herramientas de desarrollador como Yeoman, Grunt, Gulp, JSHint, CoffeeScript, etc.

Recursos







bower