Começando com GruntJS

Imagem para Começando com GruntJS

Front endPostado em  Atualizado em  4 min de leitura

No desenvolvimento Front-End tem algumas tarefas que são como um castigo se feitas manualmente. Por isso, temos que automatizar algumas tarefas. Para nos auxiliar com isso, temos o GruntJS.

O GruntJS é um task runner que automatiza tarefas e roda via terminal.

Instalação

Para rodá-lo, precisamos primeiramente ter o NodeJS e NPM, instalados.

Podendo ser baixado, aqui: NodeJS com NPM

Agora que já temos o NodeJS e NPM, instalados. Temos que instalar o GruntJS via terminal:

npm install -g grunt-cli

Podemos ver se está instalado com o commando:

grunt --version

Para o GruntJS funcionar, precisamos de 2 arquivos: package.json e o Gruntfile.js.

O package.json é um arquivo do NodeJS, onde terão as informações do projeto e os plugins do GruntJS. Ex:

{
  "name": "project name",
  "version": "1.0.0",
  "title": "Project Title",
  "devDependencies": {
    "grunt": ">=0.4.5",
    "load-grunt-config": "^0.10.0",
    "load-grunt-tasks": "^0.4.0"
  },
}

O Gruntfile.js é o arquivo de configuração do GruntJS. Ex:

module.exports = function( grunt ) {

  grunt.initConfig({
    // Tasks
  });
};

Para adicionar um plugin no seu package.json, podemos utilizar os comandos:

Para as dependências para produção (dependencies)

npm install grunt --save

Para dependências, apenas para o desenvolvimento (devDependencies)

npm install grunt --save-dev

Se você está utilizando um package.json, já com os plugins listados, basta executar o comando:

npm install

Configuração

Agora com os plugins instalados, precisando configurar cada tarefa para ser executado ao rodar o GruntJS.

No link http://gruntjs.com/plugins, você pode conferir os plugins para o GruntJS. Clicando no plugin desejado, será encaminhado para o host https://www.npmjs.com, onde terá as informações para a configuração do package escolhido.

Como exemplo, escolhi o plugin grunt-contrib-uglify, sendo levado para https://www.npmjs.com/package/grunt-contrib-uglify. Onde podemos conferir, como configurar a tarefa.

Abaixo, como podemos ver no método initConfig, iremos passar um objeto com a configuração do plugin. Com o método loadNpmTasks, informaremos a tarefa que deverá ser carregada. E para finalizar, devemos registrar as tarefas que teremos no projeto.

module.exports = function( grunt ) {

  grunt.initConfig({

    uglify: {
	    my_target: {
			files: {
				'dest/output.min.js': ['src/input1.js', 'src/input2.js']
			}
	    }
	}

  });


  // Plugins do Grunt
  grunt.loadNpmTasks( 'grunt-contrib-uglify' );


  // Tarefas que serão executadas
  grunt.registerTask( 'default', [ 'uglify' ] );

};

Para ficar mais claro, temos outro exemplo com mais plugins e tarefas.

module.exports = function( grunt ) {

  grunt.initConfig({

    uglify: {
	    my_target: {
			files: {
				'dest/output.min.js': ['src/input1.js', 'src/input2.js']
			}
	    }
	},
	cssmin: {
		target: {
	    	files: [{
				expand: true,
				cwd: 'release/css',
				src: ['*.css', '!*.min.css'],
				dest: 'release/css',
				ext: '.min.css'
			}]
		}
	}

  });


  // Plugins do Grunt
  grunt.loadNpmTasks( 'grunt-contrib-uglify' );
  grunt.loadNpmTasks( 'grunt-contrib-cssmin' );


  // Tarefas que serão executadas
  grunt.registerTask( 'default', [ 'cssmin', 'uglify' ] );
  grunt.registerTask( 'css', [ 'cssmin' ] );
  grunt.registerTask( 'js', [ 'uglify' ] );

};

Acima, temos a configuração dos plugins cssmin e uglify no Gruntfile.js, onde os mesmos serão carregados com o método loadNpmTasks e registramos 3 tarefas.

Executando as tarefas

No terminal, rodando o comando:

grunt

Será executada a lista de tarefas default (cssmin e uglify)

Com o comando:

grunt css

Será executada a lista css

E o comando:

grunt js

a lista js

Acredito que ficou simples de compreender a lógica para utilizar as tarefas do GruntJS. Com isso, temos tudo instalado e configurado. Agora só ser feliz com as tarefas automatizadas.

A dica

Dependendo da quantidade de configurações no seu Gruntfile.js, a manutenção fica bem complicada. Para resolver o problema, podemos utilizar o plugin load-grunt-config, para termos mais organização.

https://github.com/firstandthird/load-grunt-config O load-grunt-config, permite quebrar a configuração do Gruntfile.js por tarefa. Você pode usar os arquivos na extensão .js , .json , .yaml , .cson , ou .coffee.

Instalando o plugin

npm install load-grunt-config --save-dev

O Gruntfile.js, ficará semelhante ao exemplo abaixo:

module.exports = function(grunt) {
    // Carrega configurações da pasta grunt-configs/
    var path = require('path');

    require('load-grunt-config')(grunt, {
        init: true,
        configPath: path.join(process.cwd(), 'source/_tasks'),
        data: {
            projectDir  : '../../public/assets/',
            projectDev  : 'source/_assets/',
            pkg: grunt.file.readJSON('package.json')
        }
    });

};

'source/_tasks' - Será o caminho para onde estão os arquivos com as configurações das tarefas.

No objeto data, informamos as variáveis que será retornadas pelo parâmetro options no arquivo de configuração de cada plugin, como podemos ver abaixo.

module.exports = function(grunt, options){
	// configuração
};

No Gruntfile.js, o caminho das configurações se encontram na pasta source/_tasks e a estrutura ficaria assim:

>source
  >_tasks
    > aliases.yaml
    > cssmin.js

A sua pasta com as tarefas precisará ter o arquivo aliases.(js|.json|yaml|cson|coffee) para definir as suas tarefas.

Exemplo com a extensão .yaml:

aliases.yaml

default:
  - 'cssmin'
  - 'uglify'

css:
  - 'cssmin'

js:
  - 'uglify'

Abaixo, um exemplo com a extensão .js, da configuração de um plugin.

cssmin.js

module.exports = function(grunt, options){

  var projectDir = options.projectDir;

  return {
    site: {
      files: [{
        expand: true,
        cwd: '<%= projectDir %>css/site/',
        src: ['*.css'],
        dest: '<%= projectDir %>css/site/'
      }]
    }
  };
};

E assim, podemos utilizar o GruntJS, para estar automatizando as tarefas que dão um bom trabalho se feitas manualmente e poupam um bom tempo, nos deixando mais produtivos.