O bundler do Bun tem suporte de primeira classe para HTML. Construa sites estáticos, landing pages e aplicações web com zero configuração. Basta apontar o Bun para seu arquivo HTML e ele cuida de tudo mais.
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="./styles.css" />
<script src="./app.ts" type="module"></script>
</head>
<body>
<img src="./logo.png" />
</body>
</html>Para começar, passe arquivos HTML para o bun.
bun ./index.htmlBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Press h + Enter to show shortcutsO servidor de desenvolvimento do Bun fornece recursos poderosos com zero configuração:
- Bundling Automático - Empacota e serve seu HTML, JavaScript e CSS
- Suporte Multi-Entry - Lida com múltiplos entry points HTML e glob entry points
- JavaScript Moderno - Suporte nativo para TypeScript e JSX
- Configuração Inteligente - Lê
tsconfig.jsonpara paths, opções JSX, decorators experimentais e mais - Plugins - Plugins para TailwindCSS e mais
- ESM e CommonJS - Use ESM e CommonJS em seus arquivos JavaScript, TypeScript e JSX
- Bundling e Minificação de CSS - Empacota CSS de tags
<link>e declarações@import - Gerenciamento de Assets - Cópia e hashing automático de imagens e assets; Reescreve caminhos de assets em JavaScript, CSS e HTML
Single Page Apps (SPA)
Quando você passa um único arquivo .html para o Bun, o Bun o usará como uma rota fallback para todos os caminhos. Isso o torna perfeito para single page apps que usam roteamento do lado do cliente:
bun index.htmlBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Press h + Enter to show shortcutsSeu React ou outra SPA funcionará imediatamente — sem configuração necessária. Todas as rotas como /about, /users/123, etc. servirão o mesmo arquivo HTML, permitindo que seu roteador do lado do cliente lide com a navegação.
<!doctype html>
<html>
<head>
<title>My SPA</title>
<script src="./app.tsx" type="module"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>Multi-page apps (MPA)
Alguns projetos têm várias rotas separadas ou arquivos HTML como entry points. Para suportar múltiplos entry points, passe todos eles para o bun:
bun ./index.html ./about.htmlBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Routes:
/ ./index.html
/about ./about.html
Press h + Enter to show shortcutsIsso servirá:
index.htmlem/about.htmlem/about
Padrões glob
Para especificar múltiplos arquivos, você pode usar padrões glob que terminam em .html:
bun ./**/*.htmlBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Routes:
/ ./index.html
/about ./about.html
Press h + Enter to show shortcutsNormalização de caminho
O caminho base é escolhido a partir do prefixo comum mais longo entre todos os arquivos.
bun ./index.html ./about/index.html ./about/foo/index.htmlBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Routes:
/ ./index.html
/about ./about/index.html
/about/foo ./about/foo/index.html
Press h + Enter to show shortcutsJavaScript, TypeScript e JSX
O transpiler do Bun implementa nativamente suporte para JavaScript, TypeScript e JSX. Saiba mais sobre loaders no Bun.
NOTE
O transpiler do Bun também é usado em runtime.ES Modules e CommonJS
Você pode usar ESM e CJS em seus arquivos JavaScript, TypeScript e JSX. O Bun lidará com a transpilação e bundling automaticamente.
Não há pré-build ou etapa de otimização separada. Tudo é feito ao mesmo tempo.
Saiba mais sobre resolução de módulos no Bun.
CSS
O parser CSS do Bun também é implementado nativamente (com cerca de 58.000 linhas de Zig).
Também é um bundler CSS. Você pode usar @import em seus arquivos CSS para importar outros arquivos CSS.
Por exemplo:
@import "./abc.css";
.container {
background-color: blue;
}body {
background-color: red;
}Isso produz:
body {
background-color: red;
}
.container {
background-color: blue;
}Referenciando assets locais em CSS
Você pode referenciar assets locais em seus arquivos CSS.
body {
background-image: url("./logo.png");
}Isso copiará ./logo.png para o diretório de output e reescreverá o caminho no arquivo CSS para incluir um hash de conteúdo.
body {
background-image: url("./logo-[ABC123].png");
}Importando CSS em JavaScript
Para associar um arquivo CSS com um arquivo JavaScript, você pode importá-lo em seu arquivo JavaScript.
import "./styles.css";
import "./more-styles.css";Isso gera ./app.css e ./app.js no diretório de output. Todos os arquivos CSS importados do JavaScript serão empacotados em um único arquivo CSS por entry point. Se você importar o mesmo arquivo CSS de múltiplos arquivos JavaScript, ele será incluído apenas uma vez no arquivo CSS de output.
Plugins
O servidor de desenvolvimento suporta plugins.
Tailwind CSS
Para usar TailwindCSS, instale o plugin bun-plugin-tailwind:
# Ou qualquer cliente npm
bun install --dev bun-plugin-tailwindEntão, adicione o plugin ao seu bunfig.toml:
[serve.static]
plugins = ["bun-plugin-tailwind"]Então, referencie TailwindCSS em seu HTML via tag <link>, @import em CSS ou import em JavaScript.
<!-- Referencie TailwindCSS em seu HTML -->
<link rel="stylesheet" href="tailwindcss" />@import "tailwindcss";import "tailwindcss";Variáveis de ambiente inline
O Bun pode substituir referências process.env.* em seu JavaScript e TypeScript com seus valores reais em tempo de build. Isso é útil para injetar configuração como URLs de API ou feature flags em seu código frontend.
Servidor de desenvolvimento (runtime)
Para inline variáveis de ambiente ao usar bun ./index.html, configure a opção env em seu bunfig.toml:
[serve.static]
env = "PUBLIC_*" # apenas inline env vars começando com PUBLIC_ (recomendado)
# env = "inline" # inline todas as variáveis de ambiente
# env = "disable" # desabilita substituição de env var (padrão)NOTE
Isso funciona apenas com referências literais `process.env.FOO`, não `import.meta.env` ou acesso indireto como `const env = process.env; env.FOO`.Se uma variável de ambiente não estiver definida, você pode ver erros de runtime como ReferenceError: process is not defined no navegador.
Então execute o servidor de desenvolvimento:
PUBLIC_API_URL=https://api.example.com bun ./index.htmlBuild para produção
Ao buildar HTML estático para produção, use a opção env para inline variáveis de ambiente:
# Inline todas as variáveis de ambiente
bun build ./index.html --outdir=dist --env=inline
# Apenas inline env vars com um prefixo específico (recomendado)
bun build ./index.html --outdir=dist --env=PUBLIC_*// Inline todas as variáveis de ambiente
await Bun.build({
entrypoints: ["./index.html"],
outdir: "./dist",
env: "inline",
});
// Apenas inline env vars com um prefixo específico (recomendado)
await Bun.build({
entrypoints: ["./index.html"],
outdir: "./dist",
env: "PUBLIC_*",
});Exemplo
Dado este arquivo fonte:
const apiUrl = process.env.PUBLIC_API_URL;
console.log(`API URL: ${apiUrl}`);E executando com PUBLIC_API_URL=https://api.example.com:
PUBLIC_API_URL=https://api.example.com bun build ./index.html --outdir=dist --env=PUBLIC_*O output empacotado conterá:
const apiUrl = "https://api.example.com";
console.log(`API URL: ${apiUrl}`);Ecoar logs de console do navegador para o terminal
O servidor de desenvolvimento do Bun suporta streaming de logs de console do navegador para o terminal.
Para habilitar, passe a flag --console na CLI.
bun ./index.html --consoleBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Press h + Enter to show shortcutsCada chamada para console.log ou console.error será transmitida para o terminal que iniciou o servidor. Isso é útil para ver erros do navegador no mesmo local onde você executa seu servidor. Isso também é útil para agentes de IA que observam a saída do terminal.
Internamente, isso reusa a conexão WebSocket existente do hot module reloading para enviar os logs.
Editar arquivos no navegador
O servidor de desenvolvimento frontend do Bun tem suporte para Automatic Workspace Folders no Chrome DevTools, que permite salvar edições de arquivos no navegador.
Atalhos de Teclado
Enquanto o servidor está executando:
o + Enter- Abrir no navegadorc + Enter- Limpar consoleq + Enter(ouCtrl+C) - Sair do servidor
Build para Produção
Quando estiver pronto para fazer deploy, use bun build para criar bundles de produção otimizados:
bun build ./index.html --minify --outdir=distawait Bun.build({
entrypoints: ["./index.html"],
outdir: "./dist",
minify: true,
});Watch Mode
Você pode executar bun build --watch para observar mudanças e rebuild automaticamente. Isso funciona bem para desenvolvimento de bibliotecas.
API de Plugin
Precisa de mais controle? Configure o bundler através da API JavaScript e use o HTMLRewriter built-in do Bun para pré-processar HTML.
await Bun.build({
entrypoints: ["./index.html"],
outdir: "./dist",
minify: true,
plugins: [
{
// Um plugin que torna todas as tags HTML minúsculas
name: "lowercase-html-plugin",
setup({ onLoad }) {
const rewriter = new HTMLRewriter().on("*", {
element(element) {
element.tagName = element.tagName.toLowerCase();
},
text(element) {
element.replace(element.text.toLowerCase());
},
});
onLoad({ filter: /\.html$/ }, async args => {
const html = await Bun.file(args.path).text();
return {
// O bundler do Bun escaneará o HTML por tags <script>, tags <link rel="stylesheet"> e outros assets
// e os empacotará automaticamente
contents: rewriter.transform(html),
loader: "html",
};
});
},
},
],
});O Que é Processado?
O Bun automaticamente lida com todos os assets web comuns:
- Scripts (
<script src>) são executados através do bundler JavaScript/TypeScript/JSX do Bun - Stylesheets (
<link rel="stylesheet">) são executados através do parser e bundler CSS do Bun - Imagens (
<img>,<picture>) são copiadas e tem hash gerado - Mídia (
<video>,<audio>,<source>) são copiadas e tem hash gerado - Qualquer tag
<link>com um atributohrefapontando para um arquivo local é reescrito para o novo caminho e tem hash gerado
Todos os caminhos são resolvidos relativos ao seu arquivo HTML, tornando fácil organizar seu projeto da maneira que quiser.
Como isso funciona
Este é um pequeno wrapper em torno do suporte do Bun para imports HTML em JavaScript.
Adicionando um backend ao seu frontend
Para adicionar um backend ao seu frontend, você pode usar a opção "routes" em Bun.serve.
Saiba mais na documentação full-stack.