Scriptc: o compilador TypeScript-to-Native da Vercel que dispensa JavaScript
A Vercel lançou o Scriptc, um compilador que transforma TypeScript diretamente para nativo, sem JavaScript engine no binário. 281 pontos e 156 comentários no HN.
Ando há anos a fugir de dependências pesadas. Cada vez que um projeto Node precisa de 300MB de node_modules, morro um bocadinho por dentro. Por isso, quando a Vercel anunciou o Scriptc — um compilador que pega em TypeScript normal e produz binários nativos sem runtime de JavaScript — cliquei imediatamente.
O projeto apareceu no Hacker News a 27 de julho de 2026 com 281 pontos e 156 comentários. Testei-o no próprio dia em dois projetos pessoais. O resultado é uma mistura de entusiasmo e frustração.
O que o Scriptc faz
O Scriptc compila TypeScript para código nativo. O binário final não tem Node, V8, nem qualquer JavaScript engine. O output é um executável standalone de ~178KB — compara isso com os 90MB de um container Node mínimo.
$ scriptc build fib.ts && ls -la fib
-rwxr-xr-x 178K fib # binário nativo, ~2ms startup
O TypeScript é o mesmo que usas no Node. O compilador é o TypeScript real — não é um fork. O que compila comporta-se byte-for-byte como o Node.
A arquitetura usa três tiers: código compilado estaticamente para código nativo (o default), código que corre dinamicamente via quickjs-ng (~620KB, para dependências npm que contêm JS), e código rejeitado (com diagnóstico preciso, nunca silenciosamente mal compilado). A superfície estática cobre classes, closures, generics monomorfizados, async/await com stackful fibers, exceções, e praticamente toda a API do Node: fs, path, crypto, http, net, tls, fetch, e mais.
Se 99% do teu código compila estaticamente, o binário final é incrivelmente pequeno e rápido. O problema é que “99% do teu código” raramente acontece.
O que não compila
Aqui está a parte frustrante: o próprio README avisa que o scriptc é experimental e só suporta um subconjunto de JavaScript, TypeScript e APIs do Node.js. O Scriptc rejeita muita coisa — funções com parâmetros opcionais usadas como valores (SC1090), Promise.reject (SC2020), e, por omissão, dependências npm e código com any, que só compilam com a opção --dynamic (que embute o quickjs-ng).
O comando scriptc coverage mostra exatamente o que compila e o que não compila:
$ scriptc coverage app.ts
statements analyzed 4481
compile statically 4451 (99%)
blockers:
x2 functions with optional parameters as values SC1090
x1 Promise.reject SC2020
O problema é que os 1% que não compilam são exatamente as dependências npm. O quickjs-ng pode correr o JS dessas dependências, mas qualquer valor que cruze de volta para o código nativo é validado em runtime — e uma mentira de tipo lança um TypeError. Isto significa que o comportamento pode ser diferente entre o binário nativo e o Node, dependendo de como a dependência foi escrita.
Para projetos greenfield sem dependências pesadas, o Scriptc é fantástico. Para projetos existentes com 50 dependências, ainda é um caminho doloroso.
O que significa para o ecossistema
O Scriptc não é o primeiro compilador TypeScript-to-native — o Bun também tem algo semelhante (por confirmar), tal como o Static Hermes da Meta. Mas, segundo o autor, é o primeiro que trata o TypeScript como linguagem de primeira classe para compilação nativa, em vez de o compilar primeiro para JavaScript.
Isto é significativo. Durante anos, o TypeScript foi tratado como um linter glorificado que compila para JavaScript. O Scriptc trata-o como uma linguagem de sistemas — com tipos que sobrevivem à compilação e permitem otimizações que o V8 nunca poderia fazer.
Se a Vercel conseguir aumentar a superfície estática — especialmente para dependências npm comuns como express, lodash e axios — o Scriptc pode tornar-se a ferramenta que finalmente nos liberta dos 300MB de node_modules.
Recursos adicionais
Partilhar
Comentários 0
Ainda sem comentários — sê o primeiro.