O lançamento do Node.js 18.0, uma plataforma para executar aplicações de rede em JavaScript, foi realizado. O Node.js 18.0 foi classificado como uma versão de suporte de longo prazo, mas esse status só será atribuído em outubro, após a estabilização. O suporte para o Node.js 18.x será mantido até abril de 2025. O suporte para a versão LTS anterior Node.js 16.x durará até abril de 2024, e para a versão LTS anterior 14.x até abril de 2023. O suporte para a versão LTS 12.x será encerrado em 30 de abril, e para a versão intermediária Node.js 17.x em 1 de junho.
Principais melhorias:
- O motor V8 foi atualizado para a versão 10.1, utilizada no Chromium 101. Em comparação com a versão Node.js 17.9.0, agora há suporte para recursos como os métodos findLast e findLastIndex para pesquisa de elementos a partir do final do array e a função Intl.supportedValuesOf. A API Intl.Locale foi aprimorada. A inicialização de campos de classes e métodos privados foi acelerada.
- O API fetch() experimental agora está ativado por padrão, destinado a carregar recursos pela rede. A implementação é baseada em código do cliente HTTP/1.1 undici e se aproxima do API semelhante fornecido em navegadores. Inclui suporte para interfaces FormData, Headers, Request e Response para manipulação dos cabeçalhos HTTP de requisições e respostas. const res = await fetch('https://nodejs.org/api/documentation.json'); if (res.ok) { const data = await res.json(); console.log(data); }
- Foi adicionada uma implementação experimental da API Web Streams, que fornece acesso a fluxos de dados recebidos pela rede. A API permite adicionar manipuladores para trabalhar com dados à medida que as informações chegam pela rede, sem precisar esperar o carregamento do arquivo completo. Agora, em Node.js, estão disponíveis objetos como ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream e DecompressionStream.
- A API Blob, que permite encapsular dados brutos imutáveis para uso seguro em diferentes contextos de trabalho, foi tornada estável.
- A API BroadcastChannel, que facilita a troca de mensagens de forma assíncrona no formato 'um remetente - muitos receptores', tornou-se estável.
- Um módulo experimental node:test foi adicionado para criar e executar testes em JavaScript, retornando resultados no formato TAP (Test Anything Protocol).
- Foi assegurada a formação de compilações prontas para Red Hat Enterprise Linux (RHEL) 8 e outras distribuições baseadas em Glibc 2.28+, incluindo Debian 10 e Ubuntu 20.04, além de macOS 10.15+. Devido a problemas na construção do mecanismo V8, a geração de compilações de 32 bits para Windows foi temporariamente interrompida.
- Foi fornecida uma possibilidade experimental de compilar um arquivo executável do Node.js com componentes escolhidos pelo usuário, inicializados na execução. Para definir os componentes iniciais, foi adicionada a opção «—node-snapshot-main» ao script de configuração, por exemplo, «./configure —node-snapshot-main=marked.js; name node»
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
