Foi lançado o Node.js 22.0, uma plataforma para execução de aplicações de rede em JavaScript. O Node.js 22.0 é classificado como uma versão de suporte a longo prazo, mas esse status só será atribuído em outubro, após a estabilização. O suporte ao Node.js 22.x será mantido até 30 de abril de 2027. O suporte à versão anterior LTS Node.js 20.x continuará até abril de 2026, e à versão anterior à anterior LTS 18.x até abril de 2025. O suporte à versão intermediária Node.js 21.x será encerrado em 1º de junho de 2024.
Principais melhorias:
- O motor V8 foi atualizado para a versão 12.4, usada no Chromium 124. Em comparação com a versão Node.js 21, que utilizava o motor V8 11.8, as seguintes mudanças foram observadas:
- Suporte à extensão WasmGC, que facilita a portabilidade de programas escritos em linguagens de programação que utilizam coletor de lixo (como Kotlin, PHP, Java etc.) para WebAssembly. O WasmGC adiciona novos tipos de estruturas e arrays, para os quais pode ser aplicada alocação de memória não linear.
- Suporte ao método Array.fromAsync(), que retorna de forma assíncrona uma nova instância do objeto Array, copiada a partir de objetos semelhantes a arrays, que podem ser enumeráveis (iteráveis) ou enumeráveis de forma assíncrona (async iterables).
- Suporte a métodos para trabalhar com iteradores, como .map, .filter, .find, .take, .drop, .forEach e .reduce.
- Suporte ao objeto Set, que define uma coleção de valores e oferece métodos com a implementação de operações típicas de conjuntos, como intersecções, uniões, diferenças e complemento.
- Incluído por padrão o compilador JIT otimizado Maglev, que visa a geração rápida de código de máquina de alto desempenho para código JavaScript utilizado ativamente. A ativação do Maglev permite acelerar significativamente a execução de aplicativos CLI de curta duração, que não realizam operações longas, por exemplo, o tempo de execução do teste Jetstream é reduzido em 7,5%, e o teste Speedometer em 5%.
- O desempenho com fluxos foi acelerado pela alteração do valor da opção highWaterMark de 16 KB para 65 KB (que define o limite até o qual a gravação é bufferizada). Essa mudança resulta em um aumento no consumo de memória, portanto, aplicativos que dependem de um volume limitado de RAM podem precisar reverter para o valor anterior chamando setDefaultHighWaterMark().
- A performance do API fetch() e do test runner foi aumentada pela eficiência na criação de instâncias de AbortSignal. Aumentou a eficiência dos APIs relacionados ao trabalho síncrono com sistemas de arquivos.
- Foi fornecida uma funcionalidade experimental para usar a chamada "require()" para carregar módulos JavaScript ESM (ECMAScript Modules) de forma síncrona. Os módulos ESM são utilizados em navegadores e substituem os módulos CommonJS, específicos do Node.js. Para carregar um módulo ESM através de "require()", ele deve ser executado de forma síncrona (sem await no nível superior). O suporte é ativado através da flag "—experimental-require-module".
- Foi adicionada uma funcionalidade experimental para executar scripts definidos no arquivo package.json, usando o comando "—run ".
- O comando "node —watch" foi transferido para a categoria estável com a implementação do modo de observação, que reinicia o processo ao alterar um arquivo importado (por exemplo, ao executar "node —watch index.js", o processo será automaticamente reiniciado ao modificar o index.js).
- A implementação interna do API WebSocket foi estabilizada, permitindo usar WebSocket no modo cliente sem a necessidade de instalar dependências adicionais.
- Foi adicionada suporte parcial ao API Navigator.
- Foi adicionada suporte ao formato de compressão deflate-raw no API Webstreams.
- Adicionadas as funções glob e globSync ao módulo node:fsmodule para correspondência de caminhos de arquivos por padrão.
- Foi melhorado o tratamento de pilhas IPv6 mal configuradas. Foi implementado o algoritmo Happy Eyeballs para uma reversão rápida em caso de problemas com o IPv6.
- O API util foi declarado obsoleto.
- As versões das dependências foram atualizadas: npm 10.5.1, libuv 1.48.0, simdutf 5.2.3, c-ares 1.28.1, zlib 1.3.0.1-motley-24c07df, simdjson para 3.8.0, ada 2.7.7 e undici 6.6.0.
A plataforma Node.js pode ser utilizada tanto para suporte do lado do servidor de aplicações web quanto para criar programas de rede comuns tanto do lado do cliente quanto do servidor. Para expandir a funcionalidade das aplicações Node.js, foi preparada uma grande coleção de módulos, onde é possível encontrar módulos com implementações servidores e clientes HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, módulos para integração com diversos frameworks web, manipuladores WebSocket e Ajax, conectores a bancos de dados (MySQL, PostgreSQL, SQLite, MongoDB), motores de template, motores CSS, implementações de algoritmos de criptografia e sistemas de autorização (OAuth), parsers XML.
Para garantir o processamento de um grande número de solicitações simultâneas, o Node.js utiliza um modelo assíncrono de execução de código, baseado em processamento de eventos em modo não bloqueante e na definição de manipuladores de callback. Métodos como epoll, kqueue, /dev/poll e select são suportados para multiplexação de conexões. A biblioteca libuv é utilizada para multiplexar conexões, sendo uma camada sobre a libev em sistemas Unix e sobre IOCP no Windows. A biblioteca libeio é utilizada para criar um pool de threads (thread pool), enquanto que o c-ares é integrado para realizar consultas DNS em modo não bloqueante. Todas as chamadas de sistema que causam bloqueio são executadas dentro do pool de threads e, assim como os manipuladores de sinal, transmitem o resultado de seu trabalho de volta através de um canal anônimo (pipe).
A execução de código JavaScript é garantida através do uso do motor V8 desenvolvido pela Google (além disso, a Microsoft desenvolve uma versão do Node.js com o motor Chakra-Core). Essencialmente, o Node.js é semelhante a frameworks como Perl AnyEvent, Ruby Event Machine, Python Twisted e a implementação de eventos em Tcl, mas o loop de eventos no Node.js é oculto do desenvolvedor e se assemelha ao processamento de eventos em uma aplicação web que roda no navegador.
Fonte: opennet.ru
