Коли ваш сайт обслуговує користувачів по всьому світу, затримка відповіді стає критичною. Кожен roundtrip до origin-сервера додає сотні мілісекунд, погіршуючи LCP та TTFB. Edge-функції на Deno Deploy вирішують цю проблему, виконуючи серверні функції на краю мережі — у 35+ регіонах, на V8 Isolates без холодного старту, що напряму покращує Core Web Vitals. Ми розробляємо такі функції під ключ: middleware, генерацію OG-зображень, кешування, авторизацію та персоналізацію на Edge.
Наш досвід — 5+ років у Edge-розробці, 15+ проєктів під ключ. Ми маємо 5+ років досвіду та 15+ виконаних проєктів, що підтверджує нашу експертність у сфері Edge-функцій. Ми гарантуємо стабільність і відповідність Core Web Vitals. Вартість розробки простої Edge-функції починається від 15 000 грн, а середня економія на CDN-трафіку сягає 40%. На відміну від Lambda або Cloud Functions, код виконується за мілісекунди від користувача, тому що не піднімає контейнер — ізолят уже готовий. Як зазначено в документації Deno Deploy, платформа використовує V8 Isolates і не потребує холодного старту. Типові задачі: A/B-тестування на рівні CDN, персоналізація за геолокацією, middleware для авторизації, проксіювання запитів із трансформацією, генерація динамічних OG-зображень.
| Параметр | Edge Functions (Deno Deploy) | Cloud Functions (AWS Lambda) |
|---|---|---|
| Холодний старт | Відсутній (ізолят прогрітий) | ~200 мс-1 с (контейнер) |
| Географія | 35+ регіонів | Вибір регіону при деплої |
| Мови | TypeScript Deno нативно | Багато, але налаштування шарів |
| Вбудоване сховище | Deno KV (глобальне) | Потрібне зовнішнє |
Завдяки відсутності холодного старту Edge Functions на Deno Deploy обробляють запити до 10 разів швидше, ніж AWS Lambda. Edge Layer для сайту дозволяє реалізувати персоналізовану обробку запитів на рівні CDN. Швидкий SSR на Edge можливий завдяки відсутності холодного старту.
Як працює Deno Deploy
Кожна функція — це ES module з обробником Deno.serve. Платформа не підтримує файлову систему (крім bundle), немає setTimeout з довгими затримками, немає фонового виконання після відповіді (крім waitUntil).
// entry.ts
Deno.serve(async (req: Request) => {
const url = new URL(req.url);
if (url.pathname === '/api/geo') {
const country = req.headers.get('x-deno-country') ?? 'unknown';
const region = req.headers.get('x-deno-region') ?? 'unknown';
return Response.json({ country, region });
}
return new Response('Not Found', { status: 404 });
});
Деплой через CLI однією командою: deployctl deploy --project=my-site entry.ts.
Чому Edge Functions швидші за звичайний бекенд?
Ключова перевага — відсутність холодного старту та виконання на периферії. Запит обробляється в регіоні користувача, latency знижується з 200-500 мс до 10-30 мс. Це напряму покращує LCP та TTFB. Крім того, Edge-функції розвантажують origin-сервер, обробляючи кешування та авторизацію без зайвих roundtrip.
Middleware для авторизації: як усунути roundtrip до бекенду?
Часто потрібно перевірити JWT до origin. На Edge це відбувається без звернення до основного сервера:
import { create, verify, getNumericDate } from 'https://deno.land/x/[email protected]/mod.ts';
const JWT_SECRET = Deno.env.get('JWT_SECRET')!;
async function getKey(secret: string): Promise<CryptoKey> {
const enc = new TextEncoder();
return await crypto.subtle.importKey(
'raw',
enc.encode(secret),
{ name: 'HMAC', hash: 'SHA-256' },
false,
['sign', 'verify']
);
}
Deno.serve(async (req: Request) => {
const url = new URL(req.url);
if (url.pathname.startsWith('/public') || url.pathname === '/') {
return await fetch(req);
}
const authHeader = req.headers.get('Authorization');
if (!authHeader?.startsWith('Bearer ')) {
return new Response('Unauthorized', { status: 401 });
}
const token = authHeader.slice(7);
try {
const key = await getKey(JWT_SECRET);
const payload = await verify(token, key);
const modifiedReq = new Request(req, {
headers: {
...Object.fromEntries(req.headers),
'x-user-id': String(payload.sub),
'x-user-role': String(payload.role ?? 'user'),
},
});
return await fetch(modifiedReq);
} catch {
return new Response('Invalid token', { status: 401 });
}
});
Типова помилка — невірний імпорт ключа: використовуйте crypto.subtle.importKey з правильним форматом.
Як інтегрувати Edge-функції з існуючим сайтом?
Deno Deploy працює як Edge Layer перед origin. Схема проста: DNS → Deno Deploy → Origin Server.
- Налаштуйте DNS: спрямуйте трафік на Deno Deploy (наприклад, через CNAME на
deno.devабо власний домен). - Напишіть функції-обробники, які вирішують: проксіювати запит на бекенд, змінити його або відповісти самостійно.
- Задеплойте через CLI або GitHub Actions. Змінювати поточний бекенд не потрібно.
Приклад конфігурації deno.json
{
"tasks": {
"dev": "deno run --allow-net --allow-env --watch entry.ts",
"deploy": "deployctl deploy --project=my-site --prod entry.ts"
},
"imports": {
"djwt": "https://deno.land/x/[email protected]/mod.ts"
},
"deploy": {
"project": "my-site",
"entrypoint": "entry.ts",
"include": ["entry.ts", "lib/"]
}
}
Генерація OG-зображень на Edge
Satori — бібліотека для рендерингу JSX в SVG — працює в Deno Deploy. Дозволяє генерувати унікальні preview-картинки для кожної сторінки без prebuild:
import satori from 'npm:[email protected]';
import { Resvg } from 'npm:@resvg/[email protected]';
Deno.serve(async (req: Request) => {
const url = new URL(req.url);
if (!url.pathname.startsWith('/og')) return new Response('Not Found', { status: 404 });
const title = url.searchParams.get('title') ?? 'My Site';
const description = url.searchParams.get('desc') ?? '';
const fontResponse = await fetch('https://your-cdn.com/fonts/Inter-Bold.ttf');
const fontBuffer = await fontResponse.arrayBuffer();
const svg = await satori(
{
type: 'div',
props: {
style: {
display: 'flex',
flexDirection: 'column',
width: '100%',
height: '100%',
background: '#0f172a',
padding: '60px',
fontFamily: 'Inter',
},
children: [
{
type: 'h1',
props: {
style: { color: '#f8fafc', fontSize: 56, margin: 0, lineHeight: 1.2 },
children: title,
},
},
{
type: 'p',
props: {
style: { color: '#94a3b8', fontSize: 28, marginTop: 24 },
children: description,
},
},
],
},
},
{
width: 1200,
height: 630,
fonts: [{ name: 'Inter', data: fontBuffer, weight: 700, style: 'normal' }],
}
);
const resvg = new Resvg(svg);
const png = resvg.render().asPng();
return new Response(png, {
headers: {
'Content-Type': 'image/png',
'Cache-Control': 'public, max-age=86400, stale-while-revalidate=604800',
},
});
});
Кешування з Deno KV
Deno KV — вбудоване key-value сховище з глобальною реплікацією. Використовується для кешу, лічильників, rate limiting:
const kv = await Deno.openKv();
Deno.serve(async (req: Request) => {
const url = new URL(req.url);
const cacheKey = ['cache', url.pathname + url.search];
const cached = await kv.get<string>(cacheKey);
if (cached.value) {
return new Response(cached.value, {
headers: {
'Content-Type': 'application/json',
'X-Cache': 'HIT',
},
});
}
const response = await fetch(`https://api.example.com${url.pathname}`);
const data = await response.text();
await kv.set(cacheKey, data, { expireIn: 5 * 60 * 1000 });
return new Response(data, {
headers: {
'Content-Type': 'application/json',
'X-Cache': 'MISS',
},
});
});
Що входить у розробку Edge-функцій?
| Етап | Результат | Орієнтовний термін |
|---|---|---|
| Аналітика | Специфікація Edge-сценаріїв, вибір архітектури | 1 день |
| Проєктування | Прототип функцій, схема інтеграції з origin | 1–2 дні |
| Реалізація | Код, тести, CI/CD | 2–5 днів |
| Тестування | Навантажувальне тестування, перевірка на Edge | 1 день |
| Деплой і документація | Доступи, моніторинг, опис | 1 день |
Залиште заявку — ми оцінимо ваш проєкт за 1 день. Напишіть нам, щоб обговорити задачі та терміни. Замовте Edge Layer під ключ з гарантією продуктивності. Edge Layer для сайту дозволяє керувати трафіком на рівні CDN. Замовте Deno Deploy у нас для швидкої інтеграції.
Терміни орієнтовно
- Проста Edge-функція (редирект, геолокація, базовий middleware) — 1–2 дні.
- Middleware з JWT-верифікацією та проксіюванням — 2–3 дні.
- Генерація OG-зображень із кешуванням через Deno KV — 3–5 днів.
- Повноцінний Edge Layer із rate limiting, A/B-тестуванням та аналітикою — 1–2 тижні.
Вартість розраховується індивідуально. Отримайте консультацію інженера — розповімо, які функції принесуть найбільший приріст продуктивності.







