Foi lançada a versão Deno 1.28, uma plataforma para a execução isolada de aplicações em JavaScript e TypeScript, que pode ser utilizada para criar manipuladores que operam em servidores. A plataforma é desenvolvida por Ryan Dahl, criador do Node.js. Assim como no Node.js, o Deno utiliza o motor JavaScript V8, que também é utilizado em navegadores baseados no Chromium. No entanto, o Deno não é um desdobramento do Node.js, mas sim um projeto totalmente novo, criado do zero. O código do projeto é distribuído sob a licença MIT. Compilações estão disponíveis para Linux, Windows e macOS.
O projeto Deno foi criado para fornecer aos usuários um ambiente mais seguro e corrigir erros conceituais cometidos na arquitetura do Node.js. Para aumentar a segurança, a camada em torno do motor V8 foi escrita na linguagem Rust, que ajuda a evitar muitas vulnerabilidades decorrentes do trabalho de baixo nível com a memória. A plataforma Tokio, também escrita em Rust, é usada para lidar com solicitações de forma não bloqueante. O Tokio permite a criação de aplicações de alto desempenho baseadas em arquitetura orientada a eventos, que suportam multithreading e tratamento assíncrono de solicitações de rede.
A principal mudança na nova versão é a estabilização da compatibilidade com pacotes hospedados no repositório NPM, permitindo o uso de mais de 1,3 milhão de módulos criados para a plataforma Node.js no Deno. Por exemplo, em aplicações baseadas em Deno, agora é possível usar módulos como Prisma, Mongoose e MySQL para organização de acesso contínuo a dados, bem como frameworks como React e Vue para facilitar a operação de front-ends. No entanto, alguns módulos NPM ainda permanecem incompatíveis com o Deno, devido a vinculações a elementos de ambiente específicos do Node.js, como o arquivo package.json. Além disso, ainda não é possível usar o comando "deno compile" com módulos NPM. Futuras versões planejam corrigir essas incompatibilidades e limitações.
O suporte ao modelo baseado no sistema de módulos ECMAScript e Web API previamente aplicado no Deno foi mantido no mesmo nível, e para a importação de módulos NPM é utilizada uma abordagem familiar do Deno baseada em URL. Para acessar os módulos NPM, um prefixo de URL especial "npm:" é disponibilizado e pode ser usado de forma análoga aos módulos comuns do Deno. Por exemplo, para importar um módulo NPM, pode-se especificar 'import { chalk } from "npm:chalk@5";', e para executar um script NPM pelo terminal — "deno run —allow-env —allow-read npm:create-vite-extra".
Usar pacotes NPM no Deno é significativamente mais simples do que no Node.js, pois não há necessidade de instalação prévia dos módulos (os módulos são instalados na primeira execução do aplicativo), o arquivo package.json não é utilizado e, por padrão, o diretório node_modules não é usado (os módulos são armazenados em um diretório compartilhado, mas é possível reverter ao comportamento anterior usando a opção "—node-modules-dir").
Em aplicações baseadas em NPM, a possibilidade de usar os mecanismos de controle de acesso, isolamento e ativação de recursos avançados de segurança fornecidos pelo Deno é mantida. Para evitar ataques através de dependências questionáveis, o Deno bloqueia, por padrão, todas as tentativas de acesso ao sistema a partir das dependências e emite um aviso sobre qualquer problema detectado. Por exemplo, ao tentar um módulo acessar gravação em /usr/bin/, será exibido um pedido de confirmação para essa operação: deno run npm:install-malware ⚠️ ┌ Deno solicita acesso de gravação a /usr/bin/. ├ Solicitado por `install-malware` ├ Execute novamente com —allow-write para ignorar este prompt. └ Permitir? [y/n] (y = sim, permitir; n = não, negar) >
Entre as melhorias não relacionadas ao NPM na nova versão, destaca-se a atualização do motor V8 para a versão 10.9, a detecção automática de arquivos bloqueados, a estabilização das APIs Deno.bench(), Deno.gid(), Deno.networkInterfaces(), Deno.systemMemoryInfo() e Deno.uid(), além da adição de uma nova API instável Deno.Command() para execução de comandos (substituição universal para Deno.spawn, Deno.spawnSync e Deno.spawnChild).
Principais recursos do Deno:
- A orientação para segurança na configuração padrão. O acesso a arquivos, capacidades de rede e variáveis de ambiente estão bloqueados por padrão e exigem habilitação explícita. Os aplicativos padrão são executados em ambientes sandbox isolados e não podem acessar funcionalidades do sistema sem permissões explícitas;
- Suporte embutido a TypeScript além do JavaScript. Para verificação de tipos e geração de JavaScript, o compilador TypeScript padrão é utilizado, o que resulta em uma queda de desempenho em comparação com a análise do JavaScript no V8;
- O Runtime é fornecido na forma de um único arquivo executável autossuficiente («deno»). Para executar aplicativos usando o Deno, basta baixar um arquivo executável para sua plataforma, com cerca de 30 MB, que não tem dependências externas e não requer instalação especial no sistema. Além disso, o deno não é um aplicativo monolítico, mas sim uma coleção de pacotes crate em Rust (deno_core, rusty_v8), que podem ser usados separadamente;
- Ao iniciar o programa, bem como para carregar módulos, é possível usar endereçamento via URL. Por exemplo, para executar o programa welcome.js, pode-se usar o comando 'deno https://deno.land/std/examples/welcome.js'. O código de fontes externas é baixado e armazenado em cache no sistema local, mas nunca é atualizado automaticamente (para atualização, é necessário executar explicitamente o aplicativo com a opção '--reload');
- Processamento eficiente de solicitações de rede via HTTP, a plataforma é projetada para criar aplicativos de rede de alto desempenho;
- Capacidade de criar aplicativos web universais que podem ser executados tanto no Deno quanto em navegadores web convencionais;
- Disponibilidade de um conjunto padrão de módulos, cujo uso não requer dependências externas. Os módulos da coleção padrão passaram por auditoria e verificação de compatibilidade adicionais;
- Além do runtime, a plataforma Deno também atua como um gerenciador de pacotes e permite que dentro do código se acesse módulos por URL. Por exemplo, para carregar um módulo, pode-se especificar no código «import * as log from «https://deno.land/std/log/mod.ts». Os arquivos carregados de externos servidores por URL são armazenados em cache. A vinculação a versões de módulos é determinada através da especificação de números de versão dentro do URL, por exemplo, «https://unpkg.com/liltest@0.0.5/dist/liltest.js»;
- O conjunto integrado inclui um sistema de inspeção de dependências (comando 'deno info') e uma ferramenta para formatar código ('deno fmt');
- Todos os scripts da aplicação podem ser combinados em um único arquivo JavaScript.
Fonte: opennet.ru
