Foi lançado o Node.js 20.0, uma plataforma para a execução de aplicativos de rede em JavaScript. O Node.js 20.0 é classificado como uma versão com suporte a longo prazo, mas esse status será atribuído apenas em outubro, após a estabilização. O suporte ao Node.js 20.x será mantido até 30 de abril de 2026. O suporte para a versão anterior LTS, Node.js 18.x, continuará até abril de 2025, enquanto a versão anterior 16.x será mantida até setembro de 2023. O suporte para a versão LTS 14.x será encerrado em 30 de abril, e para a versão intermediária Node.js 19.x, em 1 de junho.
Principais melhorias:
- O motor V8 foi atualizado para a versão 11.3, utilizada no Chromium 113. Entre as mudanças em relação ao ramo Node.js 19, que usava o motor Chromium 107, destacam-se as funções String.prototype.isWellFormed e toWellFormed, métodos Array.prototype e TypedArray.prototype para manipulação de cópias ao alterar objetos Array e TypedArray, a flag 'v' em RegExp, suporte à redimensionamento de ArrayBuffer e ampliação de SharedArrayBuffer, e a recursão em cauda (tail-call) em WebAssembly.
- Предложен экспериментальный механизм Permission Model, позволяющий ограничить доступ к определённым ресурсам в процессе исполнения. Поддержка Permission Model включается через указание при запуске флага «—experimental-permission». В начальной реализации предложены опции для ограничения доступа на запись (—allow-fs-write) и чтение (—allow-fs-read) к определённым частям ФС, дочерним процессам (—allow-child-process), дополнениям (—no-addons) и потокам (—allow-worker). Например, чтобы разрешить запись в каталог /tmp и чтение файла /home/index.js можно указать: node —experimental-permission —allow-fs-write=/tmp/ —allow-fs-read=/home/index.js index.js
Para verificar o acesso, recomenda-se usar o método process.permission.has(), por exemplo, 'process.permission.has('fs.write', '/tmp/test')'.
- Os manipuladores de módulos ECMAScript (ESM) carregados através da opção '--experimental-loader' agora são executados em uma thread separada, isolada da thread principal, o que elimina a interseção entre o código de aplicativos e os módulos ESM carregados. De forma semelhante aos navegadores, o método import.meta.resolve() quando chamado do aplicativo agora é executado em modo síncrono. Em uma das próximas versões do Node.js, planeja-se que o suporte à carga de ESM se torne um recurso estável.
- O módulo node:test (test_runner), destinado à criação e execução de testes em JavaScript que retornam resultados no formato TAP (Test Anything Protocol), foi classificado como estável.
- Foi formada uma equipe separada de desenvolvedores responsável pela otimização de desempenho, que, ao preparar uma nova versão, trabalhou para acelerar vários componentes de tempo de execução, incluindo análise de URL, fetch() e EventTarget. Por exemplo, a sobrecarga ao inicializar o EventTarget foi reduzida pela metade, a performance do método URL.canParse() melhorou significativamente e a eficiência dos temporizadores foi aumentada. Além disso, foi incluída uma versão de parser de URL de alto desempenho — Ada 2.0, escrita em C++.
- Continuou o desenvolvimento da funcionalidade experimental para o fornecimento de aplicativos na forma de um único arquivo executável (SEA, Aplicativos Executáveis Únicos). A criação do arquivo executável agora requer a substituição de um blob, gerado com base no arquivo de configuração em formato JSON (em vez da substituição do arquivo JavaScript).
- Melhorada a compatibilidade da API Web Crypto com implementações de outros projetos.
- Adicionada a suportação oficial para Windows em sistemas ARM64.
- Continuou a implementação do suporte a extensões WASI (WebAssembly System Interface) para a criação de aplicativos WebAssembly isolados. Removida a necessidade de especificar uma bandeira especial da linha de comando para ativar o suporte a WASI.
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 paralelas, 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 determinação de manipuladores de callback. Como métodos de multiplexação de conexões, são suportados métodos como epoll, kqueue, /dev/poll e select. Para a multiplexação de conexões, usa-se a biblioteca libuv, que é uma camada de abstração sobre libev em sistemas Unix e sobre IOCP no Windows. Para criar um pool de threads, a biblioteca libeio é utilizada, e para a execução de consultas DNS de maneira não bloqueante, o c-ares foi integrado. Todas as chamadas de sistema que causam bloqueio são executadas dentro do pool de threads e, assim como os manipuladores de sinais, transmitem o resultado de seu trabalho de volta através de um canal não nomeado (pipe). A execução de código JavaScript é garantida pela utilização do mecanismo V8 desenvolvido pela Google (adicionalmente, a Microsoft desenvolve uma versão do Node.js com o mecanismo Chakra-Core).
Essencialmente, o Node.js é semelhante aos frameworks Perl AnyEvent, Ruby Event Machine, Python Twisted e à implementação de eventos em Tcl, mas o ciclo de processamento de eventos (event loop) no Node.js é oculto do desenvolvedor e se assemelha ao processamento de eventos em uma aplicação web que funciona em um navegador. Ao escrever aplicativos para Node.js, é necessário considerar a especificidade da programação orientada a eventos; por exemplo, em vez de executar "var result = db.query('select..');" aguardando a conclusão e posterior processamento dos resultados, no Node.js utiliza-se o princípio da execução assíncrona, ou seja, o código é transformado em "db.query('select..', function (result) { processar resultado });", onde o controle é imediatamente transferido para o restante do código, e o resultado da consulta será processado conforme os dados forem recebidos.
Fonte: opennet.ru
