GulpJS - entendendo o método watch()
Apesar de simples, o método watch()
do GulpJS tem algumas particularidades que o tornam bastante poderoso!
Sintaxe
O método watch()
tem duas possíveis sintaxes:
1 | gulp.watch( glob, [, opts], tasks ); |
e:
1 | gulp.watch( glob, [, opts, cb]); |
Na primeira sintaxe, temos:
glob
Tipo: String
ou Array
Um simples glob ou array de globs, que indicam quais arquivos devem ser assistidos, para saber quando foram alterados.
Exemplo de uso:
1 | gulp.watch( 'src/js/**/*.js' ); |
Onde todos os arquivos .js
, dentro do diretório src/js
serão assistidos, recursivamente.
Outro exemplo, com Array
:
1 | gulp.watch([ 'src/js/**/*.js', 'src/stylus/**/*.styl' ]); |
Assiste todos os arquivos .js
dentro de src/js
, e todos os arquivos .styl
, dentro de src/stylus
, recursivamente.
opts
Tipo: Object
Opções, que são passadas para a lib Gaze, que o GulpJS usa para fazer o watch
dos arquivos. As opções que você pode usar estão disponíveis em https://github.com/shama/gaze#properties
tasks
Tipo: Array
Um Array
de tasks criadas com gulp.task()
, que devem ser executadas, quando houver mudanças em qualquer dos arquivos passados em glob
.
Exemplo:
1 | gulp.watch( 'src/js/**/*.js', [ 'lint', 'uglify' ] ); |
As tarefas lint
e uglify
serão executadas sempre que um arquivo .js
em src/js
for alterado.
Você ainda pode usar eventos do NodeJS, para ter uma função callback
que execute assim que os arquivos forem alterados:
1 | var watcher = gulp.watch( 'src/js/**/*.js', [ 'lint', 'uglify' ] ); |
O callback
tem como parâmetro o objeto event
, que possui as propriedades path
, com o caminho do arquivo, e type
, com o tipo de evento disparado.
event.type
pode ter 3 possíveis valores:
changed
: quando um arquivo no caminho assistido é alterado;deleted
: quando um arquivo é deletado do caminho assistido;added
: Quando um novo arquivo é criado no caminho assistido.
A segunda sintaxe difere apenas no último parâmetro. Você pode passar uma função de callback
no lugar de chamar tasks para executar. Essa função tem o mesmo parâmetro event
mostrado anteriormente, quando usado com o método .on('change')
.
Problemas com event.type added
no GulpJS
O GulpJS executa corretamente os eventos changed
e deleted
, mas quando você adiciona um novo arquivo, em alguns momentos o added
não é disparado.
Já havia conversado com alguns amigos sobre isso, e estava confiante que era algum bug no GulpJS. Fiz algumas pesquisas por cima, mas não cheguei a nenhuma solução.
O problema era que, ao adicionar um novo arquivo, eu sempre teria que parar o watch()
, criar os novos arquivos e então executar novamente o watch()
.
Mas hoje estava trocando uma ideia com o Rômulo, que estava passando pelo mesmo problema. Então, em meio a vários links dizendo que era “um problema mesmo”, “era bug do Gaze”, etc., ele encontrou um link onde dizia exatamente qual era o problema:
Havia uma issue aberta no Gaze, - que foi fechada, mas o problema continua - dizendo que isso acontecia quando se usava ./
no início do glob
, no watch()
. E o problema - e consequentemente, a solução - é exatamente esse!
Se você não colocar o ./
no início do glob
, o GulpJS reconhece corretamente novos arquivos adicionados, sem precisar parar o watch()
!
Uma grande descoberta :D
Bom, era isso que eu queria mostrar sobre o watch()
hoje. O GulpJS nos dá muitas possibilidades de personalização, e você ainda vai cansar - ou não - de ler artigos legais sobre o Gulp aqui no blog :D
Até o próximo!
Sobre o #1postperday: https://blog.da2k.com.br/2014/12/31/um-post-por-dia/
Tem alguma sugestão para os próximos posts do #1postperday? Deixe ela aqui: https://github.com/fdaciuk/fdaciuk.github.io/issues/1