Cuando se usan frameworks Javascript, como ExtJS o YUI, en la capa de presentación de una aplicación web nuestro navegador debe descargar todo el Javascript antes de poder mostrar nada. Esto se traduce en un tiempo de espera, por parte del usuario, en ocasiones demasiado largo. Una medida, como otras muchas, de calidad del software, es la satisfacción del usuario final en cuanto a rendimiento de la aplicación, y por tanto debe ser tenida en cuenta durante el proceso de SQA.
Una solución a este problema es la aplicación conjunta de dos métodos: compresión/ofuscado (minify) y uso de un solo fichero que contiene todo el Javascript. De esta forma el navegador sólo debe hacer una llamada para descargar un fichero comprimido, y no decenas de llamadas para descargar cada pequeño fichero Javascript (sin comprimir).
Este proceso puede hacerse a mano, usando herramientas como YUI Compressor, o automatizarlo durante el ciclo de vida de nuestro proyecto Maven. El plugin Maven YUI Compressor hace uso de la herramienta citada anteriormente para integrar este proceso durante el empaquetado de la aplicación web.
La configuración que requiere el plugin en el pom es la siguiente:
<plugins>
<plugin>
<groupId>net.sf.alchim</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<version>0.7.1</version>
<executions>
<execution>
<goals>
<goal>compress</goal>
</goals>
<phase>generate-sources</phase>
</execution>
</executions>
<configuration>
<nosuffix>false</nosuffix>
<jswarn>false</jswarn>
<preserveStringLiterals>true</preserveStringLiterals>
<preserveAllSemiColons>true</preserveAllSemiColons>
<nomunge>true</nomunge>
<failOnWarning>false</failOnWarning>
<sourceDirectory>${basedir}/src/main/webapp/public</sourceDirectory>
<outputDirectory>${project.build.directory}/compressed/public</outputDirectory>
<aggregations>
<aggregation>
<includes>
<include>**/*-min.js</include>
</includes>
<output>
${project.build.directory}/${project.artifactId}-${project.version}/public/scripts/todo-el-javascript.js
</output>
</aggregation>
</aggregations>
</configuration>
</plugin>
</plugins>
Esta configuración realizará las siguientes tareas:
- Comprimir/ofuscar (minify) cada fichero Javascript generando un fichero [nombre_original]-min.js
- Colocar el código comprimido en target/compressed/public
- Unir todos los ficheros ofuscados (*-min.js) en uno: todo-el-javascript.js
- Colocarlo en target/[artifact]-[version]/public/scripts
En el proyecto que he usado como ejemplo se ha conseguido reducir en un 40% el tamaño total en bytes del código Javascript que el navegador debe descargar, a esto hay que sumarle la ganacia en tiempo que se produce al descargar un solo fichero con una sola petición.
Este plugin además ofrece otra funcionalidad, el análisis estático del código usando Jslint, pero esto será tratado en otra entrada futura ;)