O Node.js v20 já está disponível! Em 18 de abril de 2023, ele se tornou público e agora pode ser usado por todos. Com essa versão, o Node.js deve ser muito mais seguro e ter um desempenho melhor.

É importante saber – como esta é uma versão de número par, está programada para se tornar uma versão de suporte a longo prazo (LTS) em outubro de 2023 e será suportada até abril de 2026. No entanto, a equipe do Node.js está buscando ativamente o feedback da comunidade para identificar e corrigir quaisquer problemas antes de ser promovida para LTS.

 

Essa nova versão do Node.js traz atualizações e recursos interessantes que os desenvolvedores certamente apreciarão, como o modelo de permissão experimental, import.meta.resolve síncrono, um executor de testes estável, atualiza o mecanismo V8 JavaScript para a versão 11.3, trazendo melhorias de desempenho e correções de bugs, e muito mais.

Neste artigo, você explorará as alterações introduzidas no Node.js v20, fornecendo uma visão detalhada de seus novos recursos e capacidades.

Primeiros passos com o Node.js v20

A instalação do Node.js v20 é bastante semelhante à de outras versões do Node.js. Tudo o que você precisa fazer é:

  1. Baixar o pacote do instalador do site oficial do Node.js.
  2. Depois que você tiver baixado o instalador, execute e siga as instruções para concluir o processo de instalação. Esse processo é bastante simples, e você só precisa concordar com o contrato de licença e clicar no botão “Next”.
  3. Reinicie o sistema/máquina após a conclusão do processo de instalação para garantir que todas as alterações tenham efeito.
  4. Verifique a instalação do Node.js executando o seguinte comando:
node -v
Instalação do Node.js v20
Instalação do Node.js v20

Se você ver o número da versão (v20.0.0), isso significa que o Node.js está instalado corretamente e que você está pronto para começar a trabalhar com o Node.js v20.

O que há de novo no Node.js v20?

Vamos explorar as 5 principais atualizações introduzidas nesta versão do Node.js. Esses recursos incluem:

Modelo de permissão experimental

A introdução do modelo de permissão experimental no Node.js v20 é uma adição significativa que oferece aos desenvolvedores mais controle sobre o acesso a recursos específicos durante a execução.

Esse novo recurso é benéfico quando a segurança e o uso de recursos são críticos, como em um ambiente de produção.

O modelo de permissão vem com várias capacidades, incluindo a restrição de acesso ao sistema de arquivos, child_process, worker_threads e complementos nativos.

Os desenvolvedores podem usar sinalizadores como --allow-fs-read, --allow-fs-write e --allow-child-process para especificar quais recursos são acessíveis. Para ativar esses sinalizadores, os desenvolvedores precisam utilizar o sinalizador --experimental-permission em combinação com as permissões necessárias.

Aqui está um exemplo de como usar o modelo de permissão para permitir o acesso de leitura e gravação a todo o sistema de arquivos:

$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

Os desenvolvedores também podem usar o Modelo de Permissão para especificar o acesso a pastas e arquivos específicos. Por exemplo, o comando a seguir permite o acesso de gravação à pasta /tmp/:

$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

Um benefício significativo do Modelo de Permissão é a capacidade de exercer um controle mais granular sobre o acesso ao sistema de arquivos. Por exemplo, os desenvolvedores podem especificar caminhos e padrões wildcard para permitir o acesso a pastas ou arquivos específicos.

$ node --experimental-permission --allow-fs-read=/home/user/* index.js

O comando acima concede acesso de leitura a todas as pastas no diretório /home/user/.

A propriedade de permissão do objeto de processo também pode ser usada para verificar se uma permissão específica foi concedida em tempo de execução. Por exemplo, se você quiser verificar se o processo do Node.js tem acesso de leitura a uma pasta específica, /home/user/documents, poderá usar o seguinte código:

if (process.permission.has('fs.read', '/home/user/documents')) {
  console.log('Read access granted to /home/user/documents');
} else {
  console.log('Read access not granted to /home/user/documents');
}

Ao usar o modelo de permissão, você tem um controle mais refinado sobre o acesso ao sistema de arquivos dos processos do Node.js, o que pode levar a uma melhor segurança e a uma utilização mais eficiente dos recursos.

É fundamental observar que o modelo de permissão ainda é experimental e pode ser alterado em versões futuras do Node.js. É aconselhável que você se mantenha atualizado com a documentação do modelo de permissão e tenha cuidado ao usar esses recursos experimentais.

Executor de testes estável

O Node.js v20 inclui uma versão estável do módulo test_runner que permite aos desenvolvedores criar e executar conjuntos de testes JavaScript de forma rápida e fácil, sem instalar dependências adicionais.

O executor de testes estável agora inclui vários blocos de construção, como describe, it/test, e hooks, para criar e estruturar arquivos de teste, juntamente com mocking, modo de observação e a capacidade de executar vários arquivos de teste em paralelo usando o comando node --test.

Aqui está um exemplo de como usar o executor de testes:

import { test, mock } from 'node:test';
import assert from 'node:assert';
import fs from 'node:fs';

mock.method(fs, 'readFile', async () => "Hello World");
test('synchronous passing test', async (t) => {
  // This test passes because it does not throw an exception.
  assert.strictEqual(await fs.readFile('a.txt'), "Hello World");
});

Oferece relatórios de teste configuráveis e personalizados por meio da opção --test-reporter, cobertura de teste experimental por meio da opção --experimental-test-coverage e capacidades de simulação.

Embora não tenha a intenção de substituir estruturas de teste com recursos completos, como Jest ou Mocha, o executor de testes estável oferece uma maneira simples e rápida de criar conjuntos de testes. Ele foi aprimorado significativamente desde sua introdução no Node.js v19 e, graças aos testes e ao feedback dos usuários finais, agora foi marcado como estável no Node.js v20.

Mais informações podem ser encontradas nesta solicitação pull request.

Mecanismo V8 JavaScript atualizado para 11.3

O mecanismo V8 JavaScript, que alimenta o Node.js, foi atualizado para a versão 11.3 no Node.js v20. Com isso, você obtém melhor desempenho e apresenta novos recursos de linguagem. Alguns dos novos recursos dessa atualização incluem:

  • String.prototype.isWellFormed e toWellFormed: Esses métodos são particularmente úteis para garantir o formato correto de string. Isso ajuda a garantir que a entrada de string do usuário esteja no formato UTF-16 correto, reduzindo erros na era dos emojis.
  • Métodos que alteram Array e TypedArray por cópia: Isso pode servir para criar cópias modificadas de arrays sem afetar os dados originais, o que é especialmente relevante em casos em que é necessário preservar os dados originais para comparação ou outros fins.
  • ArrayBuffer redimensionável e SharedArrayBuffer expansível: oferece maior flexibilidade, permitindo uma alocação de memória mais eficiente.
  • RegExp v flag com notação de conjunto e propriedades de strings: adiciona funcionalidade para expressões regulares.
  • WebAssembly tail call: oferece uma maneira de otimizar determinados tipos de chamadas de função.

Essas atualizações demonstram o compromisso contínuo da comunidade de desenvolvimento do Node.js com o aprimoramento do desempenho e da funcionalidade.

Import.meta.resolve() síncrono

No Node.js v20, o import.meta.resolve() foi introduzido, que facilita a escrita de scripts que não são sensíveis à localização. Essa função retorna de forma síncrona, semelhante ao comportamento do navegador, permitindo uma execução mais eficiente.

Os hooks de resolução do usuário ainda podem ser definidos como uma função async, mas o import.meta.resolve() ainda retornará sincronamente para o código do aplicativo, mesmo se hooks de resolução async estiverem carregados.

O comportamento síncrono do import.meta.resolve() permite uma execução de código mais eficiente, especialmente ao lidar com grandes quantidades de dados. Como autor, você pode definir as hooks de resolução como funções assíncronas ou síncronas, dependendo de sua preferência. O código do aplicativo ainda será executado de forma síncrona, independentemente de haver hooks de resolução assíncronos carregados.

Experimental Single Executable Applications (SEA)

Experimental Single Executable Applications (SEA) é um novo recurso introduzido no Node.js v20 que permite agrupar seu aplicativo com o binário do Node.js, permitindo que os usuários finais distribuam e executem como um único arquivo executável.

Isso tem sido um pedido de longa data da comunidade, e a equipe tem refinado a abordagem ao longo do último ano.

No Node.js v20, construir um aplicativo executável único requer a injeção de um blob preparado pelo Node.js a partir de uma configuração JSON em vez de injetar o arquivo JS bruto.

Um blob é um arquivo que contém dados binários, neste caso, preparado pelo Node.js, sendo injetado no binário. Essa mudança foi feita para permitir a incorporação de vários recursos coexistentes no SEA, abrindo novos casos de uso.

Aqui está um exemplo de um arquivo sea-config.json:

{ 
      "main": "myscript.js", 
      "output": "sea-prep.blob" 
}

Quando executado com o comando node --experimental-sea-config sea-config.json, o blob é gravado no arquivo sea-prep.blob, que pode então ser injetado no binário.

O recurso SEA permite que os desenvolvedores distribuam aplicativos Node.js sem exigir que os usuários instalem o Node.js. A funcionalidade foi criada por Darshan Sen, que ganhou o prêmio de Contribuição Excepcional de um Novato como parte do JavaScriptLandia Awards no OpenJS World.

A Microsoft, membro da OpenJS Foundation, está investigando esse recurso como uma forma de reduzir os ataques de vetor e capacitar a arquitetura do Node.js para uma melhor experiência. Embora o recurso SEA ainda seja experimental, ele representa um novo e empolgante desenvolvimento para a comunidade do Node.js.

Desempenho

O Node.js v20 vem com melhorias significativas em seu tempo de execução, com um foco renovado no desempenho pela recém-formada equipe de desempenho do Node.js. As melhorias incluem otimizações para as partes principais do tempo de execução, como URL, fetch() e EventTarget.

Uma das melhorias notáveis é a redução do custo de inicialização do EventTarget, que foi cortado pela metade, resultando em acesso mais rápido a todos os subsistemas que o utilizam. Além disso, as chamadas V8 Fast API foram utilizadas para melhorar o desempenho em APIs como URL.canParse() e timers.

Outra alteração específica é a inclusão da versão atualizada 2.0 do Ada, um analisador de URL rápido e compatível com as especificações, escrito em C++.

Resumo

Neste artigo, você aprendeu alguns dos principais recursos (experimentais e estáveis) e melhorias que o Node.js v20 traz, como melhorias no mecanismo JavaScript V8, desempenho, executor de testes e introdução do modelo de permissão experimental e aplicativos de execução única.

É importante saber que o Node.js v14 chegará ao fim da vida útil em abril de 2023, portanto, é aconselhável que você comece a planejar a atualização para o Node.js v18 (LTS) ou para o vNode.js 20 (que em breve será LTS).

Você gostaria de experimentar a versão mais recente do Node.js? Você pode fazer isso implantando seu aplicativo Node.js na Kinsta e ganhar seus primeiros $20 conosco. Já oferecemos suporte ao Node.js v20, o que significa que você pode testar seus novos recursos e capacidades a partir de hoje.

Agora é a sua vez de compartilhar! Quais recursos ou melhorias você achou mais interessantes no Node.js v20? Há alguma atualização significativa que possamos ter deixado passar? Por favor, deixe sua opinião nos comentários abaixo.

Joel Olawanle Kinsta

Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 200 technical articles majorly around JavaScript and it's frameworks.