DEV Community

Alex Spinov
Alex Spinov

Posted on

Nitro Has a Free Server Framework That Deploys Anywhere — Vercel, Cloudflare, AWS, Deno, or Bun

The Deployment Problem

You write an Express server. It runs on Node.js. Now your boss says 'deploy to Cloudflare Workers.' You rewrite everything.

Nitro builds once, deploys anywhere. Same code runs on Node, Deno, Bun, Cloudflare Workers, Vercel, Netlify, or AWS Lambda.

What Nitro Gives You

Universal Server Routes

// server/routes/hello.ts
export default defineEventHandler(() => {
  return { message: 'Hello World' };
});
// GET /hello → { message: 'Hello World' }
Enter fullscreen mode Exit fullscreen mode

File-Based Routing

server/
  routes/
    index.ts          → GET /
    users/
      index.ts        → GET /users
      [id].ts         → GET /users/:id
    api/
      posts.post.ts   → POST /api/posts
Enter fullscreen mode Exit fullscreen mode

Built-In Storage (KV, Database, File)

// Use any storage backend — configured at deploy time
export default defineEventHandler(async () => {
  await useStorage('db').setItem('key', { data: 'value' });
  const item = await useStorage('db').getItem('key');
  return item;
});
Enter fullscreen mode Exit fullscreen mode

Storage adapters: Redis, Cloudflare KV, Vercel KV, filesystem, memory.

Caching

export default defineCachedEventHandler(async () => {
  const data = await fetch('https://api.example.com/expensive');
  return data.json();
}, {
  maxAge: 60 * 60, // Cache for 1 hour
  swr: true, // Stale-while-revalidate
});
Enter fullscreen mode Exit fullscreen mode

Tasks (Background Jobs)

// server/tasks/cleanup.ts
export default defineTask({
  meta: { description: 'Clean up old data' },
  async run() {
    await db.deleteOldRecords();
    return { result: 'done' };
  },
});
Enter fullscreen mode Exit fullscreen mode

Deploy Anywhere

# Build for different targets
nitro build --preset cloudflare-pages
nitro build --preset vercel
nitro build --preset netlify
nitro build --preset node-server
nitro build --preset deno-server
nitro build --preset bun
Enter fullscreen mode Exit fullscreen mode

Same code. Different output. No rewrites.

Quick Start

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

Why This Matters

Nitro powers Nuxt 3's server engine. It proves that server code doesn't have to be tied to one platform. Write it once, deploy anywhere.


Building universal APIs? Check out my web scraping actors on Apify Store — data APIs for any platform. For custom solutions, email spinov001@gmail.com.

Top comments (0)