Entonces, estás ejecutando npm install y te vas a tomar una taza de café, y luego vuelves y no tienes idea o tal vez ni te importa lo que npm hizo durante este tiempo.
Entonces, mi nombre es Tali Barak. Trabajo para Youbeek y déjame contarte sobre la vida secreta de los gestores de paquetes. Esto es lo que sucede en tu proyecto, esto es lo básico de npm. Entonces, tienes tu proyecto y necesitas un paquete llamado foo. Entonces, estás ejecutando npm install foo y eso agrega npm install a tu package.json y crea una carpeta node_modules en tu proyecto y coloca el código de foo dentro de ella. Pero, ¿qué pasa si foo requiere buzz? Ok, no hay problema. Creará otra carpeta node_modules debajo de foo y colocará buzz allí. ¿Y si buzz requiere bugs? Bueno, lo mismo. Lo colocará y lo agregará allí. Y ¿qué sucede si tanto foo como bar requieren buzz? En este caso, en la implementación ingenua de npm, tendrás dos paquetes de buzz en el mismo proyecto. Y esto crea toda la estructura de tu sistema de archivos que replica la estructura de paquetes que tienes en tu proyecto. Y esto fue bueno, pero creó algunos problemas. Por ejemplo, hizo que tus node_modules fueran enormes. También creó un problema con las dependencias circulares. Eso significa que si foo necesitaba buzz, que necesitaba buzz, que necesitaba buzz, que necesitaba bar nuevamente, que necesitaba buzz y necesitaba buzz, entrarías en un bucle infinito. Y esto, por cierto, es bastante común. No es tan raro como podrías pensar. Otro problema común es con los singletons. Si necesitas una única instancia de un cierto paquete, como el paquete debug, por ejemplo, en esta estructura tendrías múltiples instancias, y eso puede causar errores cuando ejecutas los paquetes. Y el último ya no está con nosotros. Gracias a Dios por eso. Era un problema de Windows 8 que la ruta del archivo estaba limitada a 256 caracteres. Esto es menos común.
Entonces, ¿qué hizo NPM para resolver eso? Decidieron hacer una deduplicación de los paquetes que estaban duplicados. Entonces, en lugar de tener buzz dos veces, lo colocarían en el nivel más alto posible y lo usarían allí. Y la razón por la que esto funcionó es debido a la forma en que Node requiere los paquetes. Entonces, si buzz necesitaba buzz, iría debajo de la carpeta node_modules de Node y lo buscaría. Si no lo encuentra, subirá un nivel y buscará un tercero.
Comments