AzuraJS Logo
AzuraJSFramework
v2.2 Beta

Servidores Customizados

Use AzuraJS com Bun, Deno, Cloudflare Workers e muito mais

Servidores Customizados 🌐

AzuraJS pode ser usado com qualquer servidor que suporte a Web Fetch API, assim como o Hono! Isso dá flexibilidade para deployar no Bun, Deno, Cloudflare Workers, Vercel Edge Functions e muito mais.

Usando com Bun 🍞

Bun fornece um servidor HTTP nativo super rápido. Use AzuraJS com Bun.serve:

TypeScript

bun-server.ts
import { AzuraClient } from "azurajs";

const app = new AzuraClient();

app.get("/", (req, res) => {
  res.json({ message: "Olá do AzuraJS no Bun!" });
});

app.get("/user/:id", (req, res) => {
  res.json({ 
    userId: req.params.id,
    runtime: "Bun" 
  });
});

app.post("/data", (req, res) => {
  res.json({ 
    received: req.body,
    timestamp: Date.now() 
  });
});

// Use com o servidor nativo do Bun
const server = Bun.serve({
  port: process.env.PORT || 3000,
  fetch: app.fetch.bind(app),
});

console.log(`🚀 Servidor rodando em http://localhost:${server.port}`);

JavaScript

bun-server.js
const { AzuraClient } = require("azurajs");

const app = new AzuraClient();

app.get("/", (req, res) => {
  res.json({ message: "Olá do AzuraJS no Bun!" });
});

app.get("/user/:id", (req, res) => {
  res.json({ 
    userId: req.params.id,
    runtime: "Bun" 
  });
});

app.post("/data", (req, res) => {
  res.json({ 
    received: req.body,
    timestamp: Date.now() 
  });
});

// Use com o servidor nativo do Bun
const server = Bun.serve({
  port: process.env.PORT || 3000,
  fetch: app.fetch.bind(app),
});

console.log(`🚀 Servidor rodando em http://localhost:${server.port}`);

Execute:

bun run bun-server.ts

Por que usar Bun?

  • 3x mais rápido que Node.js
  • 🚀 Suporte nativo a TypeScript
  • 📦 Bundler integrado e test runner
  • 🔥 Hot reload pronto para uso

Usando com Deno 🦕

Deno é um runtime seguro para JavaScript e TypeScript. Use AzuraJS com Deno.serve:

TypeScript

deno-server.ts
import { AzuraClient } from "azurajs";

const app = new AzuraClient();

app.get("/", (req, res) => {
  res.json({ message: "Olá do AzuraJS no Deno!" });
});

app.get("/api/:name", (req, res) => {
  res.json({ 
    greeting: `Olá ${req.params.name}!`,
    runtime: "Deno" 
  });
});

// Use com Deno.serve
Deno.serve({ port: 3000 }, app.fetch.bind(app));

console.log("🦕 Servidor rodando em http://localhost:3000");

JavaScript

deno-server.js
const { AzuraClient } = require("azurajs");

const app = new AzuraClient();

app.get("/", (req, res) => {
  res.json({ message: "Olá do AzuraJS no Deno!" });
});

app.get("/api/:name", (req, res) => {
  res.json({ 
    greeting: `Olá ${req.params.name}!`,
    runtime: "Deno" 
  });
});

// Use com Deno.serve
Deno.serve({ port: 3000 }, app.fetch.bind(app));

console.log("🦕 Servidor rodando em http://localhost:3000");

Execute:

deno run --allow-net --allow-read deno-server.ts

Por que usar Deno?

  • 🔒 Seguro por padrão - Permissões explícitas necessárias
  • 📦 Sem package.json - Imports diretos por URL
  • 🌐 Web standards - APIs compatíveis
  • Startup rápido - Runtime otimizado

Usando com Cloudflare Workers ☁️

Deploy globalmente na rede edge da Cloudflare:

TypeScript

worker.ts
import { AzuraClient } from "azurajs";

const app = new AzuraClient();

app.get("/", (req, res) => {
  res.json({ 
    message: "Olá da Edge!",
    location: "Cloudflare Workers" 
  });
});

app.get("/api/:id", (req, res) => {
  res.json({ 
    id: req.params.id,
    deployed: "globalmente" 
  });
});

// Export para Cloudflare Workers
export default {
  fetch: app.fetch.bind(app),
};

JavaScript

worker.js
const { AzuraClient } = require("azurajs");

const app = new AzuraClient();

app.get("/", (req, res) => {
  res.json({ 
    message: "Olá da Edge!",
    location: "Cloudflare Workers" 
  });
});

app.get("/api/:id", (req, res) => {
  res.json({ 
    id: req.params.id,
    deployed: "globalmente" 
  });
});

// Export para Cloudflare Workers
module.exports = {
  fetch: app.fetch.bind(app),
};

Por que usar Cloudflare Workers?

  • 🌍 Deploy global - 200+ localizações edge
  • 0ms cold starts - Respostas instantâneas
  • 💰 Tier grátis - 100k requisições/dia
  • 🔐 Segurança integrada - Proteção DDoS

Usando com Node.js (Padrão) 🟢

AzuraJS inclui um servidor HTTP Node.js integrado:

TypeScript

node-server.ts
import { AzuraClient, applyDecorators } from "azurajs";
import { UserController } from "./controllers/UserController";

const app = new AzuraClient();

// Rota simples
app.get("/", (req, res) => {
  res.json({ message: "Olá do Node.js!" });
});

// Ou use controllers
applyDecorators(app, [UserController]);

// Servidor HTTP Node.js integrado
await app.listen(3000);

JavaScript

node-server.js
const { AzuraClient, applyDecorators } = require("azurajs");
const { UserController } = require("./controllers/UserController");

const app = new AzuraClient();

// Rota simples
app.get("/", (req, res) => {
  res.json({ message: "Olá do Node.js!" });
});

// Ou use controllers
applyDecorators(app, [UserController]);

// Servidor HTTP Node.js integrado
app.listen(3000);

Execute:

node --import tsx node-server.ts
# ou com Bun
bun run node-server.ts

Por que usar Node.js?

  • 📦 Maior ecossistema - Pacotes npm
  • 🔧 Ferramentas maduras - Bem estabelecido
  • 🏢 Pronto para produção - Testado em batalha
  • 🤝 Amplo suporte - Maioria dos provedores de hosting

Vercel Edge Functions 🔺

Deploy na rede edge da Vercel:

api/hello.ts
import { AzuraClient } from "azurajs";

const app = new AzuraClient();

app.get("/api/hello", (req, res) => {
  res.json({ message: "Olá da Vercel Edge!" });
});

export default async function handler(request: Request) {
  return app.fetch(request);
}

export const config = {
  runtime: "edge",
};

Comparação de Performance 📊

RuntimeCold StartThroughputDeploy
Bun~5ms⭐⭐⭐⭐⭐Local/VPS
Node.js~50ms⭐⭐⭐⭐Qualquer lugar
Deno~10ms⭐⭐⭐⭐Deno Deploy
Cloudflare0ms⭐⭐⭐⭐⭐Global Edge
Vercel Edge0ms⭐⭐⭐⭐Vercel

Exemplo Completo 🎯

Aqui está um exemplo completo que funciona em qualquer lugar:

universal-app.ts
import { AzuraClient } from "azurajs";
import { Controller, Get, Post, Body, Param, Res } from "azurajs/decorators";
import type { ResponseServer } from "azurajs";

@Controller("/api")
class ApiController {
  @Get("/")
  root(@Res() res: ResponseServer) {
    res.json({ 
      message: "API Universal do AzuraJS",
      runtime: typeof Bun !== "undefined" ? "Bun" : 
               typeof Deno !== "undefined" ? "Deno" : "Node.js"
    });
  }

  @Get("/users/:id")
  getUser(@Param("id") id: string, @Res() res: ResponseServer) {
    res.json({ 
      id: Number(id), 
      name: `Usuário ${id}` 
    });
  }

  @Post("/users")
  createUser(@Body() body: any, @Res() res: ResponseServer) {
    res.status(201).json({ 
      id: Date.now(), 
      ...body 
    });
  }
}

const app = new AzuraClient();
applyDecorators(app, [ApiController]);

// Escolha seu runtime:

// Bun
if (typeof Bun !== "undefined") {
  Bun.serve({ port: 3000, fetch: app.fetch.bind(app) });
}

// Deno
else if (typeof Deno !== "undefined") {
  Deno.serve({ port: 3000 }, app.fetch.bind(app));
}

// Node.js (padrão)
else {
  await app.listen(3000);
}

Dicas de Configuração ⚙️

Ao usar servidores customizados, você pode desabilitar algumas funcionalidades integradas:

azura.config.ts
import type { ConfigTypes } from "azurajs/config";

const config: ConfigTypes = {
  server: {
    port: 3000,
    cluster: false, // Desabilite para Bun/Deno/Edge
  },
  logging: {
    enabled: true,
    showDetails: false, // Menos verboso para edge
  },
};

export default config;

Melhores Práticas ✨

Use Bun para desenvolvimento - Hot reload e startup mais rápidos

Use Edge para produção - Deploy global com 0ms cold starts

Teste no Node.js - Garanta compatibilidade antes do deploy

Desabilite cluster mode - Não é necessário com servidores customizados

Próximos Passos 📖

On this page