¿Cómo importar imágenes de manera eficaz en proyectos con Webpack?
Importar imágenes correctamente en un proyecto es crucial para una óptima gestión de recursos. Hoy exploraremos cómo trabajar con imágenes mediante importaciones directas en Webpack, dejando atrás métodos más rudimentarios de manejo de ficheros. Este enfoque no solo facilita la organización del proyecto sino que también optimiza la forma en que se utilizan las imágenes.
¿Qué es el asset module de Webpack?
Webpack ofrece la funcionalidad de asset module, una forma eficiente de manejar archivos estáticos sin necesidad de loaders adicionales. Al integrarse directamente en la configuración de Webpack, asset module permite importar imágenes como recursos y optimizarlas automáticamente.
Implementación de asset module
Para comenzar, es necesario establecer unas reglas en el archivo de configuración de Webpack:
module.exports={module:{rules:[// Regla para manejo de CSS ya existente{test:/\.png$/,type:'asset/resource'}]}}
Esta regla indica a Webpack que trate los archivos .png como recursos, permitiendo su importación directa en el código JavaScript.
¿Cómo importar imágenes en el proyecto?
Con la configuración de Webpack lista, el siguiente paso es importar las imágenes como variables:
Con estas modificaciones, el código se vuelve más legible y se facilita el mantenimiento. Las imágenes se cargan y optimizan automáticamente, ofreciendo mejoras significativas en rendimiento.
¿Cómo verificar que nuestra configuración funciona?
Una vez implementados los cambios, es importante verificar que funcionan correctamente:
Ejecuta Webpack en modo desarrollo:
Utiliza el comando npm run dev para compilar el proyecto en modo desarrollo.
Valida la salida de dist:
Revisa la carpeta de distribución para asegurarte de que las imágenes se están gestionando correctamente, ya sea con hash o vinculadas adecuadamente en el proyecto.
Prueba el proyecto:
Abre el proyecto en un navegador usando herramientas como Live Server para confirmar que las imágenes se muestran correctamente y observa cómo Webpack optimiza cada archivo con un hash único, mejorando el rendimiento.
¿Qué ventajas ofrece este método?
Optimización automática: Las imágenes se optimizan al generar un hash único, mejorando su uso en producción.
Facilidad de mantenimiento: El código es más limpio y entendible al usar variables, lo cual ayuda en la gestión de grandes proyectos.
Integración sencilla: Con apenas unas líneas en la configuración, es posible habilitar esta funcionalidad para diferentes tipos de archivos.
Este método es un paso hacia proyectos más organizados y eficientes, al reducir la carga manual en la gestión de recursos y potenciando el rendimiento del proyecto. Si buscas un flujo de trabajo profesional, considerar el uso de asset module en Webpack es un recurso valioso que no querrás pasar por alto. ¡Continúa explorando cómo mejorar tus proyectos y mejora en cada iteración!
Loader de imágenes
Este loader nos permite importar de forma dinámica en nuestros archivos JavaScript imágenes, el loader le genera un hash unico para cada imagen. Algo parecido sucede con ReactJS al importar imágenes
Configuración
Al final de las rules
{test:/\.png/,type:'asset/resource'}
Correcto. Además en Webpack 5 el módulo se encuentra incorporado. Donde antes, teníamos que incorporar los loaders url-loader y file-loaders a la descripción del módulo
Por si depronto les sale error no es assets/resource sino asset :D
{test:/\.png/,type:'asset/resource',},
si funciono gracias, pero ahora necesito saber el por que?
Al usar asset/resource estamos accediendo al Asset module de webpack que incluye file-loader (el que estamos usando ahora) y otros loader para el manejo de archivos como images, fuentes, iconos, etc...
El asunto es que: para poder usar este modulo de webpack debe de ponerse a regla la palabra asset. si quieren saber más lean aquí
¿Que ventaja, utilidad o uso tiene ponerle hash a las imágenes?
Evita que dos imágenes con el mismo nombre y extensión colisionen y se sobre escriban.
Rompes el caché del navegador. Eso significa que si modificas algún icono en la carpeta assets y le dejas mismo nombre que tenia, cuando sea publicado obligas al navegador a mostrar la última versión que subiste, por que el nombre de la imagen en la carpeta dist va a ser totalmente diferente,
Una advertencia a todos los que siguen apuntes de los comentarios: no siempre están bien. Úsenlos de guía (pueden incluso copiarlos en un documento de Google Drive o en su Notion), pero luego investiguen la documentación, comparen con otros comentarios, lo que dice el profesor/a, otros cursos sobre el mismo tema... Esto les ayudará a mejorar los apuntes de cada clase. Saber programar lleva su tiempo (al menos a mi me lo está llevando) y es importante saber el porqué de cada cosa o, al menos, intuir porqué se está haciendo determinada cosa. Asentar conocimiento, tener tus propios apuntes, sacar tus propias conclusiones, te hará mejor en cualquier trabajo. Ánimos.
totalmente de acuerdo compañero 🔥
Pasé toda la tarde de este lindo sábado tratando de encontrar la manera de usar una imagen en un archivo css, como background-image: url(./tuimagen.png)
Para ello se debe poner esta regla:
{
test: /.(png|svg|jpg|jpeg|gif)$/i,
type: "asset/resource",
},
Al momento de correr npm run build se va a generar una imagen en nuestra carpeta raiz (dist) con un nombre raro alfa-numerico.
En nuestro archivo main.css va a parecer el enlace a esa imagen considerando el nuevo nombre raro alfa-numérico.
Para mayor información revisen la lectura recomendada.
"3 horas de debugging te ahorran 30 minutos de leer la documentación"
Excelente, muchas gracias por el porte compañero
Tus posibles dudas resueltas:
1. ¿Por qué en esta ocasión no usamos un testy un use como antes?
Esta es otra forma de copiar las imágenes. Esto se hace mediante el asset management que tiene webpack. Se nos indica que la sintaxis es la siguiente:
test: recibe los formatos de imágenes a procesar
type: Puede tener distintos valores y se refiere al tipo de loader que reemplaza en webpack. Por ejemplo asset-resource indica que se va a reemplazar el loader que se usaba antes: file-loader. Y la función es exportar la url completa o ruta completa hacia la imagen. Esto es posible porque al importarlas, las volvemos dependencias y con ello se pueden agregar al gráfico de dependencias.
.
Para saber qué otros typepuedes introducir, puedes leer el siguiente artículo: ****
.
2. Por qué cambió el nombre de las imágenes de salida?
Por defecto, el typeque utilizamos (asset/resource) exporta las imágenes con el nombre: [hash][ext][query].
hash: Número aleatorio.
ext: extensión
query: utilizado para dar parámetros adicionales.
¿Se puede cambiar esto? Sí, así es. Puedes hacerlo en la parte de module.exports.output, agregando/modificando assetModuleFilename:
Solo tienes que cambiar tu expresión regular en el test para trabajar con diferentes formatos: /\.(png|svg|jpg|jpeg|gif)$/i.
Un saludo.
Gracias Sneyder
Por si estás un poco perdido con el tema de los hash te dejo este enlace =)
¿Qué es un hash y cómo funciona?
Heroe sin capa, gracias
lei el articulo y veo que el hash se usa como forma de autentificacion y seguridad
¿Que ventaja tiene en estas imagenes van a ser de uso publico y no necesariamente protegidas?
¿Ese hash que se generó en las imágenes tengo entendido que es para dar seguridad... pero por qué? ¿qué logramos con darle esa seguridad?
Así evitamos que a través de un inspector puedan acceder a las ima
imágenes completas, esto es útil cuando son fotos con derechos de autor por ejemplo.
Y yo estaba aprendiendo webpack para poder quitarle el hash XD
Se vé muy lindo, pero tener todo junto lo que hicimos en una clase entera en una UI que parece una terminal... no sé a quién le servirá.
Genera mas confusión que otra cosa 🤷🏻♂️
Hola santu, yo pongo lo que a mi me sirve y si me sirve a mi se a que alguien mas también.
Entiendo lo de importar la imagen, sin embargo, el proceso puede volverse un poco repetitivo y nada eficiente cuando hablamos de muchas imagenes, en el ejemplo fueron 3, habrá forma de que este proceso se pueda automatizar ?
Tomensen su tiempo en leer y aprender cada cosa. El curso lo veo por tercera vez, porque antes hacia un copy past y ahora (recien ahora) trato de entender el que de para que de cada cosa. Si van a modo copy past como si fuera una carrera en terminar rapido el curso, cuando esten mas adelante, y vean conceptos mas complejos de React, no van a entender nada. No van a recordar nada.
Si quieren terminar rapido los cursos, constancia, y mucha disciplina. Cada hora de oscio que dedican al dia es una hora menos de aprender. Aunque tambien es importante descansar.
Acuerdensen. Esto no es una carrera. Los quiero,
FORZA STUDENTI
Holaa, estoy medio perdido con el curso, siento que va muy muy rápido y utiliza cosas que no se para a explicar parte por parte que es y porque lo usamos.
A lo mejor soy yo que si no sé qué es todo lo que estoy haciendo es como que no lo termino de entender, sigo al profesor con lo que explica y al final en mi computadora funciona, pero nose porque se hace de esta manera.
¿Me hace falta hacer algún curso antes de venir a este?
Veo al profesor que explica como si uno ya supiera que es lo que él está haciendo, entonces me hace pensar que hay algo que no aprendí antes de entrar en este curso
Hay algo que no me queda claro, ¿Ahora tenemos duplicadas nuestras imágenes en dist con un hast y en la carpeta assets/images?
De manera parcial queda resuelto en la siguiente clase 😅
Cuál es la diferencia entre hacer todo esto y asignarle la ruta en una variable o constante?
ej.