Edge Runtime — nima, Node.js dan farqi, qachon kerak

~15 daq · Next.js · Performance va Optimizatsiya

Muammodan boshlaylik

Serveringiz Frankfurtda. Toshkentdagi foydalanuvchi uchun har bir so'rov ~80 ms, Tokiodagi uchun ~250 ms faqat "yo'lda". Middleware har bir so'rovda ishlaydi — u sekin bo'lsa, butun sayt sekin.

Bundan tashqari, serverless funksiya uzoq vaqt chaqirilmasa — "sovuq start": Node.js ni ishga tushirish, modullarni yuklash — yuzlab millisekund.


Edge Runtime nima?

Edge Runtime — Node.js emas, balki V8 izolyatlari asosidagi yengil muhit (Cloudflare Workers, Vercel Edge kabi). Kod butun dunyo bo'ylab tarqalgan serverlarda — foydalanuvchiga eng yaqin joyda ishlaydi.

Node.js Runtime Edge Runtime
API lar To'liq Node.js: fs, net, child_process... Faqat Web standartlari: fetch, Request, crypto.subtle, TextEncoder
npm paketlar Hammasi Faqat Node API siz ishlaydiganlari
Sovuq start 100–1000 ms ~0–50 ms
Joylashuv Bitta (yoki bir nechta) region Foydalanuvchiga yaqin
Kod hajmi chegarasi Katta Kichik (bir necha MB)
Bajarilish vaqti Uzoq Qisqa
Ma'lumotlar bazasi (TCP) ✅ ❌ — faqat HTTP drayverlar

Hayotiy o'xshatma

Katta markaziy ombor va mahallalardagi kichik kiosklar. Ombor (Node.js) — hamma narsa bor, lekin uzoqda. Kiosk (Edge) — uyingiz yonida, darhol xizmat qiladi, lekin u yerda faqat non, sut va gazeta: muzlatgich yoki mebel so'rasangiz — omborga yuborishadi.


Runtime ni tanlash

// app/api/joylashuv/route.ts
export const runtime = 'edge'

export async function GET(request: Request) {
  const mamlakat = request.headers.get('x-vercel-ip-country') ?? 'noma\'lum'
  return Response.json({ mamlakat })
}
export const runtime = 'nodejs'   // standart

Route Handler lar, sahifalar va layout lar uchun export const runtime. Middleware — standart holatda Edge da ishlaydi.

[!INFO] Next.js 15.2+ da middleware uchun Node.js runtime ham qo'llab-quvvatlanadi (export const config = { runtime: 'nodejs' }), Next.js 16 ning proxy.ts i esa standart holatda Node.js da ishlaydi. Bu middleware da ORM va to'liq Node API laridan foydalanish imkonini beradi — versiyangiz hujjatini tekshiring.


Edge ga mos vazifalar

✅ Yaxshi:

  • Middleware — auth cookie tekshiruvi, redirect, A/B test, geolokatsiya (28-dars)
  • Oddiy, tez API lar: feature flag lar, joylashuvga qarab kontent
  • OG rasm generatsiyasi — next/og (ImageResponse)
  • Tashqi API ga yengil proxy, javobni o'zgartirish
  • Streaming javoblar (AI chat)

❌ Mos emas:

  • An'anaviy ORM (Prisma standart sozlamasi, TCP ulanishli drayverlar)
  • fs, sharp, bcrypt (native) kabi Node.js ga bog'liq kutubxonalar
  • Og'ir hisob-kitob, uzoq davom etadigan ishlar
  • Katta bog'liqliklar

OG rasm — Edge misoli

// app/blog/[slug]/opengraph-image.tsx
import { ImageResponse } from 'next/og'

export const runtime = 'edge'
export const size = { width: 1200, height: 630 }
export const contentType = 'image/png'

export default async function Rasm({ params }: { params: Promise<{ slug: string }> }) {
  const { slug } = await params
  const post = await fetch(`https://api.dokon.uz/postlar/${slug}`).then((r) => r.json())

  return new ImageResponse(
    (
      <div style={{ width: '100%', height: '100%', display: 'flex', alignItems: 'center',
                    justifyContent: 'center', background: '#0b1120', color: 'white', fontSize: 64, padding: 80 }}>
        {post.sarlavha}
      </div>
    ),
    size
  )
}

Har bir maqola uchun ijtimoiy tarmoqlarda chiroyli rasm — avtomatik.


Ma'lumotlar bazasi Edge da

TCP ulanish yo'q — HTTP orqali ishlaydigan drayverlar kerak:

export const runtime = 'edge'

import { neon } from '@neondatabase/serverless'

export async function GET() {
  const sql = neon(process.env.DATABASE_URL!)
  const natija = await sql`SELECT id, nomi FROM kategoriyalar ORDER BY nomi`
  return Response.json(natija)
}

Variantlar: Neon serverless, PlanetScale, Turso, Upstash Redis, Supabase (HTTP), Drizzle bilan (49-dars).

[!WARNING] Edge funksiya foydalanuvchiga yaqin, lekin baza bitta regionda bo'lsa — Tokiodagi edge funksiya Frankfurtdagi bazaga har so'rovda boradi va hatto sekinroq bo'lishi mumkin. Bazaga ko'p murojaat qiladigan kod uchun Node.js runtime + bazaga yaqin region odatda yaxshiroq.


Qanday tanlash

Har bir so'rovda ishlaydimi va juda tez bo'lishi kerakmi? (middleware)
  └── Ha → Edge
Baza bilan ko'p ishlaydimi yoki Node kutubxonalari kerakmi?
  └── Ha → Node.js (bazaga yaqin regionda)
Oddiy, mustaqil, global auditoriya uchun?
  └── Edge
Shubha bo'lsa → Node.js (standart)

[!TIP] Vercel da Node.js funksiyalari ham endi tez sovuq start va bir nechta region bilan ishlaydi (Fluid compute). Ko'p loyihalar uchun Edge ga ataylab o'tish shart emas — faqat aniq foyda bo'lganda.


Tez-tez uchraydigan xatolar

1. Edge da Node modulini import qilish

Module not found: Can't resolve 'fs'
The edge runtime does not support Node.js 'crypto' module

Web standart muqobil: crypto.subtle, fetch; yoki runtime = 'nodejs'.

2. Middleware da Prisma

Edge da ishlamaydi (42-dars) — bazasiz auth.config.ts.

3. "Edge = har doim tezroq"

Baza uzoqda bo'lsa — aksincha.


Xulosa

Edge — V8 izolyatlari, foydalanuvchiga yaqin, sovuq start deyarli yo'q
Faqat Web API lar: fetch, Request, crypto.subtle; fs, TCP, native modullar yo'q
export const runtime = 'edge' | 'nodejs' (standart)
Mos: middleware, OG rasm, geolokatsiya, yengil API, streaming
Baza — HTTP drayverlar; bazadan uzoq edge — sekin
Shubha bo'lsa — Node.js

Keyingi bo'lim

61-dars: Vitest — Next.js bilan sozlash

Testing bo'limi: Next.js loyihasida tez unit va komponent testlari.