Novidades do Node 21!
Mais uma versão do Node.js acabou de sair! Então bora trocar uma ideia sobre as principais novidades que temos nessa nova versão.
Lembrando que as releases ímpares não são as recomendadas para produção, mas sim releases experimentais para que você possa fazer testes e dar feedbacks para a galera!
Atualmente estamos na versão 20 até Outubro do ano que vem, o Node 21 vai estar disponível até Abril de 2024 e depois vamos ter a versão 22 que será a nova versão LTS!
Websockets nativos
A versão 21 começa com uma novidade muito bem vinda! Uma implementação compatível com os websockets do browser foi adicionada na nova release como uma flag experimental. Para usar é só iniciar a sua aplicação com uma flag --experimental-websocket
.
Atualmente a implementação permite abrir e fechar conexões, além de enviar dados. Ela disponibiliza quatro eventos: open
, close
, message
e error
. E isso é incrível porque a gente logo mais não vai mais precisar utilizar implementações como o Socket.io para poder fazer com que aplicações se comuniquem em canais bidirecionais.
Além disso essa discussão está no ar desde 2018
Mais informações estão na documentação do MDN.
Array grouping
Com a inclusão do V8 na versão 11.8, agora temos os métodos de agrupamento de arrays, eu já escrevi sobre eles antes aqui no blog, mas houve uma pequena mudança na API, ao invés de ser um método do protótipo do array, o groupBy
agora é um método estático que pode ser usado como:
const array = [1, 2, 3, 4, 5];
Object.groupBy(array, (num, index) => {
return num % 2 === 0 ? 'par': 'impar';
});
// => { impar: [1, 3, 5], par: [2, 4] }
E o mesmo vale para maps, a diferença é que o resultado será retornado em um Map pela chave, o que é útil para poder agrupar itens por uma chave de algum objeto:
const par = { odd: true };
const impar = { even: true };
Map.groupBy(array, (num, index) => {
return num % 2 === 0 ? par: impar;
});
// => Map { {odd: true}: [1, 3, 5], {even: true}: [2, 4] }
writeFile Flush
A adição de uma nova propriedade chamada { flush: true }
na função writeFile
agora permite que você force que os dados sendo escritos em um arquivo sejam escritos diretamente após o sucesso da escrita.
Essa funcionalidade foi adicionada porque, em alguns casos, era possível que quando estávamos lendo um arquivo, essa operação de leitura obtivesse dados antigos, que ainda não tinham sido escritos devido à natureza assíncrona das operações de escrita.
Agora as funções:
fileHandle.createWriteStream
fsPromises.writeFile
fs.createWriteStream
fs.writeFile
fs.writeFileSync
Todas podem receber uma propriedade no objeto de opções no modo { flush: true }
mas ela não vem ativada por padrão.
Adição do window.navigator
Essa release também tem a inclusão de um objeto global chamado navigator
que é idêntico ao window.navigator
que temos no browser, o Node está caminhando cada vez mais para a compatibilidade direta com a web e os navegadores.
Por enquanto, o navigator
não tem muita coisa ainda, mas isso abre bastante caminho para a inclusão de outras propriedades no futuro.
Detecção automática de módulos
Uma nova flag chamada --experimental-detect-module
foi adicionada e pode ser usada para detectar automaticamente se o arquivo é um CommonJS ou ESM. Finalmente não precisamos mais identificar qual é o tipo de módulo no nosso package.json
.
Mas tome cuidado, essa flag causa um início mais lento do que o normal, então se você mantém alguma biblioteca, ainda é recomendado que você inclua o type: module
no seu package.json porque dessa forma o startup da aplicação pode ser mais rápido já que o node não vai verificar o tipo de módulo.
Outras mudanças
- Fetch e WebStreams agora estão estáveis!
- Melhorias de performance
- Adição da flag
--experimental-default-type
que permite mudar o tipo padrão de módulos para ESM (não precisa mais detype: module
no package.json) - O test runner agora suporta globs