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