O que há de novo no Node.js v20 (Test Runner, Permission Model, SEA, V8 JS Engine 11.3)
Publicados: 2023-04-28Node.js v20 já está disponível! Em 18 de abril de 2023, tornou-se público e agora pode ser usado por todos. Com esta versão, o Node.js deve ser muito mais seguro e ter um desempenho melhor.
É importante saber - como este é um lançamento de número par, está programado para se tornar uma versão de suporte de longo prazo (LTS) em outubro de 2023 e terá suporte até abril de 2026. No entanto, a equipe do Node.js está buscando ativamente a comunidade feedback para identificar e corrigir quaisquer problemas antes de ser promovido a LTS.
Esta nova versão do Node.js traz atualizações e recursos empolgantes que os desenvolvedores certamente apreciarão, como o modelo de permissão experimental, import.meta.resolve
síncrono, um executor de teste estável, atualiza o mecanismo JavaScript V8 para a versão 11.3, trazendo melhorias de desempenho e bug correções e muito mais.
Neste artigo, você explorará as mudanças introduzidas no Node.js v20, fornecendo uma visão aprofundada de seus novos recursos e capacidades.
Introdução ao Node.js v20
A instalação do Node.js v20 é bastante semelhante a outras versões do Node.js. Tudo que você precisa fazer é:
- Baixe o pacote do instalador no site oficial do Node.js.
- Depois de baixar o instalador, execute-o e siga as instruções para concluir o processo de instalação. Esse processo é bastante direto e você só precisa concordar com o contrato de licença e clicar no botão “Avançar”.
- Reinicie seu sistema/máquina após a conclusão do processo de instalação para garantir que todas as alterações entrem em vigor.
- Verifique a instalação do Node.js executando o seguinte comando:
node -v
Se você vir o número da versão (v20.0.0), isso significa que o Node.js está instalado corretamente e 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 com esta versão do Node.js. Esses recursos incluem:
Modelo Experimental de Permissão
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 habilidades, 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 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 seguinte comando permite 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 do sistema de arquivos. Por exemplo, os desenvolvedores podem especificar caminhos e padrões curinga 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 dentro do diretório /home/user/ .
A propriedade permission do objeto process 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 seu processo Node.js tem acesso de leitura a uma pasta específica, /home/user/documents , você pode 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 de seus processos Node.js, o que pode levar a uma melhor segurança e utilização de recursos mais eficiente.
É crucial observar que o Modelo de Permissão ainda é experimental e pode mudar em versões futuras do Node.js. É aconselhável manter-se atualizado com a documentação do Modelo de permissão e ter cuidado ao usar esses recursos experimentais.
Executor de teste estável
O Node.js v20 inclui uma versão estável do módulo test_runner que permite aos desenvolvedores criar e executar suítes de teste JavaScript de forma rápida e fácil sem instalar dependências adicionais.
O executor de teste estável agora inclui vários blocos de construção, como describe
, it
/ test
e hooks, para criação e estruturação de arquivos de teste, juntamente com simulação, modo de observação e a capacidade de executar vários arquivos de teste em paralelo usando o node --test
comando node --test
.
Aqui está um exemplo de como usar o executor de teste:
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"); });
O executor de teste oferece repórteres de teste configuráveis e personalizados por meio do sinalizador --test-reporter
, cobertura de teste experimental por meio do sinalizador --experimental-test-coverage
e recursos de zombaria.
Embora não pretenda substituir estruturas de teste com recursos completos, como Jest ou Mocha, o executor de teste estável oferece uma maneira simples e rápida de criar suítes de teste. Ele foi aprimorado significativamente desde sua introdução no Node.js v19 e, graças aos testes e comentários do usuário final, agora foi marcado como estável no Node.js v20.
Mais informações podem ser encontradas nesta solicitação pull mesclada.
Mecanismo JavaScript V8 atualizado para 11.3
O mecanismo JavaScript V8, que alimenta o Node.js, foi atualizado para a versão 11.3 no Node.js v20. Isso traz melhor desempenho e apresenta novos recursos de linguagem. Alguns dos novos recursos incluídos nesta atualização:
-
String.prototype.isWellFormed
etoWellFormed
: Esses métodos são particularmente úteis para garantir o formato adequado da 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 ser útil para criar cópias modificadas de arrays sem afetar os dados originais, o que é especialmente relevante nos casos em que você precisa preservar os dados originais para comparação ou outros fins.
-
ArrayBuffer
redimensionável eSharedArrayBuffer
expansível : fornece maior flexibilidade, permitindo alocação de memória mais eficiente. - Sinalizador RegExp v com notação definida e propriedades de strings: adiciona funcionalidade para expressões regulares.
- Chamada final do WebAssembly: fornece uma maneira de otimizar certos tipos de chamadas de função.
Essas atualizações mostram o compromisso contínuo da comunidade de desenvolvimento Node.js para melhorar o desempenho e a funcionalidade.
Importação síncrona.meta.resolve()
No Node.js v20, import.meta.resolve()
foi introduzido, o que torna mais fácil escrever scripts que não são sensíveis ao local. Essa função retorna de forma síncrona, semelhante ao comportamento do navegador, permitindo uma execução mais eficiente.
Os ganchos de resolução do carregador de usuário ainda podem ser definidos como uma função assíncrona, mas import.meta.resolve()
ainda retornará de forma síncrona para o código do aplicativo, mesmo se os ganchos de resolução assíncronos forem carregados.
O comportamento síncrono de 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 ganchos de resolução como funções assíncronas ou sincronizadas, dependendo de sua preferência. O código do aplicativo ainda será executado de forma síncrona, independentemente de haver ganchos de resolução assíncrona carregados.
Aplicativos executáveis únicos experimentais (SEA)
Experimental Single Executable Applications (SEA) é um novo recurso introduzido no Node.js v20 que permite agrupar seu aplicativo com o binário Node.js, permitindo que os usuários finais o distribuam e executem como um único arquivo executável.
Essa é uma solicitação de longa data da comunidade, e a equipe vem refinando a abordagem no ano passado.
No Node.js v20, a criação de um único aplicativo executável 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, preparados pelo Node.js, e são injetados no binário. Essa alteração foi feita para permitir a incorporação de vários recursos coexistentes no SEA, o que abre novos casos de uso.
Aqui está um exemplo de um arquivo sea-config.jso n:
{ "main": "myscript.js", "output": "sea-prep.blob" }
Quando executado com o 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 Outstanding Contribution from a New Arrival 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 vetoriais e capacitar a arquitetura Node.js para uma melhor experiência. Embora o recurso SEA ainda seja experimental, ele representa um novo desenvolvimento empolgante para a comunidade 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 EventTarget
, que foi cortado pela metade, resultando em um 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 mudança específica é a inclusão da versão 2.0 atualizada do Ada, um analisador de URL rápido e compatível com especificações escrito em C++.
Resumo
Neste artigo, você conheceu 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 será encerrado em abril de 2023, portanto, é recomendável começar a planejar a atualização para o Node.js v18 (LTS) ou vNode.js 20 (em breve LTS).
Gostaria de experimentar a versão mais recente do Node.js? Você pode fazer isso implantando seu aplicativo Node.js em Kinsta e receba seus primeiros US$ 20 por nossa conta. Já oferecemos suporte ao Node.js v20, o que significa que você pode testar seus novos recursos e capacidades a partir de hoje.
Agora é sua vez! Quais recursos ou melhorias você acha mais interessantes no Node.js v20? Existem alguns significativos que podemos ter esquecido? Deixe-nos saber nos comentários.