DEV Community

Alex Spinov
Alex Spinov

Posted on

Nitro Has a Free Universal Server Engine That Deploys Anywhere

Nitro is the server engine behind Nuxt, Analog, and SolidStart. But you can use it standalone to build APIs that deploy to 15+ platforms with zero config changes.

The Pitch

Write your server once. Deploy to:

  • Node.js
  • Cloudflare Workers
  • Deno Deploy
  • Vercel Edge
  • Netlify Edge
  • AWS Lambda
  • Azure Functions
  • Bun
  • Static hosting
  • ...and more

Same code. Different output. One command.

Getting Started

npx giget@latest nitro my-api
cd my-api && npm install && npm run dev
Enter fullscreen mode Exit fullscreen mode

File-Based API Routes

// routes/hello.ts
export default defineEventHandler(() => {
  return { message: "Hello from Nitro!" };
});
// GET /hello → { "message": "Hello from Nitro!" }

// routes/users/[id].ts
export default defineEventHandler((event) => {
  const id = getRouterParam(event, "id");
  return { userId: id };
});
// GET /users/123 → { "userId": "123" }

// routes/users/index.post.ts
export default defineEventHandler(async (event) => {
  const body = await readBody(event);
  return { created: body };
});
// POST /users → creates user
Enter fullscreen mode Exit fullscreen mode

Built-in Features

Caching

// routes/data.ts
export default defineCachedEventHandler(async () => {
  const data = await fetchExpensiveData();
  return data;
}, {
  maxAge: 60 * 10, // Cache for 10 minutes
  swr: true,       // Stale-while-revalidate
});
Enter fullscreen mode Exit fullscreen mode

Storage (Universal Key-Value)

// Use any storage: fs, redis, S3, Cloudflare KV, etc.
export default defineEventHandler(async () => {
  await useStorage().setItem("cache:users", { data: [...] });
  const cached = await useStorage().getItem("cache:users");
  return cached;
});
Enter fullscreen mode Exit fullscreen mode

Configure storage backends:

// nitro.config.ts
export default defineNitroConfig({
  storage: {
    cache: { driver: "redis", url: "redis://localhost:6379" },
    assets: { driver: "fs", base: "./assets" },
  },
});
Enter fullscreen mode Exit fullscreen mode

Tasks (Background Jobs)

// tasks/cleanup.ts
export default defineTask({
  meta: { description: "Clean expired sessions" },
  run() {
    // Your cleanup logic
    return { result: "Cleaned 42 sessions" };
  },
});
Enter fullscreen mode Exit fullscreen mode

WebSockets

// routes/_ws.ts
export default defineWebSocketHandler({
  open(peer) {
    peer.send("Welcome!");
    peer.subscribe("chat");
  },
  message(peer, message) {
    peer.publish("chat", message.text());
  },
  close(peer) {
    peer.unsubscribe("chat");
  },
});
Enter fullscreen mode Exit fullscreen mode

Deploy (One Config Change)

// nitro.config.ts
export default defineNitroConfig({
  preset: "cloudflare-pages",  // or "vercel", "netlify", "deno-server", "bun", etc.
});
Enter fullscreen mode Exit fullscreen mode
npm run build
# Output is optimized for the target platform
Enter fullscreen mode Exit fullscreen mode

Need universal API solutions? I build web tools and data pipelines. Email spinov001@gmail.com or explore my Apify tools.

Top comments (0)