Node.js passa a oferecer suporte à execução de arquivos TypeScript sem configuração adicional
(nodejs.org)- O Node.js foi aprimorado para executar arquivos TypeScript diretamente
- Agora é possível executar arquivos
.tsimediatamente, sem configuração adicional nem transpilações - Os desenvolvedores podem aumentar a eficiência do trabalho sem tsconfig.json nem instalação de bundlers separados
- Esse recurso foi oficialmente incorporado a partir da versão v22.18.0 (LTS) do Node.js
- Espera-se como resultado uma redução da barreira entre o desenvolvimento em JavaScript e TypeScript
Suporte do Node.js à execução direta de TypeScript
- O Node.js introduziu recentemente, na versão v22.18.0 (LTS), um recurso que permite executar diretamente arquivos TypeScript (.ts) sem configurações ou ferramentas separadas
- Antes, para executar código TypeScript, eram necessários transpiladores externos ou bundlers como ts-node, esbuild e Babel; agora, o próprio Node.js reconhece e executa código TypeScript sem essas ferramentas
- Com esse recurso, os desenvolvedores podem executar arquivos
.tsdiretamente no Node.js sem arquivo de configuração tsconfig.json nem bibliotecas adicionais - Em prototipagem, desenvolvimento experimental e execução de scripts, a produtividade e a praticidade no desenvolvimento aumentam significativamente
- Espera-se também maior integração entre projetos JavaScript e TypeScript, além de uma redução da barreira de entrada para novos desenvolvedores
Outras mudanças dignas de nota
- esm: implementação de
import.meta.main - fs: melhoria no processamento de eventos do fs com base em AsyncIterator
- permission: suporte ao envio de flags do modelo de permissões ao executar subprocessos
- sqlite: adição da opção
readBigInts - src/permission: suporte a
permission.has(addon) - url: adição da API
fileURLToPathBuffer - watch: adição da flag
--watch-kill-signal - worker: aprimoramento do objeto
Workercomo async disposable
Atualizações relacionadas a commits e documentação
- Inclui remoção de código desnecessário, organização do ambiente de build e da toolchain, além do upgrade para npm 10.9.3
- Correções em indicadores detalhados de estabilidade e números de RFC na documentação, como
globals.md,child_process.mdehttp2 - Inclusão de vários testes e aplicação de correções de bugs
Arquivos de distribuição
- Instaladores e binários disponíveis para Windows, macOS (Intel/Apple Silicon) e Linux (x64, ARM, PPC, s390x, AIX)
- O código-fonte e os arquivos completos da release podem ser baixados na página oficial de distribuição do Node.js
- A documentação da API foi atualizada com base na v22.18.0
7 comentários
Até que enfim... espero que isso se consolide logo.
Parece que pode ser bom para executar scripts simples, mas para projetos reais há muitas limitações, então não parece algo que eu vá usar muito.
Também é preciso acertar a extensão e o caminho por causa dos erros
ERR_MODULE_NOT_FOUND/ERR_UNSUPPORTED_DIR_IMPORT,e recursos como o NestJS, que precisam de suporte à compilação do TypeScript com a configuração
"emitDecoratorMetadata", acabam não podendo ser usados, então...O
--experimental-strip-typespassa a ser aplicado por padrão?De qualquer forma, eu não uso
enum, então, pelos meus critérios, só o comportamento de remover tipos já foi mais do que suficiente para rodar bem.Vai ficar muito mais prático!
Não dá pra segurar o joinha.
Mesmo achando que já era bom o suficiente com a flag
--no-experimental-strip-types.Parece ainda melhor.
Comentários no Hacker News
node:testno Node.js, acho que agora o Node.js é uma escolha padrão convincente na maioria dos casos. Rodar comtsxjá era um grande ganho de qualidade de vida, mas ainda não era perfeito. A asserção de tipos em runtime na borda está sendo em grande parte resolvida com ferramentas comozod,ts-restetrpc, e hoje em dia o desenvolvimento full-stack em TypeScript ficou realmente fácil.tsdiretamente e ainda traz um runner de testes embutido de bom nível (com suporte a--watch). Os pacotes embutidos também estão melhorando. No caso denode:fs/promises, por exemplo, graças ao top-level await ficou bem mais fácil fazer trabalhos assíncronos em loop. Demorou para convencer todo mundo a adotar uma abordagem prática, mas agora a experiência está realmente agradávelvitesthoje facilita muita coisa, mas eu já perdi tempo demais só configurando ambiente de testes para arquivos.ts. Acho quetrpcets-restresolvem problemas completamente diferentes. Dá para usar os dois, mas em produção evitotrpcporque não consigo ter controle direto sobre as URLs da API, nem gerenciar e descontinuar URLs antigas de forma natural. No caso dets-rest, normalmente prefiro compartilharzode os tipos diretamente para gerenciar eu mesmo os pares de request/response da API. E sempre me incomoda ver-restno nome de algo que é claramente uma ferramenta de RPCtsx. Mesmo removendo os tipos, JSX ainda precisa ser transformado em JavaScript, então queria entender essa parte.mjs). Faz um tempo que estou afastado do ecossistema, então queria saber o que mudou depois dissonode_modules(relacionado: documentação oficial do node.js). Então fico me perguntando como ficam as dependências de projeto. Escrevi uma biblioteca de modelos de dados em TypeScript e queria importá-la no meu app ainda em TypeScript. Queria saber se essa regra vale só para pacotes npm ou para toda e qualquer dependência. Há uma oportunidade aí. Eu criei um runtime em Go para executar TypeScript (mais exatamente JS em geral), e o sobek usado pela equipe do Grafana talvez só precisasse ganhar a função de remover tipos. Se surgir um runtime que realmente adote TypeScript como padrão, sinto que isso pode ser a verdadeira inovação além do Node.js. Sem transpiler, sem typescript-go, sem Rust (embora Rust ainda tenha seu charme 😉), bastaria um sistema com um bom parser que acompanhe source maps e tipos em modo de depuração. De qualquer forma, ficam meu reconhecimento e agradecimento ao time do Node e a todos os contribuidores. Como o Node virou padrão, parece que todos nós vamos atrás dele. A API de embedding também é simples e agradável de usar, o que facilita até para gerar executáveis standaloneprivatenode_modulesnapinão estavam implementadas, e também lembro de problemas como a opçãorecursiveemopendirsendo ignorada. Estou torcendo para o Bun alcançar isso, mas ainda não parece pronto para uso profissional em projetos grandes. Os recursos exclusivos do Bun também parecem legais à primeira vista, mas na prática deixam a desejar. A documentação também não tem a mesma qualidade da do Node.jslocalAddressignorado em conexões TCPEventEmitter(parcialmente resolvidos com eventemitter2)node_modulese reinstalarJá usei os recursos de TS e runner de testes do próprio Node, mas ainda não estão no nível do Bun. Por enquanto, quando preciso desse tipo de funcionalidade, continuo usando Bun. No ecossistema Node aprendi que, em vez de apostar tudo em uma única solução, é melhor combinar ferramentas especializadas.
Bun.js: uso como runtime Node, para execução de TS e testes. Já experimentei várias opções como TSX, TS-Node e o próprio Node
NPM: uso para executar scripts de tooling
PNPM: uso para instalar dependências. (Na minha opinião é o melhor entre npm, yarn e bun)
Biome.js: uso para linting. É melhor do que qualquer outra ferramenta de lint que já usei
import { stripTypeScriptTypes } from 'node:module') também está exposta. Em apps web simples sem dependências de frontend, dá para fazer tudo em TypeScript e, ao servir os scripts de frontend, apenas remover os tipos (projeto de exemplo)tsc, e a informação de tipo é removida. Em Python, as anotações de tipo também são ignoradas em runtime, e em Java parte das informações de tipo, como alguns genéricos, também desaparece no bytecodetscseparadamente funciona muito bem para mimtsxque permite exatamente isso: executar sem build/transpile. É muito útil durante o desenvolvimento. Comtsx --watch, subimos o servidor direto do código TS e ele reinicia automaticamente quando há mudanças. Daqui para frente, talvez dê para montar algo parecido só comnodemone recursos embutidos do Node. Para fazer type checking em runtime, seria preciso suporte no nível do V8, e isso seria quase uma reescrita completaenum, que casos reais de uso existem?