 
Tem ouvido muito falar em Gulp, Jade, Sass, Stylus, Less, YAML, EJS, etc, mas não sabe por onde começar? Seus problemas acabaram. Venha passear no território do workflow automatizado e vicie-se completamente.
Quem me iniciou no gulpjs foi o @fdaciuk, em uma palestra sobre gulp no WordCamp SP 2014. Hoje, tenho o prazer de apresentar pra vcs algumas dicas para começar JÁ a facilitar sua vida.
Neste artigo veremos o básico do GulpJS, e como trabalhar de forma automágica com pré-processadores (stylus e jade, mas é muito semelhante para usar com quaisquer outros que prefira)
(o resultado/exemplo está neste repositório do github)
Pré-Requisitos para Começar:
- Gulp instalado globalmente: 
Abra o terminal (com o nodejs já instalado) e rode:1
npm install -g gulp
Isso deve deixar  disponível o comando gulp no terminal.
Vamos começar?
Primeiro, crie uma pasta para seu projeto. Já deixe o console aberto nela também :P
Vamos criar o arquivo package.json, a base de todo projeto NodeJs.
| 1 | { | 
Note as devDependencies: gulp (este é o local, já instalamos o global, antes), gulp-connect-multi (servidor/livereload), gulp-jade e gulp-stylus.
Você acha pacotes maneiros de gulp, se precisar em npmjs.com, buscando por ‘gulp’ ou em GulpJS.com/plugins.
Com o console, rode:
| 1 | npm install | 
Como criar uma task no GulpJs
Na pasta do seu projeto, crie um arquivo chamado gulpfile.js
| 1 | var gulp = require('gulp'); | 
Salve e, no terminal execute:
| 1 | gulp teste | 
Viu que bacana?
Saca a sintaxe: gulp.task(nome, função).
Usando Jade com Gulp Js
Ainda no gulpfile.js, ao final do arquivo, insira:
| 1 | (...) | 
Pontos importantes:
- gulp.src()informa ao gulp qual arquivo ele vai usar, em formato de globs.- 'src/jade/**/**.jade'significa todos arquivos .jade dentro de src/jade/ e subdiretórios.
- .pipe()o pipe executa algo com o gulp.src(). Note como podemos usar vários- .pipe()em sequência, e como não há- ;até acabarmos.
- jade()executa o módulo jade. Usado sempre dentro de um .pipe()
- gulp.dest()após o- .pipe(jade()), usamos o- pipe(gulp.dest(nomeDaPasta))para enviar o resultado para a pasta- /build
Vamos criar um arquivo index.jade dentro da pasta /src/jade e testar logo nossa task ^_^y
| 1 | doctype html | 
Salve, abra o terminal na pasta raiz do projeto e rode:
| 1 | gulp jade | 
Veja o resultado: Na pasta /build, que foi criada na raíz do projeto, há um arquivo index.html, que é o seu index.jade compilado.
Criando um server com LiveReload no Gulp JS
Vamos criar uma nova task, chamada de server. Ao final do gulpfile.js, insira:
| 1 | (...) | 
Pontos importantes:
Note que essa task não tem gulp.src, nem gulp.dest. O que fazemos é chamar connect.server(), com alguns parâmetros: root, port, livereload e open.
Agora salve o arquivo, e rode1
gulp server
Maneiro né? Pra funcionar, você precisa ter executado a task jade antes. Podemos inseri-la como dependencia, mas faremos isso mais tarde.
Aperte ctrl+c no terminal para encerrar o servidor.
Usando Pré-processador CSS (Stylus) com Gulp Js
Criemos nossa task. Ela deve pegar os arquivos .stylus, gerar o css e salvar na pasta ./build
| 1 | (...) | 
Crie uma pasta src/stylus e, dentro, um arquivo main.styl
insira:1
2
3
4
5
6$bgcolor = red;
$maincolor = blue;
  
body
  background $bgcolor
  color $maincolor
Salve, abra o terminal na pasta raíz e rode
| 1 | gulp stylus | 
Yay!! Agora, dentro da pasta build/css temos o arquivo main.css, devidamente compilado do Stylus :D
Agora, não seria bacana se pudessemos deixar o servidor rodando e atualizar a página, compilar stylus e compilar jade sem ficar executando tasks o tempo todo?
SIM, SERIA MUITO LEGAL!
Usando LiveReload com GulpJs para atualizar quando houver alteração em algum arquivo
Pra isso, precisaremos de:
- task com funções .watch() pra cada tipo de arquivo (.jade e .styl) 
- task que execute as tasks jade, stylus, server e watch, em sequencia 
- inserir a função .reload() ao final de cada task 
Então vamos lá:
1. Criando watch no gulp
Edite o arquivo gulpfile.js, inserindo ao final dele:
| 1 | (...) | 
Acima, usamos gulp.watch(), onde o primeiro parâmetro é um(alguns) GLOB(s) dos arquivos à serem monitorados e o segundo parâmetro, a(s) task(s) à executar
2. Criando uma task padrao para unificar tudo
Edite o arquivo gulpfile.js, inserindo ao final dele:
| 1 | (...) | 
Se você cria uma task com o nome ‘default’, como acima, ela é chamada quando rodar o comando gulp pelo terminal.
Nesta, definimos que ela irá rodar as tasks jade, stylus, server e watch.
3. Inserindo reload() ao final das tasks jade e stylus
Editando o arquivo gulpfile.js, deixaremos as 2 tasks assim:
Task jade1
2
3
4
5
6
7
8(...)
gulp.task('jade', function(){
  gulp.src('src/jade/**/**.jade')
    .pipe(jade())
    .pipe(gulp.dest('build'))
    .pipe(connect.reload()); //linha adicionada
  });
(...)
Task stylus1
2
3
4
5
6gulp.task('stylus', function(){
  gulp.src('src/stylus/**/**.styl')
    .pipe(stylus())
    .pipe(gulp.dest('build/css'))
    .pipe(connect.reload()); //linha adicionada
})
Ok, vamos ver que legal!
Rode, no terminal
| 1 | gulp | 
Deve abrir seu navegador, com a página sem estilos.
Deixe rodando a task, e vamos editar o arquivo index.jade.
Deixe a janela do navegador com o conteúdo visível atraz do seu editor
Vamos inserir uma linha logo abaixo de title= "Título da página"
| 1 | title= "Título da página" | 
Salve o arquivo e…. tcharãaaa, veja como atualizou sozinha sua página. Experimente editar o main.styl, mudando as cores das variáveis por exemplo (de blue para white), e salve.
Seja bem vindo ao GulpJs. Automate all the things o/
(o resultado/exemplo está neste repositório do github)
Ah! Vale lembrar que, pra facilitar, declaramos os require logo antes de cada task.
O ideal mesmo é que sejam declarados todos ao começo do arquivo.
Ficaria mais ou menos assim, ó:
| 1 | var gulp = require('gulp') | 
Desafio/Lição de casa
Este desafio é só pra quem teve a primeira experiência com o GulpJs neste post, hein. Se você já manja, não adianta ;P
Note que nosso gulpfile faz:
- Processa e gera html de arquivos jade
- processa e gera css de arquivos styl
massss… falta uma task para lidar com os arquivos não processados (imagens, por exemplo).
O desafio/tarefa de casa é criar uma task E um watch para os arquivos não processados. Essa task deve apenas copiar eles para a pasta build e chamar o connect.reload() ao final.
dica: insira arquivos dentro de alguma pasta, como src/assets
No próximo post de GulpJS….
No próximo post de GulpJS veremos tarefas úteis para JS (que não abordamos aqui) e outras tarefas de otimização para distribuir seu projeto. 
Gostou? Entendeu? Curtiu? Usou? Deixe seu comentário!!
Dúvidas?
Comments