Motor static site generation (SSG) v Nuxt 3 kardinal'no izmeniłsja po sravn'eniju s versiej 2.x. Direktivy routeRules, prerender i mehanizm payload extraction, prisheddshie s Nitro engine, pryamo vliyayut na vremya sborki i produktivnost' v runtime. Strategii, kotoroye pomogли sokrasctit' vremya sborki s 40 sekund do 8 sekund na sajtе s 10 000 stranits e-kommerc'i, a takzhe analiz tradoff'ov i rezultaty izmrenil predstavlyayem ниже.

Matrica Vybora Strategij Prerender'a

V Nuxt 3 suščestvuyut 4 osnovnyh strategii prerender'a: polnoe static rendering, chastichnyj prerender, ISR hybrid i generacija po zaprosu. Kazhdaya iz nih imeet razlichnyje vremya sborki, runtime zatraty i koeffic'ient popadan'iya v cache.

Full static (nitro.prerender.routes): renderit vse marshruty v vremya sborki i eksportirует ikh v vide HTML. Ideal'no dlya sajtov s 100 stranitsami, dlya 10 000 strani vremя sborki mozhet prevysit' 5 minut. Preimushčestvo: otsutstv'ie runtime, 100% popadan'iya v cache CDN. Nedostatok: kazhdoe izmenenie kontenta trebuet polnoe perestroenie. Dlya e-kommerc'i, gde katalog obnovlyaetsya 50 raz v den', eto neudachimo.

Chastichnyj prerender (routeRules): kritichnyje marshruty (startovaya stranica, top 100 kategorij) prerender'uyutsya, dlinnye khvosty obrabatyvayutsya cherez ISR. Vremya sborki sokraщaetsya na 90%. Primer: na sajte s 10 000 tovarov perv'ie 500 prerenderiruyutsya, ostalnye keshируются pri pervom zaproase. Shtraف za otsutstvie v cache: 800ms (SSR), popadan'ie v cache: 40ms (statichnyj HTML).

Incremental Static Regeneration (ISR): realizuetsya na platformah, analog'ichnyh Vercel/Netlify, s pomosch'yu routeRules + swr/stale. Stranica posle pervogo render'irovaniya popádaet v cache, a po истечении vremeni zhizni pervalidiruyetsya v fone. Tradoff: risk zastaryelogo kontenta protiv vyigrysha v vremeni sborki. S TTL v 24 chasa ne uspevayesh' perekhvatit' dnevnyje izmeneniya cen, no vremya sborki sokraщaetsya do 2 sekund.

Po-trebovanii (server/api): tetlится webhook'ami pri izmenenijakh kontenta — tolko sootvetstvuyushchij marshrut pererender'iruyetsya nanovo. Minimal'noe vremya sborki, maksimal'naya slozhnost' orkhestrirovaniya. Nuzhno nastrojti: CMS webhook → Nitro API → pipeline invalidac'i marshrutov.

Granularnyj Kontrol cherez Route Rules

V nuxt.config.ts direktiva routeRules opredelyaet dlya kazhdogo marshrutа razlichnuju strategiyu renderirovaniya. Na ètom sloe direktivy prerender, swr, isr, ssr kontrol'iruyut povedenie cache dlya kazhdogo marshrutа.

export default defineNuxtConfig({
  routeRules: {
    '/': { prerender: true }, // Startovaya stranica vsegda statichna
    '/products/**': { swr: 3600 }, // Tovary keshuirutsya na 1 chas
    '/api/**': { cors: true, cache: false }, // API endpoint'y ne keshuirutsya
    '/category/:slug': { isr: true }, // ISR aktiviruetsya
  },
  nitro: {
    prerender: {
      crawlLinks: true, // Sledyuj ssylki v sitemape
      routes: ['/sitemap.xml'], // Ruchnoj poryadok marshrutov
      ignore: ['/admin', '/checkout/**'], // Isklyuch'i iz prerender'a
    },
  },
})

S crawlLinks: true ssylki v sitemape avtomaticheski obnaruzhivayutsya. Dlya sajta s 500 stranitsami ne nuzhen spravochnik marshrutov. No dlya sajta s 50 000 stranits crawl vsekh ssylok mozhet zanyat' 10 minut sborki — v ètom slučae ispol'zuj ruchnoj array routes + inkremental'naya strategiya.

Izbezhanie Duplika Dannyh s Pomoshch'yu Payload Extraction

Nuxt 3 dlya kazhdogo prерenderirovannogo marshrutа sozdaet _payload.json. Ètot fajl seríalizuet dannyje, polučennyje pri server-sborke. Pri navigacii SPA etot JSON ispol'zuetsya, novyj API vyzov ne delaetsya.

// pages/product/[id].vue
<script setup>
const route = useRoute()
const { data: product } = await useFetch(`/api/products/${route.params.id}`)
</script>

Vo vremya prerender'a zaprashivaetsya /api/products/123, otvet vstraivaetsya v _payload.json. Pri navigacii s kliènt-storony tie zhe dannyje pereispol'zuyutsya. Tradoff: razmer payload'a. Na sajte s 10 000 tovarov, esli kazhdyj _payload.json ravnyaetsya 5KB, itogo proizvoditsya 50MB statichnykh активов. Uchet shirinu propusknoj sposobnosti CDN.

Dlya optimizac'i ètomu szhimaj payload v nitro.output.publicDir s pomoshč'yu gzip/brotli. Nginx/Cloudflare delaet ètо avtomaticheski, no szhatie v vremya sborki daet sokraščenie 5KB → 1.2KB.

Produktivnost' Sborki: Parallelizac'iya i Strategii Cache

Pipeline sborki Nuxt 3 sostoit iz 3 étapov: webpack/vite kompily → nitro prerender → optimizac'iya aktivov. Na 10 000 marshrutov prerender stanovitsya uzkim mestom.

Parallelizac'iya: parametr prerender.concurrency v Nitro kontrol'iruet kolichestvo odnovremeno renderiruyushchихся marshrutov. Po umolčaniyu 10. Esli RAM pozvoljaet, uveličь do 50:

nitro: {
  prerender: {
    concurrency: 50,
  },
}

Na CPU s 4 yaderami + 16GB RAM izmeneniye s 10 na 50 sokraticilo vremya sborki s 40s do 12s. No usloviya svyshe 50 daet ubyvayushchuju otdaču — overhead kontekstnyh pereklyučenij CPU vozrastает.

Inkremental'nyj kesš sborki: Netlify/Vercel sokhranyayut kesš .nuxt/prerender. Nekeshiryemyje marshruty ne perестраivayutsya. Invalidaciya kesša na osnove Git-hešа znamenaet, čto pri kazhdoj razvertyvanii tolko izmenennyje marshruty pererender'iruyutsya.

// netlify.toml
[build]
  command = "nuxt build"
  publish = ".output/public"

[[plugins]]
  package = "@netlify/plugin-nextjs"
  
[build.environment]
  NUXT_TELEMETRY_DISABLED = "1"

Pri koeffic'iente popadan'iya v kesš 70% sajt s 5000 marshrutov sobirayetsya za 5s vmesto 15s.

Tradoff: Razmer Bundl'a vs Prerender

HTML-fajly, proizvedennye pri polnom prerender'e, soderzhat JS-bundle dlya gidracii. V Nuxt 3 s pomoshch'yu experimental.payloadExtraction payload'y można otdelit' ot HTML. Ètо optimiziruet razdelenie častej.

experimental: {
  payloadExtraction: true,
  inlineSSRStyles: false, // Critical CSS ne vstraivaetsya inline
}

S payloadExtraction: true 250KB HTML → 180KB HTML + 70KB JSON. Client-sторona zaprashivaet JSON, ne pereparsiruet HTML. LCP 2.1s → 1.8s (90-j percentil', mobile 3G).

No tradoff: dopolnitel'nyj HTTP-zapros. Esli est' HTTP/2 multiplexing, problem'a net, s HTTP/1.1 latentnost' vozrastaet. Na sovremennyh CDN (Cloudflare/Fastly) HTTP/2 — default, poètomu ètа strategiya vyigryvaet.

Integrac'iya Headless Commerce: Shopify + Nuxt SSG

V e-kommerc'i prerender tovarnyh stranits vniest' kompleksnost' v sinhron'izaciyu inventarya. S pomoshč'yu Shopify GraphQL Storefront API nastrajesh webhook-drivennyj revalidac'iu.

// server/api/revalidate.post.ts
export default defineEventHandler(async (event) => {
  const body = await readBody(event)
  
  if (body.topic === 'products/update') {
    const productId = body.id
    await nitroApp.hooks.callHook('prerender:routes', [
      `/products/${productId}`
    ])
  }
  
  return { status: 'revalidated' }
})

Podpishis' na webhook ot Shopify Admin API → pri obnovlenii tovara /api/revalidate aktiviruetsya → tolko tot marshrut pererender'iruyetsya. Vmesto perestroeni vsego kataloga pererenderirovaniye odnoj stranicy trebuet 200ms.

Headless arhitektura e-kommerc'i dlyya ètogo pattern'a kritichna. V monolitnykh platformah polnaya perestrojka neobhodima, v headless'e granuljarnyj invalidation vozmozhen. Pri 50 000 SKU i 500 obnovleniyah tovarov v den' polnaya perestrojka zajmет 6 časov, inkremental'naya revalidac'iya — 2 minuty.

ISR + Edge Caching: Hybrid Strategiya s Cloudflare Workers

V kombinacii Nuxt 3 + Cloudflare Pages ISR realizuyetsya cherez Cloudflare Workers KV. Marshrut pri pervom zaproase renderiruyetsya, zapisyvaetsya v KV, sleduyushchie zaprosy podаiutsya iz KV.

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    preset: 'cloudflare-pages',
  },
  routeRules: {
    '/blog/**': { isr: 3600 }, // 1 chas TTL
  },
})

Latentnost' Cloudflare KV — ~50ms (global edge). Pervyj render 800ms + 50ms zapisj v KV, sleduyushchie zaprosy — 50ms. Pri koeffic'iente popadan'ya v cache 95% srednyy vremya otveta: 95×50ms + 5×850ms = 90ms. Pri polnom SSR vremya bylo by 800ms.

Tradoff: stoimost' zapisi v KV. Pri 1M zaproov v mesyac — $0.50 (Cloudflare pricing 2026). Esli static hosting besplatnyj, ISR vnosit dopolnitel'nye raskhody, no UX vyigrysh eto opravdyvaet.


Strategiya SSG v Nuxt 3 trebuet reshenia v treugol'nike «svezhest' dannyh — vremya sborki — produktivnost' runtime». Prerender startovoj stranicy, ISR dlya dlinnogo khvosta, server-sborka dlya kritichnyh putej — ètot mix' nuzhen dlya kazhdogo proekta. Bez izmerenij utverzhdenie "polnyj static bystree" budet nepravil'no; pri 10 000 marshrutov vremya sborki mozhet povredit' UX. Inkremental'naya regenerac'iya + edge cache daet vyigrysh v oboih — vremya sborki i vremya otclika — no trebuet prinyatiya orchestration kompleksnosti.