La optimización en el desarrollo web es un pilar fundamental para garantizar un rendimiento elevado de nuestras aplicaciones. Webpack, una robusta herramienta de bundling, ofrece capacidades avanzadas para optimizar nuestros proyectos al comprimir CSS, JavaScript y optimizar imágenes. Descubramos cómo implementar estas mejoras utilizando las configuraciones de Webpack.
¿Qué herramientas necesitamos para empezar?
Para llevar a cabo la optimización, comenzaremos instalando unas dependencias esenciales:
CSS-minimizer-webpack-plugin: Este plugin utiliza cssnano debajo para minimizar nuestro CSS, haciéndolo más ligero para los navegadores.
Terser-webpack-plugin: Una herramienta eficaz para minificar JavaScript, reduciendo su tamaño sin comprometer su funcionalidad.
Y para instalarlas, ejecutamos el siguiente comando en nuestra terminal:
De esta forma, estamos configurando Webpack para minimizar tanto CSS como JavaScript en el proceso de build.
¿Cómo identificamos cada versión de nuestra build?
El uso de hashes para identificar builds únicas es fundamental para el control de versiones. Con Webpack, podemos integrar hashes en los nombres de nuestros archivos de salida:
Esto asegura que cada cambio en el código produce un nuevo archivo con un hash único, facilitando la gestión de caché y detectando cambios rápidamente.
¿Cómo trasladamos archivos a assets y qué ventajas ofrece?
El uso del hash se puede extender a otros recursos, como fuentes e imágenes, para garantizar una integración eficiente en el pipeline de despliegue. Cambiar la configuración para mover CSS a la carpeta assets además de adjuntarle un hash:
Con esto, cada archivo CSS genérico se trasladará a assets con su respectivo hash, facilitando el control sobre los cambios y actualizaciones necesarias tras cada build.
Probar y verificar optimizaciones
Utilizar comandos como npm run build o npm run dev nos permite observar los efectos de las optimizaciones realizadas. Es crucial revisar la carpeta dist para verificar la correcta estructura y minificación de nuestros archivos.
npm run build
Comprobando en el navegador que cada recurso está cargando correctamente, podemos confirmarnos efectivamente que la optimización ha sido exitosa. Utilizar herramientas como el inspector del navegador ayuda a visualizar si cada archivo se está utilizando apropiadamente según nuestras configuraciones.
Mantener optimizado tu proyecto es esencial, y aunque puede ser un desafío al principio, unos pocos ajustes en tu archivo de configuración de Webpack pueden marcar una gran diferencia. Continúa explorando y aplicando estos conceptos en tu workflow diario para obtener mejoras notables en el rendimiento de tus aplicaciones.
🤔 ¿Por qué es importante usar Hashes en nuestros archivos?
Los recursos que se guardan en memoria cache suceden cuando el navegador entra a un sitio por primera vez detecta los recursos y los guarda. Por ello la siguiente vez sera mucho más rápido porque estarán en memoria
La desventaja esta cuando sacamos una nueva versión, porque tendrán un mismo nombre evitando que se descargue los nuevos cambios, por lo tanto, el usuario no recibirá los nuevos cambios
Para que no haya conflictos con la cache una vez que tengamos nuestro proyecto en producción es importante darles un hash para cada nueva versión
muchas graias, no tenia claro para que son los hash
Como asi un hash para cada version nueva? :D a que te refieres
Segun la documentación oficial de webpack nos comunica que actualmente terser-webpack-plugin viene incluido desde webpack 5 :D
Fuente: TerserWebpackPlugin
Probando un poco más dentro del proyecto, para activar terser por defecto de webpack solo debemos usar el siguiente código
module.exports={...optimization:{minimize:true}}
Es decir que no podemos usar la propiedad minimizer: []. Pero si deseáramos personalizar la optimización y agregar plugins como ser css-minimizer-webpack-plugin ahi toca instalar y usar terser-webpack-plugin dentro de optimizations, otro caso de este tipo sería si desearas personalizar el plugin de terser
Interesante, gracias por el aporte Fernando.
Creo que no está bien explicado, como dijo otro usuario, dice lo que escribe, pero no fundamenta lo que hace, con este curso no aprendo a hacer cosas por mi mismo, no se como se configura, que plugin usar, donde buscarlo, como configurarlo, por que ese y no otro, dan por sabido muchas cosas que no sabemos, muy flojo el curso
Totalmente, el curso es solo una receta de pasos a seguir pero no explican nada
así son la mayoría de los cursos, no hay interacción con los alumnos, si tienes una duda o sale un error no puedes dirigirte a nadie no te ayudan en nada y cuando te contestan es demasiado tarde
🏗️ Optimización: hashes, compresión y minificación de archivos
Apuntes
Unos de las razones por que utilizamos webpack es porque nos permite optimizar y comprimir nuestro proyecto
Debes utilizar los siguientes paquetes
css-minimizer-webpack-plugin ⇒ Nos ayuda a comprimir nuestros archivos finales CSS
terser-webpack-plugin ⇒ Permite minificar de una mejor forma
Instalación
NPM
npm i css-minimizer-webpack-plugin terser-webpack-plugin -D
Creo que estos cursos están mal enfocados. El profesor se limita a narrar lo que está haciendo, pero no explica el detalle de lo que hace, lo cual hace al curso confuso, denso y poco amigable.
Estoy de acuerdo. Siento que avanzo, que puedo aprobar los exámenes (porque es cuestión de memoria), pero que no entiendo cuándo hay que abrir { (llaves) o cuándo hay que abrir [ (corchetes), o para qué estoy poniendo estas opciones en webpack.config.js, o en qué ocasiones tengo que usar webpack y cuándo no. Voy a seguir, porque busco en Youtube otros videos para enterarme, pero es muy frustrante.
Totalmente, me siento como si solo me estuviera diciendo que esta haciendo. Pero no me explica el porque, Lo que me ha funcionado es leer la documentación y ver videos en Youtube. Es muy frustrante ver que por youtube incluso se puede entender y saber más que aquí.
Optimizaciones
Desde Webpack 4, podemos correr optimizaciones a nuestra preferencia al escoger el mode
Wenpack 5 incorpora TerserWebpackPlugin que, si bien CssMinimizerWebpackPlugin optimiza la compresión de nuestros archivos CSS, Terser optimizará la compresión de archivos js.
El objeto optimization se enfoca en Terser por lo que tendremos:
optimization.minimize - para minimizar el bundle con TerserPlugin
optimization. minimizer - para sobreescribir la configuración por default de Terser y permitir el uso de varios minificadores
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin(),
new TerserPlugin()
],
},
};
jajajaj asi simple simple no lo es, lo mejor que se puede hacer es leer la documentación para entenderlo . saludos
Siento que se me mueren las neuronas al escuchar a este profesor. Curso totalmente nefasto.
MY NOTES FOR OPTIMIZATION WITH WEBPACK :D
RECURSOS OP
¿Por qué es importante usar Hashes en nuestros archivos?
Los recursos que se guardan en memoria cache suceden cuando el navegador entra a un sitio por primera vez detecta los recursos y los guarda. Por ello la siguiente vez sera mucho más rápido porque estarán en memoria
La desventaja esta cuando sacamos una nueva versión, porque tendrán un mismo nombre evitando que se descargue los nuevos cambios, por lo tanto, el usuario no recibirá los nuevos cambios
Para que no haya conflictos con la cache una vez que tengamos nuestro proyecto en producción es importante darles un hash para cada nueva versión
Segun la documentación oficial de webpack nos comunica que actualmente terser-webpack-plugin viene incluido desde webpack 5 😄
Fuente:
TerserWebpackPlugin
Probando un poco más dentro del proyecto, para activar terser por defecto de webpack solo debemos usar el siguiente código
module.exports={...optimization:{minimize:true}}
Es decir que no podemos usar la propiedad minimizer: []. Pero si deseáramos personalizar la optimización y agregar plugins como ser css-minimizer-webpack-plugin ahi toca instalar y usar terser-webpack-plugin dentro de optimizations, otro caso de este tipo sería si desearas personalizar el plugin de terser
Una de las cosas mas importantes por la cual utilizamos webpack es la optimización de nuestro proyecto, en comprimir nuestro css, nuestro javascript y optimizar nuestras imagenes, entre otras caracteristicas.
Vamos a instalar unas dependencias que nos ayudaran con esto
Ahora vamos a añadir nuestra configuración en nuestro archivo de webpack
//Importamos los plugins que acabamos de instalarconstCssMinimizerPlugin=require('css-minimizer-webpack-plugin');constTerserPlugin=requiere('terser-webpack-plugin');
Luego vamos a añadir esto a nuestro archivo como una nueva configuración llamada optimization
optimization:{minimize:true,minimizer:[//Instanciamos las dependencias que estamos importandonewCssMinimizerPlugin(),newTerserPlugin(),]}
Otra de las optimizaciones que podemos realizar para poder verificar las versiones que estamos trabajando tiene que ver mucho directamente con los hash
Asi que vamos a identificar cada bild de nuestro proyecto con un hash
añadimos los hash en output
output:{path: path.resolve(__dirname,'dist'),//cambios este elemento y le pondremos tanto el name para que lo identifique//como la parte del contenthash para que nos muestre esofilename:'[name].[contenthash].js',//para insertar el cambio y mover las fuentes a otra carpte lo hacemos aquiassetModuleFilename:'assets/image/[hash][ext][query]'},
Lo añadimos en la instancia de la dependencia que compila nuestro css
//Le anadimos una configuracion al plugin que nos permite compilar en cssnewMiniCssExtracPlugin({filename:'assets/[name].[contenthash].css'}),
Terminamos la configuracion y ahora compilamos webpack y podremos ver los archivos optimizados en dist/assets
Gran aporte solo me quede con la duda de que hace [query] en assetModuleFilename. Saludos
En este punto del curso, en la carpeta dist se han generado bastantes archivos, les recomiendo en cada build borrar la carpeta y volver a compilar
rm -rf dist &&npm run build
Hombre, si, una excelente práctica. Gracias
gran aporte, gracias
como le haces para hacer asi la aportación?
usa carbon
Es una lástima como Platzi desperdicia la experiencia y el conocimiento de Oscar. El profe es un excelente profesor, con muchos años de experiencia y muy didáctico al explicar un tema. El problema está en como enfocaron este curso. Si el curso fuese un curso práctico estaría bien que toque los conceptos por arriba y vaya narrando y mostrando como escribir una cofiguración. Pero el curso se supone, es un curso teórico en donde nos van a enseñar a usar webpack y sus conceptos. Justamente para eso está un profe, para enseñar, realizar analogías, metáforas, comparaciones, contar una anécdota TODO lo que sea necesario y mejor para explicar un concepto y volverlo más digerible. Si querían un narrador hubiesen contratado un locutor, le pasaban el guión y armaban el curso. Denle la libertad a Oscar que nos ENSEÑE y no que nos cuente lo que está haciendo en pantalla. PLATZI POR FAVOR LEAN LOS MENSAJES!!!! ESTE curso me pareció muy pobre. Aún así sigo eligiendo Platzi.
Cuál es la diferencia entre [hash] y [contenthash] ??? 👀
¡Hola Orlando! Supongamos que tenemos este archivo de configuración de webpack (resumido):
Primero vamos a aclarar los chunks, los chunks en este caso son los dos arreglos en nuestro entry point: index y vendors. Index es un trozo del código, vendors es otro. Cool.
Ahora la diferencia entre hash, contenthash y chunkhash:
hash: Cuando hacemos build del proyecto, ++todos los archivos van a tener el mismo hash ya que todos los archivos provienen del mismo build++. Si hacemos un cambio en un archivo, y volvemos a hacer build del proyecto, todos los archivos van a tener este nuevo hash. Sencillo, ¿no?
chunkhash: ++Todos los archivos pertenecientes al mismo chunk, van a tener el mismo hash++. En nuestro ejemplo los dos archivos del chunk "index" tienen un mismo hash y los archivos del chunk "vendors" tienen otro hash. Si hacemos cambios en un archivo del chunk index, estos van a tener un nuevo hash ++pero los del chunk vendors no++, y lo mismo sucede en caso contrario. ¿Me expliqué bien?
contenthash: Más fácil aún, ++cada archivo tendrá su propio hash ya que el hash es generado apartir del contenido del archivo++. Si un archivo sufre un cambio, solo este archivo tendrá un nuevo hash.
Espero mi respuesta te sea de utilidad :D
Oye excelente tu explicación! Muchas Gracias de verdad 😅 tenía mucho tiempo sin saber la diferencia entre ambos, y aún mejor porque no recordaba que exitiera [chunckhash].
Entonces la utilización de uno u otro tipo de hash radicaría en la preferencia del desarrollador en cuestión?. Yo por lo menos siempre utilizo [contenthash].
Gracias de nuevo 💚🤘😎
No veo necesario ponerle el contenthash a las fuentes ya que rara vez se actualizan
No sé ni que estoy copiandoxd
Webpack, que ya es difícil aprender cada cosa. Y este tipo de explicaciones, así tan sencilla y simple, quedo con muchas dudas. muchos diran: Tienes la documentación, Ok!
.
Pero los fundamentos son importante para aprender todo a la perfección. No se, si debería tomar un curso antes que este?? Estoy un poco perdido con esta clase!
CssMinimizerPlugin
Es un plugin que nos permite minificar y optimizar los archivos CSS, por dentro del plugin utiliza una herramienta llamada cssnano
Documentación de CssMinimizer
TerserWebpackPlugin
Es otro plugin que nos minifica nuestro javascript
Documentación de TerserPlugin
todo bien hasta que se empezaron a guardar mis fuentes con hash en la carpeta images en dist y no funcionan al visualizar la página. como podría solucionarlo?, están los archivos igual al de los recursos.
Quizá haya que cambiar la expresión regular, la extensión o limpiar caché de Node
Probaste canbiado la expresion regular?
Todo ha salido bien siguiendo los pasos y las explicaciones durante el curso. Pero también desde el inicio estuve leyendo la documentación en cada proceso de instalación y configuración entendiendo por qué se usó tal sintaxis o por qué se hacen tales cambios, además, gracias a la comunidad muchas veces me ahorré tiempo buscando soluciones. Esperemos que todo siga genial = D
Para poder optimizar de forma correcta el proyecto es necesario instalar algunas dependencias más para minimizar código, estas son css-minimizer-webpack-plugin y terser-webpack-plugin.
Para instalarlos usa el comanod npm i css-minimizer-webpack plugin terser-webpack-plugin -D.
Y al igual que con cualquier plugin hay que agregarlos a la configuración de Webpack, creando una constante para cada uno y luego añadiéndolos a la sección de optimization.
Otra optimización que se puede hacer es añadir un hash a cada versión de la app. Esto lo hacemos con cada archivo que se genera en la build.
La lina para instalar es:
npm i css-minimizer-webpack-plugin terser-webpack-plugin -D