- Bun 1.0 executa, compila, testa e depura JavaScript e TypeScript em uma única ferramenta, com estabilidade e pronto para produção
- Com o objetivo de ser uma substituição do Node.js, oferece suporte a APIs e resolução de módulos do Node, como
fs,path,net,__dirname,processe resolução denode_modules, e aplicações baseadas em Express, Koa, Hono, além de Next.js, Remix, Nuxt, Astro, SvelteKit, Nest, SolidStart e Vite funcionam no Bun - A primeira build nativa para Windows está sendo disponibilizada, mas é altamente experimental; no momento, suporta apenas o runtime JavaScript, e o gerenciador de pacotes, o test runner e o bundler estão desativados
- Entre as mudanças desde o Bun 0.8, foram adicionados suporte a Next.js, Astro e Nest.js, e o comando descontinuado
bun devfoi removido, passando agora a executar o script"dev"dopackage.json - Entre as novas APIs do Node.js suportadas estão
child_process.fork()e IPC,fs.cp(),fs.cpSync(),fs.watchFile(),fs.unwatchFile()e Unix socket emnode:http - Um transpiler de JavaScript embutido no runtime permite executar arquivos
.js,.ts,.cjs,.mjs,.jsxe.tsxsem dependências adicionais - Suporta ESM e CommonJS ao mesmo tempo, permitindo usar
importerequire()no mesmo arquivo sem depender de extensão de arquivo ou da configuração"type": "module"nopackage.json - APIs padrão da Web como
fetch,Request,Response,WebSocketeReadableStreamvêm embutidas, permitindo uso sem pacotes comonode-fetchews - O hot reloading pode ser usado com a opção
--hot, eBun.serve()também passa a ser alvo de hot reloading - A API do Bun fornece
Bun.file(),Bun.write(),Bun.serve(),bun:sqliteeBun.password, cobrindo entrada e saída de arquivos, servidor HTTP/WebSocket, SQLite, hash e verificação de senhas com bcrypt e argon2 - O gerenciador de pacotes oferece
bun install,bun add,bun removeebun update, em um modo compatível com npm que lê opackage.jsone grava emnode_modules - O test runner
bun:testfornece uma API compatível com Jest e remapeia internamente imports de@jest/globalsevitestparabun:test - O bundler oferece suporte a bundling e minify de JavaScript e TypeScript, além de uma API de plugins compatível com esbuild e JavaScript macros que executam funções JavaScript no momento do bundle para inserir valores inline
1 comentários
Opiniões no Hacker News
Estou participando do desenvolvimento do Bun. Se tiverem perguntas, posso responder
Seria bom se um moderador trocasse o link para o post do blog, porque ele explica melhor do que a página de releases do GitHub
Post do blog: https://bun.sh/blog/bun-v1.0
O que mais me impressiona é poder usar
importerequire()no mesmo arquivo, sem se preocupar com.js/.cjs/.mjsou"type": "module"Sem isso, o ecossistema Node.js está quase completamente quebrado, e o Bun parece que pode salvá-lo. Para mim, o mais incrível no Bun não é o desempenho, mas as escolhas pragmáticas e amigáveis ao desenvolvedor que Jarred vem fazendo de forma consistente
Ele apenas escolheu outro compromisso, e o resultado provavelmente é que outro conjunto de pacotes não vai funcionar. Fico curioso se há alguma base para acreditar que o Bun descobriu um segredo que as outras ferramentas não conseguiram resolver
Para mim, esse é o jeito certo. O ecossistema dividido do Node causou um grande dano à linguagem e ao runtime como um todo
importversusrequireSe você não está usando uma app React ou uma solução pronta, o ecossistema moderno de JS é realmente doloroso, especialmente para quem está criando uma biblioteca pequena. Nem consigo imaginar o quanto isso deve ser difícil e enlouquecedor para quem está começando
Só o fato de o Bun resolver esse problema já é motivo suficiente para eu experimentá-lo. Eu não esperava sentir esse tipo de expectativa por mais um runtime ou ferramenta de build de JS, e estou animado porque a equipe do Bun pode deixar meu dia um pouco mais são
bundlersaiu no TypeScript 5.0, os últimos seis meses foram em geral tranquilosTive problemas muito raramente, mas até os projetos corrigirem, contornei com
pnpm patche ajustes nos metadados. Dá para dizer que 2023 é o ano dos módulos, e a água está boatype: modulee.js/.cjs/.mjs/.tsEm apps de produção, obviamente é preciso ter clareza sobre o que se usa, mas em prototipagem o comportamento permissivo do Bun permite escrever o código primeiro e se preocupar com o resto depois
Acho que daria para usar uma frase melhor do que substituto drop-in em uma versão 1.0 que decidiu não implementar todo o
node:Fiquei bem decepcionado ao ver que os dois primeiros projetos que tentei não eram substituíveis de forma drop-in, e agora desconfio de toda a comunicação do Bun
Para contextualizar, ambos os projetos usam
osc, que precisa dedgram. Encontrei um ticket de acompanhamento de pedido de recurso de 9 meses atrás, mas não havia plano de implementação, e pesquisar pordgramnesta página de anúncio não retorna nadaComo sugestão rápida, seria bom listar os módulos sem suporte no Bun 1.0 e incluí-los na seção de compatibilidade com Node.js
Edição: encontrei a documentação de suporte ao Node — https://bun.sh/docs/runtime/nodejs-apis . Seria bom linká-la nas notas de lançamento
Olhando por alto, parece haver cerca de 17 módulos implementados, 17 parcialmente implementados e 7 não implementados
1.0.0-betado que de1.0.0Acabei de instalar a v1.0.0 e executei
bun repl, mas ele falhou com código de saída 1; descobri que o REPL tenta usar a porta 3000, que no meu ambiente já estava em uso. Pelos bugs reportados no GitHub, parece que há muitos probleminhas desse tipo, então acho que é preciso manter certo ceticismo em relação a todas as afirmaçõesMesmo assim, fiquei profundamente impressionado com a velocidade e o resultado. Não imaginava que este projeto chegaria até aqui tão rápido; achava que levaria muito mais tempo. Em comparação, o Deno começou bem antes e agora parece estar bem atrás, então pretendo usar o Bun em projetos pessoais
Como relato anedótico, estamos testando o Bun em uma aplicação grande, com clientes existentes na casa dos milhões, e até agora o único problema não foi o Bun em si, mas o fato de
patch-packageainda não dar suporte ao arquivo de lockbun.lockbO Bun é, sem dúvida, muito mais rápido que o Yarn. E digo isso como alguém que gosta muito do Yarn
“Note — For a detailed breakdown of Node.js compatibility, check out: bun.sh/nodejs.”
A lista detalhada especifica os módulos sem suporte
Não conseguimos usar o AWS SDK v3 por causa de erros ao fazer parsing da resposta, e como
node:cryptonão está totalmente implementado, não conseguimos usar coisas que dependem deoctokitoujsonwebtoken. Não dá para rodar os testes porquejest.resetAllMocks()não existe, e em outro projeto obun testnem chegava a executar, dizendo que a chamada a uma biblioteca compartilhada estava incorretaEntão meu fluxo local virou “tentar executar com Bun e, se falhar, executar de novo com Node”. Pelo menos dá para usá-lo como substituto do npm, mas ainda é difícil imaginar usá-lo para rodar serviços. Quando funciona, é realmente impressionante, então estou animado com o futuro; mas, se o ponto de venda é compatibilidade com Node, acho difícil chamar isso de 1.0
Fico curioso se houve alguma intenção de mover o chat da comunidade para uma plataforma que não seja o Discord
O Discord já foi mencionado várias vezes no HN por problemas de acessibilidade, privacidade e dependência de uma plataforma proprietária, e também não parece combinar muito bem com o espírito open source. [1] também vale a leitura
[1] https://drewdevault.com/2021/12/28/Dont-use-Discord-for-FOSS...
Nos comentários do anúncio do Bun 0.6, uma pergunta parecida recebeu tantos downvotes que quase foi sinalizada: https://news.ycombinator.com/item?id=35970869
Nos comentários do anúncio do Bun 0.8, a mesma pergunta quase não recebeu atenção, e a reação foi algo como “outros projetos também usam…”: https://news.ycombinator.com/item?id=37244294
Sinceramente, o Discord é um bom lugar para projetos de software livre e open source manterem sua comunicação. As alegações do texto de que “ao escolher o Discord você legitima a plataforma e tira valor das plataformas FOSS” parecem bem frágeis. O Discord é, de fato, uma plataforma legítima, gratuita, com muitos recursos atraentes e boa acessibilidade. Acima de tudo, escolher o Discord não faz o valor das plataformas de comunicação FOSS desaparecer
A recomendação de “use IRC” também não faz sentido. IRC é muito difícil de acessar para muitas pessoas que não têm familiaridade com computadores e software
Bun é baseado em investimento de venture capital, então fico curioso sobre o plano de monetização
Ao avaliar uma tecnologia nova, considero “a probabilidade de essa tecnologia ainda estar sendo desenvolvida ativamente daqui a N anos”. O Bun precisa ganhar dinheiro de alguma forma; caso contrário, o financiamento vai acabar
É ótimo que a licença do Bun seja MIT, e isso dá esperança de que o projeto possa não morrer mesmo se a empresa quebrar. Torço para que a empresa dê certo, mas, se eu adotasse o Bun, ficaria curioso sobre quais upsells poderiam aparecer depois
A Oven oferecerá hospedagem serverless muito rápida e integração contínua para apps JavaScript de backend e frontend, e será movida pelo Bun
Pretende oferecer suporte a frameworks de frontend como Next.js, Vite, SvelteKit e SolidStart, e frameworks de backend como Express, Fastify e NestJS
O plano é operar seus próprios servidores na edge de data centers ao redor do mundo, e a Oven quer integrar toda a stack JavaScript de ponta a ponta, até o hardware, para criar novas possibilidades
bun deployÉ uma estratégia comum: primeiro conseguir adoção em massa entre desenvolvedores e depois conduzi-los suavemente para a própria hospedagem de aplicações
Sofri tanto tentando acompanhar o projeto paralelo de uma única pessoa que migrei tudo para Rollup e nunca olhei para trás
As preocupações com um projeto financiado por venture capital e com um projeto paralelo aleatório claramente são diferentes, mas o risco final em ambos é: “o que acontece se quem criou isso não puder mais me dar suporte?”
É aquele modelo de divulgar tudo como “open source” para obter relatórios de bugs gratuitos, contribuições, marketing e adoção, e depois empurrar para um produto comercial
A proposta de substituir a confusão em camadas das ferramentas baseadas em Node é muito atraente
Porque poderia reduzir
node,ts-node,nodemon,tsc,jest,ts-jest,webpack, Babel, duas especificações de módulos incompatíveis, a confusão do UMD, três gerenciadores de pacotes e a explosão de arquivos de configuração causada por tudo issoO ecossistema de ferramentas em torno do JavaScript é, sem dúvida, a maior dor, e transforma ES6 + TypeScript, que originalmente é uma linguagem bastante competente e agradável, em puro trabalho braçal. Espero que o Bun consiga resolver isso
Imagino que seja parecido com passar de CMake para Cargo
O post do blog mostra de forma muito convincente a proposta de valor de um software tudo em um mais simples
Hoje em dia me atraem mais softwares “baterias incluídas” do que “traga tudo você mesmo”, então estou ansioso para testar o Bun
Parece uma versão em runtime das ferramentas Rome, que tentavam substituir vários softwares por uma única alternativa mais rápida. O Rome fracassou e passou a ser OSS com uma nova equipe. Espero que o Bun tenha mais sucesso, mas certamente é um problema difícil de resolver
Quando se possui e controla diretamente o hardware e o sistema operacional, como a Apple, é possível otimizar o sistema em profundidade e também dar a tranquilidade de que todos os dispositivos funcionam de forma integrada. Um conjunto de ferramentas tudo em um reduz o peso de sair correndo atrás da solução perfeita e permite usar a solução que já está à sua frente
Para quem já usou tanto Bun quanto Deno, gostaria de ouvir qual dos dois é, na prática, o sucessor do Node mais convincente
O site do Bun afirma que ele tem desempenho muito melhor que o Deno, e fico curioso se isso também é verdade na prática. Se for, também gostaria de entender por quê. O Deno parece ter objetivos parecidos
Também fico curioso se há grandes diferenças filosóficas entre os dois projetos. Por exemplo, não sei se é algo como o Bun querer reimplementar todo tipo de coisa, enquanto o Deno quer um novo jeito pós-Node. Alguém já usou bastante os dois?
Tanto Bun quanto Deno são ferramentas baseadas em investimento de venture capital, então tenho uma desconfiança básica quanto à monetização e à sustentabilidade
O principal argumento de venda do Bun parece ser desempenho, mas eu raramente tive grandes problemas de desempenho com Node. Ele não é absurdamente rápido, mas é muito mais provável esbarrar em limitações de entrada/saída do que na velocidade do Node
O principal argumento de venda do Deno era ser, em vários aspectos, um “Node feito direito”, com empacotamento melhor, uso pleno de ES6 etc., e esse argumento me atraía, mas parece que eles desistiram da tentativa de criar um novo ecossistema e foram para o caminho de adicionar compatibilidade com Node
Ao mesmo tempo, melhorias recentes no próprio Node, como o test runner nativo e o suporte embutido a
.env, são animadoras. Por isso, é difícil encontrar um motivo forte para usar Bun ou Deno e, mesmo que eu mude, preciso de um caminho concreto para voltar ao Node caso as ferramentas da nova geração se tornem insustentáveisO Bun tenta agrupar tudo e tornar tudo muito rápido, mantendo ao máximo a compatibilidade com Node. Ele não abandona o ecossistema existente
O Deno adotou uma postura muito confrontadora em relação ao ecossistema Node, e agora está adicionando suporte de volta
Do ponto de vista de sucessor, vejo o Bun como a única opção, porque ele tenta inovar com novos recursos mantendo a compatibilidade com Node
O Deno me parece mais um runtime alternativo ao Node com segurança como princípio máximo, além de suporte embutido a TypeScript e JSX e ferramentas como linter. Ele também é baseado no V8. Parece estar mais próximo da forma que Ryan Dahl passou a achar, tardiamente, que o Node deveria ter tido
O Bun é tecnicamente baseado no WebKit, embora eu não saiba exatamente por quê, e parece não ser apenas um runtime, mas uma ferramenta all-in-one melhor. Ele também oferece compatibilidade básica com frameworks existentes. Até pouco tempo atrás, o Deno não era compatível com npm, e também fico curioso se essa era a intenção desde o começo ou se foi uma mudança de direção em andamento
No mês passado, testamos Deno e Bun como runtimes alternativos. Em resumo, em uma base de código com certa complexidade, o Bun quase sempre funciona e o Deno quase sempre não funciona
Agora rodamos todos os testes tanto em Node.js quanto em Bun, e desistimos da tentativa de adotar o Deno
Correção: parece que isso está mudando. Obrigado pela correção
Originalmente, o plano era lançar ontem, mas havia uma falha em um teste de streaming do corpo de
fetch()que precisava ser corrigidaO post do blog não deveria ser publicado até o Bun 1.0 aparecer no GitHub, mas o link estava acessível publicamente e havia um bug que não escondia o rascunho no feed RSS
O bug real não estava no streaming do corpo de
fetch(), mas nos bindings do JavaScriptCore ao obter uma propriedade de um objeto em que a propriedade podia não estar definida. Parte do código só verificava se o valor era umJSCell, sem checar se era um objeto;JSCellnormalmente é um objeto, mas coisas como símbolos ou BigInt não sãoJSObjectThread de ontem: https://news.ycombinator.com/item?id=37424724
Como dica adicional, para instalações do tipo “baixar da internet em vez de usar o repositório da distribuição”, poderiam fornecer exemplos de playbooks/conjuntos de tarefas do Ansible com checksums apropriados, como SHA-256. O mesmo vale para Puppet, embora seja um pouco mais complexo
Isso poderia aliviar um pouco o trabalho dos administradores de sistemas e, se quiserem dar um nome, poderiam chamar de SAX, ou seja, experiência do administrador de sistemas
Se o Bun consegue executar e empacotar apps TypeScript React de forma nativa, fico me perguntando qual é a vantagem de usar Vite.js por cima dele
O guia do site oficial mostra como usar Bun + Vite.js ao criar um app TypeScript React, o que deixa confuso. [1]
Há uma issue relacionada também no GitHub. [2]
Será que o Vite.js fica responsável por cenários mais complexos ou casos de uso avançados que o Bun não consegue lidar? Meu uso do Vite.js se resume a começar com uma configuração básica TS+React e fazer o build, então talvez eu esteja deixando passar algo
[1] https://bun.sh/guides/ecosystem/vite
[2] https://github.com/oven-sh/bun/issues/250
Ainda não tenho experiência usando Bun, mas entendo que dá para usar Bun em vez de Node para rodar o servidor de desenvolvimento local, usar Bun no lugar de esbuild ou tsc, Rollup ou uma combinação deles para bundling, e usar Bun no lugar de Babel e TypeScript para transformação
O que o Vite oferece é uma configuração que facilita o desenvolvimento de aplicações front-end e proporciona uma boa experiência do desenvolvedor no trabalho local
Ainda acho que a complexidade de configuração faz com que combinar os dois não seja tão bom assim
Compatibilidade com o ecossistema existente é um objetivo central do Bun, então a ideia é permitir que as pessoas comecem a usá-lo diretamente em bases de código existentes e o adotem gradualmente em mais partes
E, como a maioria dos novos meta-frameworks, como Nuxt, SvelteKit, Astro, SolidStart e Qwik, roda sobre o Vite, isso pode abrir um caminho de adoção para o Bun
tscEu diria que o Bun não “executa apps TypeScript React” tanto assim; ele mais oferece transformação JSX/TSX de forma nativa