Em abril de 2021 foi anunciado o lançamento da versão 16 do Node.js, como é de costume, as versões pares do runtime são as consideradas production ready ou seja, as versões que serão definitivas para produção.
Inicialmente, a versão LTS (Long Term Support), está sendo a versão 14 até outubro de 2021 enquanto a versão 16 segue como a versão current. Após outubro, a versão 14 entrará em estado de manutenção e a versão 16 será promovida a LTS, isso significa que a versão 14 receberá somente atualizações de segurança e manutenção, enquanto a versão 16 estará recebendo suporte ativo. Tudo isso pode ser visto no calendário de releases oficial.
Esse controle de versões é importante, pois como podemos ver no diagrama, a versão 10 perdeu totalmente o suporte em maio, esta era a última versão que não suportava ES Modules nativamente, o que significa que agora todo mundo que mantém um pacote ou uma lib no NPM poderá utilizar por padrão a nova estrutura!
Vamos as principais diferenças desta nova versão
V8 foi atualizado para versão 9.0
O engine JavaScript mais conhecido do mundo foi atualizado para a versão 9.0 nessa release do Node.js, embora essa não seja a versão mais recente, ela já tem um incrível suporte a muitas coisas legais.
Na versão 9.1 do V8, teremos suporte a top-level await, o que vai tornar a nossa vida muito mais simples
Além das naturais melhorias de performance e estabilidade, esta versão tem uma modificação especial nas expressões regulares, que agora trazem uma nova chave para o resultado de exec
. Anteriormente, não tínhamos como saber quais eram os inícios e finais de uma string que foi comparada com RegExp, ou seja, não tínhamos como saber em qual índice da string este valor apareceu, agora, através da chave indices
podemos saber exatamente o início e o final de uma string que foi rodada contra uma RegExp que tenha a flag /d
setada:
const str = /(Java)(Script)/d.exec('JavaScript')
str.indices // [ [0,10], [0,4], [4,10] ]
str.indices[0] // [0,10] -> toda a string
str.indices[1] // [0,4] -> primeiro grupo ("Java")
str.indices[2] // [4,10] -> segundo grupo ("Script")
Biblioteca timers/promises
estável
Sempre que precisamos usar uma função do tipo setTimeout
, setInterval
ou qualquer outra função que dependa de um timer, geralmente o que fazemos é uma de duas coisas:
- Trabalhar com um modelo convertido manualmente para promises
function asyncTimeout (ms) {
return new Promise((resolve) => setTimeout(resolve, ms))
}
;(async () => {
await asyncTimeout(3000)
console.log('Hello')
})()
- Usar o
util.promisify
const { promisify } = require('util')
const asyncTimeout = promisify(setTimeout)
;(async () => {
await asyncTimeout(3000)
console.log('Hello')
})()
Agora temos uma API nativa de timers com promises que estava em beta na versão 15 do Node:
import { setTimeout } from 'timers/promises';
async function run() {
await setTimeout(5000);
console.log('Hello, World!');
}
run();
Conclusão
Temos algumas alterações muito legais para o que vem por ai no Node.js! Esperamos que, no futuro, tenhamos ainda mais mudanças e muitas outras novidades!