Foi lançado o Node.js 23.0.0, uma plataforma para executar aplicativos de rede em JavaScript. O Node.js 23.0 é considerado uma versão intermediária, cuja manutenção será realizada por 7 meses (até junho de 2025). Nos próximos dias, a estabilização da versão Node.js 22 será concluída, que receberá o status LTS em 29 de outubro e será suportada até abril de 2027. O suporte para versões LTS anteriores, Node.js 20.x e 18.x, continuará até abril de 2026 e 2025, respectivamente.
Principais melhorias:
- Adicionada a suporte experimental para o TypeScript, que permite a definição explícita de tipos. O suporte é ativado através das opções "—experimental-strip-types" e "—experimental-transform-types". Com a primeira opção, o trabalho com TypeScript se resume à limpeza de definições de tipos específicas desse idioma (a verificação de tipos não é realizada, o código é simplesmente transformado em JavaScript sem tipos). A segunda opção realiza a transformação de alguns elementos da sintaxe do TypeScript em código JavaScript, como enums e namespaces.
- Ativada por padrão a possibilidade de 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()" no Node.js, o módulo deve ser executado de forma síncrona (sem await no nível superior).
- Implementada a detecção automática de módulos ESM em arquivos sem extensão ou com a extensão ".js". Anteriormente, tais arquivos eram tratados como módulos CommonJS, a menos que seu tipo fosse claramente definido no arquivo package.json localizado no mesmo diretório ("type": "module"). Na nova versão, para arquivos cujo tipo não está definido no package.json, primeiro é feita uma tentativa de carregamento como módulo CommonJS, e se isso falhar, como módulo ESM.
- Implementação experimental adicionada compatível com navegadores API Web Storage, destinada ao armazenamento permanente (classe localStorage) ou temporário (classe sessionStorage) de dados no formato chave/valor. Para ativar o suporte ao Web Storage, é necessário executar com a flag "—experimental-webstorage" e especificar o caminho para o arquivo de armazenamento através da flag "—localstorage-file".
- Foi adicionado um API experimental para SQLite, permitindo o trabalho com bancos de dados usando a linguagem de consulta SQL e o armazenamento baseado na biblioteca SQLite. Além de armazenar o banco de dados em um arquivo no disco, ele também pode ser armazenado na memória, especificando " :memory:" em vez do nome do arquivo. A API acima mencionada do Web Storage também foi implementada sobre o SQLite, o que levou à adição do SQLite como uma das dependências do Node.js.
- Foi anunciada a equipe estável "node --run", destinada à execução de scripts definidos no arquivo package.json.
- Foi implementado suporte opcional para o cache de código compilado em disco para acelerar significativamente o início dos módulos. A ativação do cache é feita através da variável de ambiente NODE_COMPILE_CACHE. Em seu propósito, essa funcionalidade lembra o pacote v8-compile-cache, mas oferece desempenho superior e suporte a módulos ESM.
- Foi realizada a otimização do objeto Buffer, permitindo um aumento significativo no desempenho dos métodos Buffer.copy() e Buffer.write().
- Melhorou-se o desempenho do módulo node:fs, com uma redução nas chamadas de código em C++ durante a execução.
- O motor V8 foi atualizado para a versão 12.9, utilizada no Chromium 129.
- Apoio a sistemas de 32 bits com Windows foi removido.
- Devido à introdução de funcionalidades no Node.js e no motor V8, definidas no padrão C++20, foram aumentadas as exigências para a versão do compilador GCC. Para compilar o Node.js, agora é necessária no mínimo a versão 12 do GCC.
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
