O Node.js versão 7.6 foi lançado trazendo suporte à funcionalidade async/await habilitada por padrão, assim como melhorias de desempenho em dispositivos low-memory.
O suporte à async/await no Node 7.6 veio com a atualização do V8, a engine JavaScript do Chromium, para a versão 5.5. Isto significa que a funcionalidade async/await não é mais considerada experimental e pode ser utilizada sem rodar o Node com a flag --harmony, a qual deve ser utilizada para ativar as funcionalidades que a equipe do V8 ainda não considera estável.
O maior benefício da funcionalidade async/await é evitar o callback hell, que acontece após uma sequência de funções assíncronas aninhadas através dos seus respectivos calbacks.
Um exemplo de como pode gerenciar a execução de duas operações assíncronas utilizando callbacks:
function asyncOperation(callback) { asyncStep1(function(response1) { asyncStep2(response1, function(response2) { callback(...); }); }); }
O uso da funcão async/await permite a escrita do código como se fosse uma sequência de operações síncronas:
async function asyncOperation(callback) { const response = await asyncStep1(); return await asyncStep2(response); }
Outra abordagem para resolver o callback hell é utilizando Promises, uma funcionalidade que está disponível há algum tempo no JavaScript. Com Promises, o exemplo acima fica da seguinte forma:
function asyncOperation() { return asyncStep1(...) .then(asyncStep2(...)); }
E mesmo utilizando Promises, o código pode se tornar complexo em algumas situações.
O V8 5.5 também adicionou algumas melhorias no tamanho da heap, o que reduz o uso de memória em 35% em dispositivos low-memory comparado com o V8 versão 5.3.
Outras mudanças significativas no Node 7.6 são:
- O antigo CLI debugger do Node foi reescrito para utilizar o novo protocolo de debugger, "node --inspect", o qual vai ser o único suportado nas versões futuras do V8;
- Suporte ao protocolo "file:" foi adicionado ao fs, possibilitando escrever
fs.readFile( URL('file:///C:/path/to/file'), (err, data) => { }).
Além da atualização da versão 5.5 do V8, o Node 7.6 também atualizou outras dependências, como a biblioteca cross-platform assíncrona de I/O libuv 1.11 e a zlib 1.2.11.