Plataforma JavaScript Node.js 20.0 do lado do servidor disponível

Foi lançado o Node.js 20.0, uma plataforma para execução de aplicações de rede em JavaScript. O Node.js 20.0 é classificado como branch de suporte de longo prazo, mas esse status será atribuído apenas em outubro, após a estabilização. O Node.js 20.x terá suporte até 30 de abril de 2026. A manutenção da ramificação LTS anterior do Node.js 18.x durará até abril de 2025, e do ano retrasado da ramificação LTS 16.x até setembro de 2023. A ramificação LTS 14.x será descontinuada em 30 de abril, e a ramificação de teste Node.js 19.x será descontinuada em 1º de junho.

Principais melhorias:

  • O motor V8 foi atualizado para a versão 11.3, usada no Chromium 113. As alterações em comparação com o branch Node.js 19, que usava o motor Chromium 107, incluem as funções String.prototype.isWellFormed e toWellFormed, o Array.prototype e TypedArray. métodos de protótipo para trabalhar com uma cópia ao alterar objetos Array e TypedArray, o sinalizador “v” no RegExp, suporte para redimensionar ArrayBuffer e aumentar o tamanho de SharedArrayBuffer, recursão final (chamada final) em WebAssembly.
  • Foi proposto um mecanismo experimental de Modelo de Permissão que permite restringir o acesso a determinados recursos durante a execução. O suporte ao modelo de permissão é habilitado especificando o sinalizador “--experimental-permission” durante a execução. A implementação inicial oferece opções para limitar o acesso de gravação (--allow-fs-write) e leitura (--allow-fs-read) a certas partes do sistema de arquivos, processos filhos (--allow-child-process) e complementos (--no-addons)) e threads (--allow-worker). Por exemplo, para permitir a gravação no diretório /tmp e a leitura do arquivo /home/index.js, você pode especificar: node —experimental-permission —allow-fs-write=/tmp/ —allow-fs-read=/home /index.js índice.js

    Para verificar o acesso, sugere-se utilizar o método process.permission.has(), por exemplo, “process.permission.has('fs.write',"/tmp/test").

  • Os manipuladores de módulo externo ECMAScript (ESM) carregados por meio da opção "--experimental-loader" agora são executados em um thread separado, isolado do thread principal, eliminando a interseção do código do aplicativo e dos módulos ESM carregados. Semelhante aos navegadores, o método import.meta.resolve() agora é executado de forma síncrona quando chamado de um aplicativo. Em uma das próximas ramificações do Node.js, o suporte para carregamento do ESM está planejado para ser transferido para a categoria de recursos estáveis.
  • O módulo node:test (test_runner), projetado para criar e executar testes em JavaScript que retornam resultados no formato TAP (Test Anything Protocol), foi estabilizado.
  • Uma equipe de desenvolvimento separada foi formada responsável pela otimização de desempenho, que, ao preparar um novo branch, trabalhou para acelerar vários componentes de tempo de execução, incluindo análise de URL, fetch() e EventTarget. Por exemplo, a sobrecarga da inicialização do EventTarget foi reduzida pela metade, o desempenho do método URL.canParse() foi significativamente melhorado e a eficiência dos temporizadores foi melhorada. Também inclui o lançamento de um analisador de URL de alto desempenho, Ada 2.0, escrito em C++.
  • Prosseguiu o desenvolvimento da capacidade experimental de entrega de aplicações sob a forma de um único ficheiro executável (SEA, Single Executable Applications). A criação de um arquivo executável agora requer a substituição de um blob gerado a partir de um arquivo de configuração no formato JSON (em vez de substituir um arquivo JavaScript).
  • Compatibilidade aprimorada da API Web Crypto com implementações de outros projetos.
  • Adicionado suporte oficial para Windows em sistemas ARM64.
  • A implementação do suporte para extensões WASI (WebAssembly System Interface) para a criação de aplicativos WebAssembly independentes continuou. Removida a necessidade de especificar um sinalizador de linha de comando especial para ativar o suporte WASI.

A plataforma Node.js pode ser usada tanto para suporte de aplicativos da Web no lado do servidor quanto para criar programas comuns de rede de clientes e servidores. Para ampliar a funcionalidade das aplicações para Node.js, foi preparado um grande acervo de módulos, onde você encontra módulos com implementação de servidores e clientes HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, módulos para integração com diversos frameworks web, manipuladores WebSocket e Ajax, conectores para SGBD (MySQL, PostgreSQL, SQLite, MongoDB), motores de templates, motores CSS, implementações de algoritmos criptográficos e sistemas de autorização (OAuth), analisadores XML.

Para lidar com um grande número de solicitações paralelas, o Node.js usa um modelo de execução de código assíncrono baseado no processamento de eventos sem bloqueio e na definição de manipuladores de retorno de chamada. Os métodos suportados para conexões de multiplexação incluem epoll, kqueue, /dev/poll e select. Para multiplexação de conexões, é utilizada a biblioteca libuv, que é um complemento da libev em sistemas Unix e do IOCP no Windows. A biblioteca libeio é usada para criar um pool de threads e c-ares é integrado para realizar consultas DNS em modo sem bloqueio. Todas as chamadas do sistema que causam bloqueio são executadas dentro do pool de threads e então, como manipuladores de sinal, passam o resultado de seu trabalho de volta por meio de um canal sem nome. A execução do código JavaScript é garantida através da utilização do motor V8 desenvolvido pelo Google (além disso, a Microsoft está desenvolvendo uma versão do Node.js com o motor Chakra-Core).

Em sua essência, o Node.js é semelhante aos frameworks Perl AnyEvent, Ruby Event Machine, Python Twisted e à implementação de eventos em Tcl, mas o loop de eventos no Node.js está oculto do desenvolvedor e se assemelha ao processamento de eventos em um aplicativo da web rodando no navegador. Ao escrever aplicativos para node.js, é necessário levar em consideração as especificidades da programação orientada a eventos, por exemplo, em vez de fazer “var result = db.query(“select..”);” com a espera pela conclusão do trabalho e posterior processamento dos resultados, o Node.js utiliza o princípio da execução assíncrona, ou seja, o código é transformado em “db.query(“select..”, function (result) {processamento de resultado});”, no qual o controle passará imediatamente para outro código, e o resultado da consulta será processado conforme os dados chegam.

Fonte: opennet.ru

Adicionar um comentário