Debido a un error al minimizar una hoja de estilos me dediqué en estos días a investigar el tema. Estas son las conclusiones a las que he arribado.
Hace años que utilizo YUI compressor para minimizar las hojas de estilos y javascript. Los resultados son muy buenos, sin embargo, para mis fines tiene la desventaja de estar escrito en java, lo que significa que debe ejecutarse a través de la shell, esto lo vuelve algo lento e inaccesible en muchos servidores. A su vez, hace bastante tiempo que no se han corregido sus pocos errores y uno termina lidiando con ellos.
Me pasó en estos días de cruzarme con este error, lo que me llevó a investigar alternativas. Lo primero que hice, fue dividir en mi código los motores que iban a minimizar las hojas de estilo y javascript, luego me lancé a las pruebas.
Para los estilos, me decidí por algunas expresiones regulares. No realizan lo máximo posible, pero sí lo mínimo esperable.
El javascript fue más desafiante y anticipo que una vez más tuve que recurrir a Douglas Crockford. Comencé con algunas librerías que implementaban JSMin en php. No me gustaron e hice la mía.
Una vez funcionando mi librería, encontré una que usaba expresiones regulares, si bien no cumplía todas las reglas, me pareció interesante y le hice una prueba de rendimiento. La velocidad de ejecución me dejó asombrado.
Acá debo hacer una pausa y explicar que el rendimiento de esta librería resulta importante para nuestro framework, ya que ésta se utiliza en las actualizaciones, que de por sí realiza muchos procesos.
Volvamos al tema, hice mi librería utilizando expresiones regulares y los resultados en rendimiento son tan contundentes que no me animo a mostrarlos.
Conclusión
Acá hubo una gran verdad que no tuve en cuenta: realizar un proceso complejo en un lenguaje de bajo nivel, como en el que intervienen las expresiones regulares, es más rápido que hacerlo, aún de forma sencilla, en un lenguaje de alto nivel. Basarse en el código de JSMin para implementarlo en php era un caso perdido.
Cómo sigo de aquí en más, para mis hojas javascript continuo con YUI compressor, para el framework me quedo con mis librerías y seguiré mejorándolas.
Links a algunas librerías probadas
- https://github.com/rgrove/jsmin-php
- https://github.com/matthiasmullie/minify
- https://github.com/tchwork/jsqueeze
- https://gist.github.com/Rodrigo54/93169db48194d470188f