Ventajas de bundledDependencies sobre las dependencias normales en npm

83

npm nos permite especificar bundledDependencies, pero ¿cuáles son las ventajas de hacerlo? Supongo que si queremos estar absolutamente seguros de obtener la versión correcta incluso si se elimina el módulo al que hacemos referencia, ¿o quizás hay un beneficio de velocidad con la agrupación?

¿Alguien conoce las ventajas de bundledDependencieslas dependencias normales?

balupton
fuente
16
'Si esto se escribe "bundleDependencies", entonces también es honorable.' ¡Excelente documentación!
Colonel Panic
10
Y, sin embargo, de alguna manera, arreglarlo para que simplemente lea "también es un honor" se siente triste. En un aprieto, si le pido ayuda a un samurái o un caballero, definitivamente me gustaría que venga con armas y armaduras compatibles, y que sea honorable.
Jon Coombs
3
"Supongo que si queremos estar absolutamente seguros de obtener la versión correcta incluso si el módulo al que hacemos referencia se elimina" de repente tiene mucho peso: blog.npmjs.org/post/141577284765/kik-left-pad-and-npm
joews
1
Consulte también stackoverflow.com/questions/11459475/… .
Anon

Respuestas:

49

Uno de los mayores problemas en este momento con Node es qué tan rápido está cambiando. Esto significa que los sistemas de producción pueden ser muy frágiles y npm updatepueden romper cosas fácilmente.

El uso de bundledDependencies es una forma de solucionar este problema asegurándose, como supone correctamente, de que siempre entregará las dependencias correctas sin importar qué más pueda estar cambiando.

También puede usar esto para agrupar sus propios paquetes privados y entregarlos con la instalación.

Julian caballero
fuente
1
¿Cómo entrega siempre las dependencias correctas? ¿Esto significa npm updateque no afectará a ninguna dependencia en bundledDependencies?
Kevin Ghadyani
2
Sí correcto. Tenga en cuenta que las dependencias empaquetadas pueden no ser "correctas" de ninguna manera fundamental. Son exactamente lo que la persona que hizo agrupando SAID tenía razón.
Julian Knight
7
¡Quizás porque estás viendo una respuesta que tiene cinco años y medio ! La cantidad que Node.JS ha avanzado en ese tiempo es fenomenal. ¿Quizás le gustaría agregar algo útil como comentario?
Julian Knight
105

Para el lector rápido : este control de calidad se trata delcampo package.json bundledDependencies, no del paquete .

Que hacen las dependencias agrupadas

"bundledDependencies" es exactamente lo que implica su nombre. Dependencias que deberían estar dentro de tu proyecto. Entonces, la funcionalidad es básicamente la misma que las dependencias normales. También estarán empaquetados cuando estén en funcionamiento npm pack.

Cuando usarlos

Las dependencias normales generalmente se instalan desde el registro npm. Por tanto, las dependencias agrupadas son útiles cuando:

  • desea reutilizar una biblioteca de terceros que no proviene del registro npm o que fue modificada
  • desea reutilizar sus propios proyectos como módulos
  • desea distribuir algunos archivos con su módulo

De esta manera, no tiene que crear (y mantener) su propio repositorio npm, sino obtener los mismos beneficios que obtiene de los paquetes npm.

Cuando no usar dependencias empaquetadas

Sin embargo, al desarrollar, no creo que el punto principal sea evitar actualizaciones accidentales. Tenemos mejores herramientas para eso, a saber, repositorios de código (git, mercurial, svn ...) o ahora bloquear archivos.

Para anclar las versiones de su paquete, puede usar:

  • Opción 1: utilice la versión 5 de NPM más reciente que viene con el nodo 8. Utiliza un package-lock.jsonarchivo (consulte el blog del nodo y la versión del nodo 8)

  • Option2: use hilo en lugar de npm. Es un administrador de paquetes de facebook, más rápido que npmy usa un yarn.lockarchivo. De lo package.jsoncontrario, usa lo mismo .

Esto es comparable a los archivos de bloqueo en otros administradores de paquetes como Bundler o Cargo. Es similar a npm-shrinkwrap.json de npm, sin embargo, no tiene pérdidas y crea resultados reproducibles.

npmen realidad copió esa característica yarn, entre otras cosas.

  • Option3: este fue el enfoque recomendado anteriormente, que ya no recomiendo. La idea era usar la npm shrinkwrapmayor parte del tiempo y, a veces, poner todo, incluida la carpeta node_module, en su repositorio de código. O posiblemente use un paquete retráctil . Las mejores prácticas en ese momento se discutieron en el blog node.js y en los sitios web de desarrolladores joyent .

Ver también

Esto está un poco fuera del alcance de la pregunta, pero me gustaría mencionar el último tipo de dependencias (que yo sepa): dependencias entre pares . Consulte también esta pregunta de SO relacionada y posiblemente los documentos yarnsobre bundledDependencies .

nha
fuente
6
"incluida la carpeta node_module": es algo bastante extraño que contamina su repositorio con el código generado ... especialmente cuando está trabajando con módulos nativos ...
Oleksandr
@Olexandr Entre eso y el riesgo de que un paquete rompa tu aplicación, supongo que la elección es fácil. Tenga en cuenta que puede poner en una rama separada (si usa git, por ejemplo). De acuerdo, está lejos de ser una solución ideal.
nha
3
Recomendaría no verificar node_modules debido a paquetes como phantomjs, por ejemplo, que instalan el binario apropiado para el sistema actual. Esto significa que si un desarrollador ejecuta npm install en Linux y comprueba node_modules, no funcionará para otro desarrollador que clone el repositorio en Windows. Es mejor comprobar en los archivos comprimidos qué descargas de instalación de npm y apuntar npm-shrinkwrap.json a ellos. Puede automatizar este proceso con la npm install -g shrinkpackherramienta.
Jamie Mason
1
Gracias @nha, también estarás protegido de eso con shrinkpack, ya que los archivos tar del registro estarían en el repositorio de tu proyecto.
Jamie Mason
1
@fold_left sí, gracias por señalarlo (y por hacer el paquete retráctil). Solo estaba diciendo que todo esto podría haberse evitado si el registro npm actuara como un almacén de datos inmutable.
nha
22

Otra ventaja es que puede poner sus dependencias internas (componentes de la aplicación) allí y luego simplemente requerirlas en su aplicación como si fueran módulos independientes en lugar de saturar su lib / y publicarlos en npm.

Si / cuando están maduros hasta el punto de que podrían vivir como módulos separados, puede ponerlos en npm fácilmente, sin modificar su código.

Boris Egorov
fuente
3

Me sorprende no haber visto esto aquí ya, pero cuando se selecciona cuidadosamente, bundledDependenciesse puede usar para producir un paquete distribuible npm packque se ejecutará en un sistema donde npmno está configurado. Esto es útil si, por ejemplo, tiene un sistema que no está en red / no está en Internet: lleve su paquete a una memoria USB (o lo que sea) y descomprima el tarball, entonces npm runo node index.jsy simplemente funciona.

Tal vez haya una mejor manera de agrupar su aplicación para que se ejecute "sin conexión", pero si la hay, no la he encontrado.

Coderer
fuente
0

Operacionalmente, veo bundledDependencies como la tienda de módulos privados de un módulo, donde las dependencias son más públicas, resueltas entre su módulo y sus dependencias (y subdependencias). Su módulo puede depender de una versión anterior de, digamos, react, pero una dependencia requiere lo último y lo mejor. Su paquete / instalación dará como resultado su versión anclada node_modules/$yourmodule/node_modules/react, mientras que su dependencia obtendrá su versión node_modules/react(o node_modules/$dependency/node_modules/reactsi así lo desean).

Una advertencia: recientemente me encontré con una dependencia que no configuraba correctamente su dependencia en reaccionar, y haber reaccionado en bundledDependencies hizo que ese módulo dependiente fallara en tiempo de ejecución.

mushuweasel
fuente