Vercel և Netlify
Push արա Git, ստացիր գլոբալ կայք preview URL-ներով, serverless function-ներով և edge caching-ով։
30 վայրկյանում
Vercel-ը և Netlify-ը frontend cloud պլատֆորմներ են։ Միացնում ես Git repository-ն, և յուրաքանչյուր push build է անում կայքդ ու deploy անում գլոբալ CDN-ում, իսկ յուրաքանչյուր pull request ստանում է իր սեփական preview URL-ը։ Դրանք նաև serverless function-ներ և edge կոդ են գործարկում, ուստի Next.js, Astro, Nuxt կամ SvelteKit հավելվածը կարող է ունենալ իր server մասերը՝ առանց սերվեր կառավարելու։ Որոշ վերահսկողություն և արժեքի կանխատեսելիություն փոխանակում ես չափազանց արագ workflow-ի հետ։
Իմ ամենօրյա stack-ում չէ․ գիտեմ հիմնական գաղափարները և մանրամասները կսովորեմ, երբ նախագիծը դա պահանջի։
Ինչու է սա կարևոր
- Դրանք frontend հավելվածների համար հանում են deploy-ի գրեթե ողջ աշխատանքը․ ոչ Nginx, ոչ certificate-ներ, ոչ CI script-եր՝ հիմնական դեպքի համար։
- Preview deployment-ները յուրաքանչյուր pull request-ի համար փոխում են թիմերի review-ի ձևը․ դիզայներներն ու client-ները click են անում իրական link, նկարագրություն կարդալու փոխարեն։
- Vercel-ն է ստեղծում Next.js-ը, ուստի ISR-ը, streaming-ը, image optimization-ը և middleware-ը այնտեղ աշխատում են զրո կոնֆիգուրացիայով․ Netlify-ը Next.js-ին աջակցում է իր OpenNext-ի վրա հիմնված adapter-ով։
- Թիմերը դրանք ընտրում են marketing կայքեր, փաստաթղթեր և frontend-ներ արագ թողարկելու համար, հաճախ՝ ծանր backend-ն ու բազան այլ տեղ host անելով։
Ինչպես է աշխատում
01Ինչ են դրանք իրականում անում
Պատկերացրու այս պլատֆորմները որպես build server, CDN և serverless runtime՝ Git-ով իրար կպցված։ Երբ push ես անում, պլատֆորմը clone է անում repo-ն, ճանաչում framework-ը, գործարկում build հրամանը և բաժանում արդյունքը։ Static ֆայլերը (HTML, CSS, JS, նկարներ) գնում են գլոբալ CDN՝ երկար caching-ով։ Server կոդը (API route-եր, server-rendered էջեր, server action-ներ) փաթեթավորվում է function-ների մեջ, որոնք աշխատում են ըստ պահանջի մեկ կամ մի քանի region-ում։ Middleware-ը կամ edge function-ները աշխատում են cache-ից առաջ՝ թեթև runtime-ի վրա օգտատիրոջը մոտ։ Յուրաքանչյուր deployment immutable է և ունի իր URL-ը․ «production»-ը պարզապես alias է, որը ցույց է տալիս դրանցից մեկը։ Հենց դրա համար է rollback-ը ակնթարթային․ alias-ը հետ ես տեղափոխում ավելի հին deployment-ի վրա, ոչինչ նորից build չի արվում։ VPS-ի համեմատ այլևս չես մտածում սերվերների մասին, բայց մտածում ես function-ի տևողության, region-ների, caching header-ների և հաշվի մասին։
- Static asset-ներ → CDN։ Server կոդ → function-ներ։ Middleware → edge։
- Յուրաքանչյուր deploy immutable է, production-ը alias է։
- Preview deployment-ներ յուրաքանչյուր branch-ի կամ pull request-ի համար։
02Project-ի կարգավորում քայլ առ քայլ
Ստեղծիր account, import արա repository-ն GitHub-ից, GitLab-ից կամ Bitbucket-ից և ընդունիր ճանաչված framework-ի կարգավորումները։ Առաջին deploy-ը սովորաբար աշխատում է առանց փոփոխությունների։ Հետո արա իրական կարգավորումը։ Dashboard-ում environment variable-ներ ավելացրու ըստ միջավայրի (Production, Preview, Development) և երբեք թույլ մի տուր, որ preview build-երը օգտագործեն production secret-ներ կամ production բազան։ Ավելացրու քո custom domain-ը․ apex domain-ը ուղղիր A record-ով կամ ALIAS-ով, իսկ www subdomain-ը՝ CNAME-ով, ինչպես պլատֆորմն է ցուցում․ certificate-ները տրվում են ավտոմատ։ Պաշտպանիր preview-ները պլատֆորմի deployment protection-ով, եթե դրանք դեռ չթողարկված աշխատանք են ցույց տալիս։ Function-ի region-ը դիր նույն region-ում, ինչ բազան։ Վերջում միացրու CLI-ը լոկալ աշխատանքի համար․ այն քաշում է environment variable-ները և կարող է լոկալ վերարտադրել պլատֆորմի build-ը։
# Vercel
npm i -g vercel
vercel link # connect this folder to a project
vercel env pull .env.local
vercel # preview deploy
vercel --prod # production deploy
# Netlify
npm i -g netlify-cli
netlify link
netlify dev # local server with functions and redirects
netlify deploy --prod
03Rendering և caching՝ static, ISR, SSR, edge
Որտեղ է render արվում էջդ, որոշում է արագությունն ու արժեքը։ Static էջերը build են արվում մեկ անգամ և սպասարկվում CDN-ից՝ ամենաարագ և գրեթե անվճար։ Incremental Static Regeneration-ը (ISR) սպասարկում է cache արված էջը և revalidate ժամկետից հետո այն վերագեներացնում ֆոնում, կամ ըստ պահանջի, երբ քո CMS-ը կանչում է revalidation endpoint-ը, ուստի ստանում ես static արագություն թարմ բովանդակությամբ։ Server-side rendering-ը function է գործարկում յուրաքանչյուր request-ի վրա․ անհրաժեշտ է անհատականացված էջերի համար, բայց յուրաքանչյուր request արժե function-ի ժամանակ։ Middleware-ը աշխատում է cache-ից առաջ յուրաքանչյուր համապատասխան request-ի վրա, ուստի այն շատ փոքր պահիր՝ redirect-ներ, rewrite-ներ, auth cookie-ի ստուգումներ, A/B bucketing։ Երկու պլատֆորմներն էլ հարգում են ստանդարտ Cache-Control header-ները, իսկ Vercel-ը նաև կարդում է CDN-Cache-Control և Vercel-CDN-Cache-Control՝ միայն CDN-ի կանոնների համար։ Netlify-ը օգտագործում է Netlify-CDN-Cache-Control և աջակցում է cache tag-եր նպատակային purge-ի համար։ Լավ կանոն՝ default-ով render արա static, բովանդակության համար՝ ISR, SSR՝ միայն այնտեղ, որտեղ response-ը իսկապես կախված է request-ից։
// app/blog/[slug]/page.tsx (Next.js App Router)
export const revalidate = 3600; // regenerate at most once per hour
export async function generateStaticParams() {
const posts = await fetch("https://cms.example.com/posts").then((r) => r.json());
return posts.map((p: { slug: string }) => ({ slug: p.slug }));
}
export default async function Post({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const post = await fetch("https://cms.example.com/posts/" + slug, {
next: { tags: ["post-" + slug] },
}).then((r) => r.json());
return <article><h1>{post.title}</h1></article>;
}
04Function-ներ՝ սահմանափակումներ և ինչպես է աշխատում billing-ը
Երկու պլատֆորմներն էլ քո server կոդը գործարկում են որպես function-ներ, հիմնականում Node.js-ի վրա։ Vercel-ում function-ները default-ով օգտագործում են Fluid compute․ մեկ instance-ը կարող է սպասարկել շատ միաժամանակյա request-ներ, ինչը նվազեցնում է cold start-երը և արժեքը I/O-ծանր աշխատանքի համար, օրինակ՝ բազա կամ AI API կանչելիս։ Billing-ը ըստ ակտիվ CPU ժամանակի, provisioned հիշողության և invocation-ների է, ուստի ցանցին սպասելու ժամանակը շատ ավելի քիչ արժե, քան մաքուր տևողությունը։ Edge Functions-ը և middleware-ը աշխատում են ավելի թեթև V8 runtime-ի վրա․ Vercel-ն այժմ function-ների մեծ մասի համար խորհուրդ է տալիս Node.js runtime-ը։ Netlify Functions-ը ներքևում աշխատում են AWS Lambda-ի վրա, իսկ Netlify Edge Functions-ը՝ Deno-ի վրա edge-ում։ Netlify-ը օգտագործում է credit-ների վրա հիմնված plan մոդել․ deploy-երը, compute-ը, bandwidth-ը և request-ները յուրաքանչյուրը credit-ներ են ծախսում ամսական սահմանաչափից։ Երկուսն էլ ունեն առավելագույն տևողություն, request body-ի չափի և հիշողության սահմանափակումներ ըստ plan-ի, ուստի երկար job-երի տեղը queue-ում կամ այլ տեղ գտնվող background worker-ում է։
05Plan-ներ և գնային թակարդներ
Vercel-ի Hobby plan-ը անվճար է, բայց միայն անձնական, ոչ կոմերցիոն օգտագործման համար․ client-ների և ընկերությունների project-ներին պետք է Pro, որի գինը ըստ seat-ի է՝ ամսական usage credit-ով, ապա pay-as-you-go։ Նոր Pro թիմերը ստանում են default spend budget alert-ներով և սահմանին project-ները pause անելու տարբերակով․ այն միացված պահիր։ Netlify-ն ունի Free, Personal և Pro plan-ներ ամսական credit-ների սահմանաչափով․ երբ credit-ները վերջանում են, կայքերը կարող են pause լինել, եթե ավելին չգնես կամ auto recharge չմիացնես։ Թակարդները երկուսում էլ նման են՝ viral էջ, որը server-render է արվում յուրաքանչյուր request-ի վրա, մեծ չօպտիմիզացված նկարներ կամ վիդեո, որոնք սպասարկվում են որպես bandwidth, bot-եր, որոնք խփում են դինամիկ route-երին, image optimization հազարավոր source նկարների վրա, և preview build-եր, որոնք գործարկվում են զբաղված monorepo-ի ամեն commit-ով։ Client-ի որոշումից առաջ գները ստուգիր պաշտոնական pricing էջերում․ երկու ընկերություններն էլ պարբերաբար փոխում են իրենց մոդելները։
- Vercel-ի Hobby-ն ոչ կոմերցիոն է․ client-ի աշխատանքին պետք է Pro։
- Առաջին օրից միացրու spend limit-ներ կամ budget alert-ներ։
- Cache արա ագրեսիվ․ cache չարված SSR-ն է, որտեղ հաշիվները աճում են։
Օգտագործեք, երբ
- Frontend հավելվածներ և marketing կայքեր՝ կառուցված Next.js-ով, Astro-ով, Nuxt-ով, SvelteKit-ով կամ Remix-ով, որոնք շահում են CDN-ից և preview-ներից։
- Թիմեր, որոնք ուզում են preview URL-ներ յուրաքանչյուր pull request-ի համար՝ դիզայնի, QA-ի և client-ի review-ի համար։
- Project-ներ առանց առանձին DevOps մասնագետի, որտեղ deploy-ի վրա խնայված ժամանակը ավելի արժեքավոր է, քան պլատֆորմի մարժան։
- Jamstack կայքեր headless CMS-ով, որտեղ ISR-ը կամ on-demand revalidation-ը բովանդակությունը թարմ են պահում։
Մի՛ օգտագործեք, երբ
- Երկարակյաց backend-ներ, WebSocket սերվերներ, queue worker-ներ կամ cron-ծանր job-եր․ օգտագործիր VPS, container-ներ կամ առանձին backend պլատֆորմ։
- Մեծ bandwidth-ով մեդիա կայքեր, որտեղ ըստ GB-ի գնագոյացումը VPS-ը կամ object storage-ը CDN-ով շատ ավելի էժան է դարձնում։
- Տվյալների խիստ residency կամ networking պահանջներ (private ցանցեր, ֆիքսված egress IP-ներ), որոնք enterprise plan-ներ են պահանջում։
Այլընտրանքներ
- Cloudflare Pages / Workers
Առատաձեռն free tier և շատ էժան bandwidth․ Next.js-ը Workers-ի վրա աշխատում է OpenNext adapter-ով։
- VPS + Docker + Nginx
Ֆիքսված գին և լիարժեք վերահսկողություն․ build-երը, TLS-ը, caching-ը և rollback-ները քո վրա են։
- AWS Amplify / Cloud Run
Մնա արդեն օգտագործվող cloud-ի ներսում՝ ավելի շատ վերահսկողությամբ և ավելի շատ կարգավորման աշխատանքով։
- Self-hosted Next.js (standalone)
next build-ը output standalone-ով աշխատում է ամենուր, որտեղ Node է աշխատում, այդ թվում Docker-ում VPS-ի վրա։
Լավագույն պրակտիկաներ
- Առանձին environment variable-ներ Production-ի, Preview-ի և Development-ի համար․ preview-ները չպետք է դիպչեն production տվյալներին։
- Function-ները դիր նույն region-ում, ինչ բազան, որպեսզի ամեն query-ի վրա cross-region latency չլինի։
- Default-ով օգտագործիր static և ISR, SSR-ը՝ միայն այնտեղ, որտեղ բովանդակությունը կախված է request-ից։
- Սահմանիր spend limit-ներ և usage alert-ներ և ամեն ամիս վերանայիր usage dashboard-ը։
- Պաշտպանիր preview deployment-ները, որոնք չթողարկված աշխատանք են ցույց տալիս, և արգելիր search engine-ներին դրանք index անել։
- Middleware-ը պահիր փոքր և matcher-ով սահմանափակված, որպեսզի չաշխատի static asset-ների վրա։
- Օգտագործիր պլատֆորմի instant rollback-ը և բազայի migration-ները պահիր backward compatible, որպեսզի rollback-ը անվտանգ լինի։
Տարածված սխալներ
- Client-ի կոմերցիոն կայքի համար Vercel Hobby օգտագործել։
- Preview build-երը ուղղել production բազային, ապա branch-ից ավերիչ migration-ներ գործարկել։
- Ծանր աշխատանքը (PDF-ի գեներացում, վիդեոյի մշակում, երկար AI կանչեր) request function-ներում գործարկել, մինչև timeout-ների հասնեն։
- Secret-ները դնել NEXT_PUBLIC_ variable-ներում, որոնք հասնում են browser։
- Bot-երին և crawler-ներին ազատ թողնել խփելու cache չարված դինամիկ route-երին՝ բազմապատկելով function-ների արժեքը։
Խորը վերլուծություն
06Ինչպես է աշխատում request-ի ճանապարհը՝ routing, cache և function-ներ
Request-ը հասնում է ամենամոտ edge location-ին։ Նախ գործարկվում են պլատֆորմի routing կանոնները՝ redirect-ներ, rewrite-ներ և header-ներ քո framework-ից կամ config ֆայլերից։ Ապա գործարկվում է middleware-ը, եթե համապատասխանում է։ Հետո ստուգվում է CDN cache-ը՝ URL-ով և ցանկացած cache key-ով կամ Vary header-ով։ Cache hit-ը վերադառնում է անմիջապես և արժե միայն CDN request և bandwidth։ Miss-ը կանչում է function-ը իր կարգավորված region-ում, որը կարող է հեռու լինել edge-ից, ուստի յուրաքանչյուր miss վճարում է edge-ից region ճանապարհի և քո բազայի round trip-երի համար։ Stale-while-revalidate-ը թույլ է տալիս CDN-ին սպասարկել հնացած բովանդակություն՝ այն ֆոնում թարմացնելով։ Cookie-ները caching-ի թաքնված թշնամին են․ response-ը, որը կախված է session cookie-ից, չպետք է կիսվի, ուստի էջերը բաժանիր cache արված shell-ի և փոքր անհատականացված մասերի, որոնք բեռնվում են client-ում կամ stream են արվում։
// next.config.ts: long cache for a public API route, revalidated in the background
import type { NextConfig } from "next";
const config: NextConfig = {
async headers() {
return [
{
source: "/api/public/:path*",
headers: [{ key: "Cache-Control", value: "public, s-maxage=300, stale-while-revalidate=86400" }],
},
];
},
};
export default config;
07Բազաների հետ connection-ներ serverless function-ներից
Function-ները scale են լինում՝ ավելի շատ instance-ներ ստեղծելով, և յուրաքանչյուր instance, որը բացում է իր TCP connection-ները դեպի Postgres, բեռնվածության տակ կարող է սպառել բազայի connection limit-ը։ Երեք գործիք է լուծում սա։ Առաջին՝ բազայի առջև pooler դիր՝ PgBouncer, managed provider-ի pooled endpoint կամ Prisma Accelerate, և օգտագործիր transaction mode։ Երկրորդ՝ edge և կարճակյաց function-ների համար նախընտրիր serverless-ի համար նախագծված driver-ներ, օրինակ՝ serverless Postgres provider-ների HTTP կամ WebSocket driver-ները։ Երրորդ՝ Vercel Fluid compute-ով մեկ instance-ը շատ request-ներ է սպասարկում, ուստի module-level փոքր pool-ը արդյունավետ վերաօգտագործվում է․ օգտագործիր waitUntil կամ attachDatabasePool helper-ները, որպեսզի պարապ connection-ները փակվեն, նախքան instance-ը suspend լինի։ Միշտ function-ի region-ը դիր բազայի կողքին․ մեկ region-ային թռիչք յուրաքանչյուր query-ի համար, բազմապատկած էջի տասը query-ով, 50 և 500 միլիվայրկյանի տարբերությունն է։
08Անվտանգություն՝ secret-ներ, preview-ներ և edge
Environment variable-ները գաղտնագրված են պահման ժամանակ, բայց client-ի համար prefix ունեցող ամեն ինչ (NEXT_PUBLIC_, PUBLIC_, VITE_) ներդրվում է browser bundle-ի մեջ․ դրանք դիտարկիր որպես public։ Զգայուն variable-ները սահմանափակիր միայն Production-ով և նշիր որպես sensitive, որպեսզի dashboard-ից հետ կարդալ հնարավոր չլինի։ Preview-ները իրական հարձակման մակերես են․ fork-ից եկած pull request-ը կարող է build-ի ժամանակ կոդ գործարկել քո secret-ներով, ահա թե ինչու պլատֆորմները default-ով secret-ները չեն տալիս fork build-երին․ այդպես էլ պահիր։ Չթողարկված աշխատանքի preview-ների համար օգտագործիր deployment protection (գաղտնաբառ, SSO կամ Vercel Authentication) և ավելացրու X-Robots-Tag noindex header, որպեսզի դրանք երբեք index չարվեն։ Login-ի և API route-երի համար միացրու firewall-ի և bot protection-ի հնարավորությունները, իսկ թանկ endpoint-ների համար ավելացրու rate limiting, քանի որ յուրաքանչյուր չարաշահող request գանձվող function ժամանակ է։
Իրական իրավիճակներ
Marketing կայքը viral է դառնում, և հաշիվը կտրուկ աճում է
Խնդիր
Server-rendered landing էջը social media-ից traffic-ի ալիք ստացավ։ Function-ների օգտագործումը և հաշիվը երկու օրում շատ գերազանցեցին plan-ի մեջ ներառված credit-ը։
Ինչպես լուծել
Նախ միացրու կամ իջեցրու spend limit-ը, որպեսզի ռիսկը սահմանափակվի։ Նայիր usage dashboard-ը՝ հաստատելու, թե որ route-երն են function ժամանակ ծախսել։ Ապա landing էջը դարձրու static կամ ISR․ անհատականացումը (ողջույն, զամբյուղի քանակ) տեղափոխիր client component-ներ կամ փոքր API կանչ և սահմանիր revalidate, որպեսզի էջը rebuild լինի առավելագույնը մի քանի րոպեն մեկ։ Public API route-երին ավելացրու s-maxage և stale-while-revalidate header-ներ։ Ստուգիր նկարները․ օգտագործիր image component-ը խելամիտ չափերով կամ object storage-ում նախապես օպտիմիզացված asset-ներ։ Միացրու bot protection-ը, եթե traffic-ի զգալի մասը crawler-ներ էին։ Այդ դեպքում նույն traffic-ը հիմնականում կարժենա CDN request-ներ և bandwidth։
Next.js հավելված Vercel-ում՝ այլ region-ում գտնվող բազայով
Խնդիր
Ապրանքների ցանկ ցույց տվող էջերը Vercel-ում 1–2 վայրկյան են տևում, մինչդեռ նույն հավելվածը բազային մոտ laptop-ի վրա պատասխանում է 200 ms-ում։
Ինչպես լուծել
Function-ը աշխատում է պլատֆորմի default region-ում՝ բազայից հեռու, և յուրաքանչյուր էջ մի քանի հաջորդական query է անում, որոնցից յուրաքանչյուրը վճարում է cross-region round trip-ի համար։ Project settings-ում function-ի region-ը դիր բազայի region-ում (կամ տեղափոխիր բազան)։ Ապա նվազեցրու round trip-երը․ անկախ query-ները գործարկիր զուգահեռ Promise.all-ով, միավորիր query-ները և ավելացրու index-ներ։ Կայուն տվյալները cache արա fetch caching-ով կամ unstable cache helper-ներով և tag-երով, իսկ ապրանքների ցանկերը դարձրու ISR՝ on-demand revalidation-ով, երբ ապրանքները փոխվում են։ Նորից չափիր պլատֆորմի observability-ով կամ server timing header-ներով՝ հաստատելու, որ ժամանակն այժմ գնում է հենց query-ների վրա։
Client-ին պլատֆորմից տեղափոխել VPS
Խնդիր
Կայուն, բարձր traffic-ով կայքը կանխատեսելի բեռնվածությամբ frontend պլատֆորմում շատ ավելի թանկ է, քան client-ը պատրաստ է վճարել, իսկ preview-ները այլևս քիչ են օգտագործվում։
Ինչպես լուծել
Next.js-ը build արա output: 'standalone'-ով, ստեղծիր բարակ Docker image և գործարկիր այն Nginx-ի կամ Caddy-ի հետևում VPS-ի վրա, իսկ առջևում դիր CDN, օրինակ Cloudflare, static asset-ների և caching-ի համար։ Պլատֆորմի հնարավորությունները փոխարինիր մեկ առ մեկ․ ISR-ը աշխատում է մեկ Node սերվերի վրա file cache-ով, կամ օգտագործիր ընդհանուր cache handler Redis-ով, եթե մի քանի instance ես գործարկում, image optimization-ին պետք է տեղադրված sharp, cron job-երը տեղափոխվում են scheduler կամ systemd timer-ներ, redirect-ները՝ framework-ի config կամ Nginx։ Build-ի և deploy-ի համար պահիր GitHub Actions-ը՝ tag արված image-ներով rollback-ի համար։ Երկուսն էլ գործարկիր զուգահեռ, ապա DNS-ը փոխիր ցածր TTL-ով։
Արագ ուղեցույց
- Preview deploy (Vercel)
vercel- Deploy production (Vercel)
vercel --prod- Env var-երը քաշել լոկալ (Vercel)
vercel env pull .env.local- Production-ի rollback (Vercel)
vercel rollback <deployment-url>- Լոկալ գործարկում function-ներով (Netlify)
netlify dev- Deploy production (Netlify)
netlify deploy --prod- Public response-ը cache անել CDN-ում
Cache-Control: public, s-maxage=300, stale-while-revalidate=86400- Tag-ի revalidate ըստ պահանջի (Next.js)
revalidateTag("post-hello-world")- Middleware-ը հեռու պահել asset-ներից
export const config = { matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"] }
Հարցեր և պատասխաններ
Q1Ի՞նչ է preview deployment-ը, և ինչո՞վ է այն արժեքավոր։
Preview deployment-ը branch-ի կամ pull request-ի ամբողջական, մեկուսացված build է իր URL-ով, որը ստեղծվում է ավտոմատ push-ի ժամանակ։ Այն գործարկում է նույն build-ը, ինչ production-ը, բայց preview environment variable-ներով։ Նրա արժեքը review-ի մեջ է․ դիզայներները, product owner-ները և client-ները տեսնում են իրական փոփոխությունը իրական link-ով, QA-ն կարող է թեստավորել այն, իսկ ավտոմատ ստուգումները, ինչպես Lighthouse-ը կամ end-to-end թեստերը, կարող են գործարկվել դրա վրա merge-ից առաջ։ Քանի որ յուրաքանչյուր deploy immutable է, քո հաստատած preview-ն է հենց promote արվում։ Հիմնական զգուշությունը տվյալներն են․ preview-ները պետք է օգտագործեն staging բազա կամ seed արված տվյալներ և պաշտպանված լինեն, եթե չթողարկված հնարավորություններ են ցույց տալիս։
Q2Ինչպե՞ս է աշխատում ISR-ը այս պլատֆորմներում։
Incremental Static Regeneration-ը նշանակում է, որ էջը գեներացվում է static ձևով և cache արվում CDN-ում, ապա ավելի ուշ վերագեներացվում՝ առանց ամբողջական rebuild-ի։ Ժամանակի վրա հիմնված revalidation-ի դեպքում revalidate պատուհանից հետո առաջին request-ը դեռ ստանում է cache արված էջը, մինչ պլատֆորմը այն ֆոնում վերագեներացնում է․ հաջորդ այցելուները ստանում են թարմ տարբերակը։ On-demand revalidation-ի դեպքում քո CMS-ը կամ backend-ը կանչում է endpoint, որը գործարկում է revalidatePath կամ revalidateTag, և պլատֆորմը purge և rebuild է անում միայն այդ էջերը։ Ստանում ես static արտադրողականություն և արժեք՝ բովանդակությամբ, որը թարմանում է վայրկյանների ընթացքում։ Vercel-ում սա native է, Netlify-ում աշխատում է նրա Next.js runtime-ով՝ durable caching-ով։
Q3Vercel, թե՞ Netlify․ ինչպե՞ս կընտրես։
Next.js-ի համար Vercel-ը սովորաբար ամենասահուն տարբերակն է, որովհետև հենց նա է ստեղծում framework-ը և նոր հնարավորություններին աջակցում թողարկման օրը։ Netlify-ը լավ է աջակցում Next.js-ին իր adapter-ով և ուժեղ է multi-framework թիմերի, Astro կայքերի, form-երի և ներկառուցված հնարավորությունների համար, ինչպես split testing-ը և identity-ն։ Համեմատիր plan մոդելը սպասվող traffic-ի համար․ Vercel-ը Pro-ն գնահատում է ըստ seat-ի՝ usage-based compute-ով, Netlify-ը օգտագործում է credit-ների սահմանաչափ ըստ plan-ի։ Ստուգիր նաև region-ների ընտրությունը, function-ների սահմանափակումները, թիմային հնարավորությունները, ինչպես SSO-ն, և թե որտեղ է ապրում backend-ը։ Client-ի համար երկուսի վրա էլ փոքր spike կկառուցեի միայն այն դեպքում, եթե որոշումը պարզ չէ․ սովորաբար framework-ն է որոշում։
Q4Կարելի՞ է ամբողջական backend host անել Vercel-ում կամ Netlify-ում։
Կարող ես host անել API route-եր և server action-ներ, որոնք կարճ request-response աշխատանք են անում՝ բազայից կարդալ և գրել, երրորդ կողմի API-ներ կանչել, webhook-ներ մշակել։ Լավ չի տեղավորվում երկարակյաց կամ stateful աշխատանքը՝ WebSocket սերվերներ, queue consumer-ներ, ծանր batch job-եր կամ որևէ բան, որը պետք է function-ի սահմանից երկար աշխատի։ Սովորական ճարտարապետությունը frontend-ն ու բարակ backend-for-frontend-ն են պլատֆորմի վրա, managed բազայով (Postgres Neon-ից, Supabase-ից կամ cloud provider-ից) և առանձին worker service-ով queue-ների և scheduled job-երի համար VPS-ի կամ container-ների վրա։ Այդպես պահպանվում է արագ workflow-ը, իսկ ծանր աշխատանքը դրվում է այնտեղ, որտեղ ավելի էժան է։
Q5Ինչպե՞ս ես rollback անում վատ deploy-ը։
Յուրաքանչյուր deployment immutable է և մնում է հասանելի, իսկ production-ը alias է, որը ցույց է տալիս դրանցից մեկը։ Vercel-ում օգտագործում ես Instant Rollback-ը dashboard-ում կամ vercel rollback-ը deployment URL-ով, Netlify-ում ընտրում ես ավելի հին deploy և publish անում այն, ըստ ցանկության կողպելով auto-publishing-ը, մինչ խնդիրը շտկում ես։ Rebuild տեղի չի ունենում, ուստի դա վայրկյաններ է տևում։ Թակարդը deploy-ից դուրս ամեն ինչն է․ բազայի migration-ները, փոխված environment variable-ները և արտաքին webhook-ները հետ չեն գլորվում։ Ահա թե ինչու migration-ները պետք է backward compatible լինեն (նախ expand, հետո contract), որպեսզի նախորդ տարբերակը դեռ աշխատի նոր schema-ի հետ։
Սենիոր մակարդակի հարցեր
S1Ե՞րբ է frontend պլատֆորմը դադարում ծախսարդյունավետ լինել, և ինչպե՞ս ես որոշում հեռանալ։
Մոդելավորիր արժեքը traffic-ի մեկ միավորի համար։ Պլատֆորմները էժան են, երբ traffic-ի մեծ մասը cache արված է, և թիմը փոքր է․ DevOps ժամանակի վրա խնայված գումարը գերազանցում է usage գնագոյացմանը։ Դրանք թանկանում են մեծ bandwidth-ի (մեդիա, մեծ download-ներ), շատ cache չարված server rendering-ի, ծանր image optimization-ի, շատ seat-երի կամ երկարակյաց compute-ի դեպքում։ Հեռանալուց առաջ օպտիմիզացրու՝ default-ով static և ISR, caching header-ներ, նկարների budget-ներ, bot protection, ճիշտ region։ Եթե հաշիվը դեռ բարձր է, համեմատիր ownership-ի ընդհանուր արժեքը՝ VPS կամ container-ներ գումարած CDN, գումարած ինժեներական ժամանակ CI-ի, preview-ների, TLS-ի, monitoring-ի և on-call-ի համար։ Հաճախ հաղթում է hybrid տարբերակը․ frontend-ն ու preview-ները պահիր պլատֆորմի վրա, իսկ ծանր API-ները, worker-ներն ու մեդիան տեղափոխիր ավելի էժան ենթակառուցվածք։
S2Edge runtime, թե՞ Node.js runtime server կոդի համար։
Edge runtime-ը արագ է գործարկվում և աշխատում է օգտատիրոջը մոտ, բայց ունի սահմանափակ API (ոչ լիարժեք Node.js, սահմանափակ package-ներ, ավելի փոքր կոդի չափ, սահմանափակ CPU ժամանակ)։ Այն փայլում է այն տրամաբանության համար, որին բազա պետք չէ կամ պետք է միայն գլոբալ replicate արված store՝ redirect-ներ, geolocation, A/B bucketing, auth token-ի ստուգումներ, header-ների rewrite։ Իրական աշխատանքի մեծ մասը խոսում է մեկ region-ում գտնվող բազայի հետ, և այն edge-ում գործարկելը նշանակում է, որ յուրաքանչյուր query անցնում է ամբողջ աշխարհով, ուստի այն դառնում է ավելի դանդաղ, ոչ թե ավելի արագ։ Node.js function-ները բազայի region-ում, հատկապես Fluid compute-ի concurrency-ով, սովորաբար ավելի լավ default են, և Vercel-ն այժմ խորհուրդ է տալիս հենց դրանք։ Edge middleware-ը օգտագործիր բարակ routing որոշումների համար, իսկ տվյալների հասանելիությունը պահիր region-ային։
S3Ինչպե՞ս ես նախագծում preview միջավայրեր, որոնք բազա են ներառում։
Static preview-ները հեշտ են, տվյալներն են դժվար մասը։ Տարբերակներ՝ պարզից հարուստ․ մեկ staging բազա բոլոր preview-ների համար (էժան է, բայց migration-ներով branch-երը բախվում են), database branching provider-ներից, ինչպես Neon-ը, որտեղ յուրաքանչյուր preview ստանում է copy-on-write branch՝ ստեղծված webhook-ով կամ CI քայլով և ջնջված, երբ pull request-ը փակվում է, կամ յուրաքանչյուր preview-ի համար ժամանակավոր բազա՝ fixture-ներից seed արված։ Migration-ները գործարկվում են branch-ի վրա build-ի ընթացքում կամ առանձին CI job-ով։ Preview-ի secret-ները գալիս են integration-ից, երբեք՝ production-ից։ Ավելացրու մաքրման ավտոմատացում, այլապես branch-երը և դրանց արժեքը կուտակվում են։ Trade-off-ը կարգավորման բարդությունն է՝ ընդդեմ վստահության․ branching-ը migration-ների իրատեսական թեստեր է տալիս, նախքան դրանք կհասնեն production։
Բառարան
- Preview deployment
- Branch-ի կամ pull request-ի ավտոմատ, մեկուսացված deployment՝ իր սեփական URL-ով։
- ISR
- Incremental Static Regeneration․ սպասարկել cache արված static էջը և այն վերագեներացնել ժամանակային պատուհանից հետո կամ ըստ պահանջի։
- Edge function
- Թեթև կոդ, որն աշխատում է օգտատերերին մոտ բազմաթիվ վայրերում, cache-ից առաջ, սահմանափակ runtime-ով։
- Fluid compute
- Vercel-ի function մոդելը, որտեղ մեկ instance-ը սպասարկում է շատ միաժամանակյա request-ներ, իսկ billing-ը հետևում է ակտիվ CPU ժամանակին։
- Instant rollback
- Production alias-ը հետ ուղղել ավելի վաղ immutable deployment-ի վրա՝ առանց rebuild-ի։
- s-maxage
- Cache-Control directive, որը որոշում է, թե որքան ժամանակ ընդհանուր cache-երը, ինչպես CDN-ները, կարող են պահել response-ը։
- Build minutes
- Deployment-ների build-ի վրա ծախսված ժամանակը․ սահմանափակված կամ գանձվող ըստ plan-ի և բազմապատկվող զբաղված monorepo-ներում։
- OpenNext
- Open-source adapter, որը թույլ է տալիս Next.js հավելվածներին աշխատել Vercel-ից բացի այլ պլատֆորմներում, ինչպես Netlify-ը, AWS-ը կամ Cloudflare-ը։
Շարունակեք սովորել
Պրոդուկտի գաղափար ունե՞ք։Եկեք ստեղծենք այն։
Պատմեք ձեր գաղափարի, պրոդուկտի կամ թիմի մասին։ Սովորաբար պատասխանում եմ մեկ աշխատանքային օրվա ընթացքում։