Grunt es un task runner de JavaScript, una herramienta utilizada para realizar automáticamente tareas frecuentes como minificación, compilación, pruebas unitarias y linting.
Utiliza una interfaz de línea de comandos para ejecutar tareas personalizadas definidas en un archivo (conocido como Gruntfile). Grunt se distribuye a través de npm y cuenta con multitud de complementos disponibles.
Antes de empezar, conviene actualizar NPM (Libreria de software, instalador y gestor de paquetes), con el comando:
npm update -g npm
Instalamos el CLI (Command Line Interface) de grunt de forma global:
npm install -g grunt-cli
Nos desplazamos a la carpeta del proyecto (p.e. cd [nombre-del-proyecto]), desde done preparamos el proyecto Grunt, creando el fichero package.json, mediante el comando:
npm init -y
Despues instalamos Grunt, generando las dependencias:
npm install grunt --save-dev
En este punto, podemos instalar los complementos (tareas) que queremos utilizar en nuestro proyecto, podemos instalar las siguientes, dependiento que tareas queremos utilizar:
- Eliminar ficheros y carpetas:
npm install grunt-contrib-clean –save-dev - Concatenar ficheros:
npm install grunt-contrib-concat –save-dev - Comprimir ficheros CSS:
npm install grunt-contrib-cssmin –save-dev - Compilar ficheros Sass a CSS:
npm install grunt-contrib-sass –save-dev - Minificar ficheros JavaScript:
npm install grunt-contrib-uglify –save-dev - Ejecutar tareas predeterminadas cuando se añaden, modifican o eliminan determinados ficheros:
npm install grunt-contrib-watch –save-dev - Minificar imágenes de formato PNG, JPEG, GIF y SVG:
npm install grunt-contrib-imagemin –save-dev - Validar ficheros con JSHint:
npm install grunt-contrib-jshint –save-dev - Copiar ficheros:
npm install grunt-contrib-copy –save-dev - Prefijar ficheros CSS:
npm install grunt-autoprefixer –save-dev - Transferir ficheros usando FTP:
npm install grunt-ftp-push –save-dev - Sincronizar el explorador:
npm install grunt-browser-sync –save-dev
Ahora queda definir en el fichero Gruntfile.js las tareas concretas. En este fichero tenemos por una parte las tareas (grunt.initConfig), la carga de los complementos (grunt.loadNPMTasks) y el registro de tareas (grunt.registerTask).
module.exports = function(grunt) {
grunt.initConfig({
sass: {
dev: {
files: {
'src/style.css': 'src/sass/style.scss'
}
},
dist: {
options: {
style: 'compressed',
sourcemap: 'none'
},
files: [{
expand: true,
cwd: 'src/sass',
src: ['.scss'],
dest: 'src',
ext: '.css'
}]
}
},
autoprefixer: {
options: {
browsers: ['last 2 version','ie 10'],
grid: true
},
dist: {
files: [{
expand: true,
cwd: 'src',
src: 'style.css',
dest: 'src',
ext: '.pre.css'
}]
}
},
cssmin: {
dist: {
src: 'src/style.pre.css',
dest: 'dist/style.css'
}
},
clean: {
dist: {
src: ['dist/']
},
uploads: {
src: ['dist-uploads/']
}
},
concat: {
options: {
separator: ';',
},
js: {
src: ['src/js/.js','!src/js/built.js'],
dest: 'src/js/built.js'
}
},
uglify: {
dist: {
files: [{
expand: true,
cwd: 'src/',
src: 'js/.js',
dest: 'dist/',
}]
}
},
imagemin: {
dist: {
files: [{
expand: true,
cwd: 'src/',
src: ['/.{png,jpg,gif,svg}'],
dest: 'dist/'
}]
},
uploads: {
files: [{
expand: true,
cwd: 'uploads/',
src: ['/.{png,jpg,gif,svg}'],
dest: 'dist-uploads/'
}]
}
},
copy: {
dist: {
expand: true,
cwd: 'src/',
src: ['/.php'],
dest: 'dist/'
},
style: {
expand: true,
cwd: 'src/',
src: ['style.css'],
dest: 'dist/'
},
localhost: {
expand: true,
cwd: 'dist/',
src: ['/'],
dest: 'c:/xampp/htdocs/wordpress/wp-content/themes/proyecto/'
}
},
ftp_push: {
options: {
host: 'ftp.proyecto.com',
username: 'user',
password: 'pass',
dest: 'proyecto',
},
dist: {
files: [{
expand: true,
cwd: 'dist/',
src: ['/'],
dest:'wp-content/themes/proyecto/'
}]
},
uploads: {
files: [{
expand: true,
cwd: 'dist-uploads/',
src: ['/'],
dest:'wp-content/uploads/'
}]
}
},
browserSync: {
dev: {
bsFiles: {
src : ['c:/xampp/htdocs/wordpress/wp-content/themes/proyecto//']
},
options: {
watchTask: true,
proxy: 'localhost/proyecto',
}
}
},
jshint: {
dev: ['src/js/.js']
},
watch: {
options: {
livereload: true
},
sass: {
files: ['src/sass/style.scss'],
tasks: ['sass:dev']
},
diststyle: {
files: ['src/style.css'],
tasks: ['clean:dist','copy:style','copy:localhost']
},
js: {
files: ['src/js/.js'],
tasks: ['jshint:dev']
}
},
});
grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-imagemin');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-browser-sync');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-ftp-push');
grunt.loadNpmTasks('grunt-autoprefixer');
grunt.registerTask('default',['browserSync:dev','watch:sass','watch:diststyle']);
grunt.registerTask('distribute',[
'clean:dist',
'autoprefixer:dist',
'cssmin:dist',
'uglify:dist',
'imagemin:dist',
'copy:dist'
]);
grunt.registerTask('pushweb',['ftp_push:dist']);
grunt.registerTask('pushuploads',['clean:uploads','imagemin:uploads','ftp_push:uploads']);
grunt.registerTask('pushlocal', ['copy:localhost']);
};
Para ejecutar una tarea (p.e., distribute):
grunt distribute
En este caso, esta tarea realiza lo siguiente:
- Elimina los ficheros de la carpeta dist.
- Autoprefija el fichero CSS style.css de la carpeta src, generando el fichero style.pre.css.
- Minimiza el fichero style.pre.css, generando el fichero style.css en la carpeta dist.
- Minimiza los archivos js de la carpeta src/js a la carpeta dist/js.
- Minimiza los archivos de imagen de formatos png, jpg, gif y svg de la carpeta src y sus subcarpetas a la carpeta dist.
- Copia los ficheros de la carpeta dist a la carpeta de nuestro proyecto c:/xampp/htdocs/wordpress/wp-content/themes/proyecto/.
Si ejecutamos grunt, se cargaran las tareas por defecto (default), que en este caso carga el sincronizador del explorador y el observador (watch), que compila los ficheros Sass a CSS.
Si queremos ejecutar una tarea concreta, por ejemplo, subir nuestro proyecto local a nuestro servidor web (p.e., ftp.proyecto.com), ejecutamos:
grunt pushweb
Si queremos que la tarea de compilación se realice siempre que se observen cambios en los ficheros Sass, ejecutamos el comando:
grunt watch:sass
en el que hemos indicado la tarea y su target específico a ejecutar.
Si queremos vaciar la carpeta dist-uploads:
grunt clean:uploads
Si queremos minimizar las imágenes de la carpeta uploads y pasarlas a la carpeta dist-uploads:
grunt imagemin:uploads
Modificando el fichero Gruntfile.js podemos generar nuevas tareas, redefinirlas y adaptarlas a nuestro proyecto en concreto, con lo que automatizar tareas repetitivas que realizamos durante el desarrollo del proyecto, ahorrando tiempo y mejorando la productividad.
En Doowebs podemos ayudarte con el desarrollo de tu web, contáctanos para solicitar más información sobre nuestros servicios.