Comprimir CSS, HTML y JS con Grunt.js
Grunt.js Wallpaper por J. Albert Bowden II. CC BY. Imagen con calidad y tamaño reducidos.
En este tutorial explicaremos cómo comprimir archivos CSS, HTML y JS usando algunos plugins para Grunt.js. Comprimir CSS, HTML y JS es algo muy necesario en el desarrollo de sitios web hoy en día.
Grunt.js es una utilidad de Node.js que permite automatizar la ejecución de tareas administrativas en un proyecto de software. Es muy similar en su funcionamiento a Ant, su contraparte en Java.
Con Grunt.js es posible automatizar tareas cómo generar CSS a partir de LESS/SCSS o comprimir archivos CSS, HTML y JS usando gzip.
Al tener que descargar menos bytes, un navegador web podrá mostrar una página web en menos tiempo, mejorando la experiencia del usuario en nuestro sitio y como consecuencia nuestro posicionamiento en los buscadores como Google o Bing.
Los archivos package.json y Gruntfile.js
Para poder usar Grunt.js necesitaremos crear dos archivos en el
directorio raíz de nuestro proyecto: packages.json
y Gruntfile.js
. El
archivo packages.json
lo usa Node.js para verificar las dependencias de
nuestro proyecto y así poder instalar los paquetes que hagan falta. Este
archivo es muy similar al archivo setup.py
en el ambiente Python.
{
"name": "nombre_proyecto",
"version": "0.0.0",
"description": "Descripción del proyecto",
"main": "index.js",
"author": "Nombre Del Autor"
}
El archivo Gruntfile.js
lo usa Grunt.js para saber que tareas se deben
ejecutar y en que orden. Para cada tarea se especifican los archivos que se
desean comprimir y la ubicación de destino, además del nombre, para los
archivos ya comprimidos. Más adelante se dará una explicación detallada sobre
cómo escribir las tareas.
Al crear los archivos, el directorio del proyecto debe verse así:
mi_proyecto/
Gruntfile.js
package.json
Instalación de Grunt.js
Para poder instalar Grunt.js, debemos tener instalado Node.js en nuestra computadora.
Enseguida debemos instalar Grunt.js de forma global en nuestra computadora. Para esto abrimos una terminal y ejecutamos el siguiente comando:
>> Aplica para cualquier sistema UNIX (Linux, BSD, OS X) con Node.js
>> instalado
$ sudo npm install -g grunt-cli
Instalación del plugin para Grunt.js
Para este tutorial necesitamos instalar el plugin grunt-contrib-compress
:
>> Aplica para cualquier sistema UNIX (Linux, BSD, OS X) con Node.js
>> instalado
$ npm install grunt-contrib-compress --save-dev
La opción --save-dev
permite guardar automáticamente el nombre y la versión
del plugin que estamos instalando en el archivo packages.json
, dentro de la
sección devDependencies
.
De esta forma, si tenemos que reinstalar el proyecto desde cero o deseamos
instalar nuestro proyecto en otra computadora, solo tenemos que ejecutar npm
install
dentro del directorio raíz para instalar todas las dependencias.
En el archivo package.json
debe verse algo así como esto:
{
"devDependencies": {
"grunt-contrib-compress": "^0.13.0"
}
}
Configuración de la tarea para comprimir CSS, HTML y JS
En el archivo Gruntfile.js
debemos agregar la configuración de las tareas que
queremos que Grunt.js ejecute automáticamente. Todo archivo Gruntfile.js
debe tener las siguientes líneas de código:
module.exports = function (grunt) {
// El codigo de configuracion de las tareas va aqui.
}
Para configurar la tarea que va a comprimir CSS, HTML y JS, agregamos las siguientes líneas:
grunt.initConfig({
pkg: grunt.file.readJSON("package.json"),
compress: {
options: {
mode: 'gzip'
},
css: {
files: [
{
expand: true,
cwd: "./directorio_origen/",
src: ["**/*.css"],
dest: "./directorio_destino/"
}
]
},
html: {
files: [
{
expand: true,
cwd: "./directorio_origen/",
src: ["**/*.html"],
dest: "./directorio_destino/"
}
]
},
js: {
files: [
{
expand: true,
cwd: "./directorio_origen/",
src: ["**/*.js"],
dest: "./directorio_destino/"
}
]
}
}
});
La tarea compress
que acabamos de definir se puede descomponer en las
siguientes partes:
- Opciones de configuración: En la sección
options
se definen las configuraciones para la tarea. En este caso la tareacompress
permite configurar el método que se usará para realizar la compresión. Esta configuración aplica para todos los targets que definamos en la tarea. - Targets: Las secciones
css
,html
yjs
se denominan targets y permiten definir diferentes escenarios para la ejecución de la tarea. Cada target tiene sus propias variables:expand
: Esta variable permite definir la ruta a los archivos de origen, es decir los archivos que deseamos comprimir, de forma dinámica.cwd
: Representa el directorio en donde se encuentran los archivos que queremos comprimir. En este caso, la ruta del directorio es relativa a la ubicación del archivoGruntfile.js
pero también se pueden usar rutas absolutas.src
: Éste es un listado de patrones glob que nos permiten obtener los archivos queremos comprimir. Por ejemplo, el patrón**/*.css
significa que Grunt.js va a buscar todos los archivos con extensión.css
dentro del directorio que definimos anteriormente y todos sus subdirectorios.dest
: Es el directorio en dónde se van a almacenar los archivos comprimidos.
Ejecución de la tarea para comprimir HTML, CSS y JS
Lo único que nos hace falta es cargar el plugin de compresión que instalamos
con anterioridad y registrar la tarea para que puedan ser usada desde la
terminal. Luego de eso será posible comprimir CSS, HTML y JS con el
comando grunt
.
Grunt.js necesita saber cuáles plugins, de los que hemos instalado en nuestra
computadora, queremos usar para ejecutar las tareas que ya definimos. Para esto
agregamos la siguiente línea al archivo Gruntfile.js
:
grunt.loadNpmTasks("grunt-contrib-compress");
A continuación, registramos la tarea default
para que con solo ejecutar el
comando grunt
nuestros archivos se compriman automáticamente:
grunt.registerTask("default", ["compress"]);
¡Et voilá! Para comprimir nuestros archivos CSS, HTML y JS, abrimos una
terminal y ejecutamos el comando grunt
:
$ grunt
Para finalizar queda a su disposición el código fuente completo del archivo
Gruntfile.js
:
module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON("package.json"),
compress: {
options: {
mode: 'gzip'
},
css: {
files: [
{
expand: true,
cwd: "./directorio_origen/",
src: ["**/*.css"],
dest: "./directorio_destino/"
}
]
},
html: {
files: [
{
expand: true,
cwd: "./directorio_origen/",
src: ["**/*.html"],
dest: "./directorio_destino/"
}
]
},
js: {
files: [
{
expand: true,
cwd: "./directorio_origen/",
src: ["**/*.js"],
dest: "./directorio_destino/"
}
]
}
}
});
grunt.loadNpmTasks("grunt-contrib-compress");
grunt.registerTask("default", ["compress"]);
};