Dvizhok static site generation (SSG) Nitro v Nuxt 3 — pervoe production-grade reshenie v ekosisteme Vue, kotorое ob"edinyaet ISR (Incremental Static Regeneration) i kontrol' prerendera na urovne marshrutov. V 2026 godu, nesmotrja na prognzy ob "smerti SSG" iz-za rasprostranenija edge-deployment platform, gibridnye strategii renderirovanija (SSG + on-demand ISR) ostalis' samym ekonomichnym sposobom optimizacii Core Web Vitals. API routeRules v Nuxt 3 delaet vozmozhnym upravlenie etoj gibridnoj arhitekturoj v odnom файле konfiguraciи.
Strategija Renderirovanija na Urovne Marshrutov
V Nuxt 3 rezhim renderirovanija — eto uzhe ne vyбor na urovne priloženija, a na urovne otdelьnogo marshrutа. V nuxt.config.ts mozhno opredelit' razlichnye strategii dlja kazhdogo marshrutа:
export default defineNuxtConfig({
routeRules: {
'/': { prerender: true },
'/blog/**': { swr: 3600 },
'/api/**': { cors: true, headers: { 'cache-control': 's-maxage=0' } },
'/admin/**': { ssr: false },
'/product/**': { isr: 60 }
}
})
Takaja struktura obespechivает sledujushchie preimushchestva: staticheskie stranici (lending, arhiv bloga) sozdajutsja vo vremja sborki, dinamicheskoe soderzhimoe (stranici produktov) prerenderjatsja po zaprosу. Dlja marshrutа /blog/** s nastrojkoj swr: 3600 stranica serviriruetsja iz CDN s strategiej stale-while-revalidate v techenie 1 chasa — polьzovatel vidит keširovannuju versiju, poka v fone proishodit revalidacija.
Resheniye Mezhdu ISR i SWR
ISR (Incremental Static Regeneration) i SWR (Stale-While-Revalidate) chasto smeshivajutsja. ISR — eto sozdaniye stranicy po zaprosu posle sborki, sohraneniye v keshe i obnovleniye cherez opredelënnyj interval. SWR zhe — eto HTTP cache-control header, kotoryj pokazyvaet staruju versiju, poka v fone proishodit obnovleniye.
Vyberi ISR: Dlja katalogov produktov, soderzhimogo iz CMS i drugie retko obnovljajushchiesja, no vysokotraffichnyе stranici. isr: 60 = revalidacija kazhdye 60 sekund.
Vyberi SWR: Dlja postov bloga, dokumentacii i drugogo soderzhimogo, gde aktualnost' ne kritichna v realnom vremeni. swr: 3600 = 1-chasovoj CDN kesh + fonovoe obnovleniye.
V Roibase-proektah my sniзili vremja sborki na 73% s pomosch'ju ISR (12 min → 3.2 min). Na e-commerce sajte s 15,000 stranijami produktov my prerenderjali tol'ko pervyh 500 produktov vo vremja sborki, ostalnye sozdavalis' po zaprosu s ISR.
Nitro Prerender Crawler
Prerender-motor Nitro v Nuxt 3 avtomaticheski proxodit po vnutrennim ssylkam, chtoby sozdavat' sviazannye stranici vo vremja sborki. Oднако kontrol' povеdenija etogo crawler'a — kritichno dlja performansu:
export default defineNuxtConfig({
nitro: {
prerender: {
crawlLinks: true,
ignore: ['/admin', '/api'],
routes: ['/sitemap.xml', '/rss.xml']
}
}
})
crawlLinks: true nesёt risk: kazhdyj <a> tag na stranice obxodjtsja, chto mozhet privesti k prerendеru nezhelatel'nyh marshrutov. Naprimer, ssylki na social media v footere mogут byt' proslеzheny crawler'om dazhe yesli oni external'nye.
Whitelist Marshrutov dlja Prerendera
Dlja togo chtoby v produkcii prerenderjat' tol'ko opredelёnnyе marshruty, ispol'zuj routes array:
nitro: {
prerender: {
crawlLinks: false,
routes: async () => {
const { data: posts } = await $fetch('/api/posts')
return posts.map(p => `/blog/${p.slug}`)
}
}
}
Etot pattern daёt kontrol' prerendera na osnove fetch-zaprosov. Ty poluchаеsh' spisk marshrutov iz CMS i prerenderjsh' tol'ko ih. Na proekte s 8,000 stranijami headless commerce my snikli vremja sborki s 18 minut do 4.5 minut s etim podhodom.
Bundle Splitting i Isključenie Neispol'zovannogo Koda
Dazhe pri ispol'zovanii SSG-rezhima v Nuxt 3, JavaScript bundle soderzhit vse komponenty. S code splitting na urovne marshrutov ty mozheš optimizirovat' eto:
export default defineNuxtConfig({
experimental: {
payloadExtraction: true
},
router: {
options: {
hashMode: false,
scrollBehaviorType: 'smooth'
}
}
})
payloadExtraction: true vydelyaet dannye prerendernulyh stranij v otдельnye JSON-fajly. Takim obrazom, pri perehodе mezhdu stranicami zagruzhaetsja tol'ko raznica, a initial load bundle umenshautsja na 40%.
Tree Shaking dlya Očistki Neispol'zovannogo Koda
Nuxt 3 ispol'zuet auto-import, chto mozhet privesti k vkljucheniyu neispol'zuemyh komponentov v bundle. Otkljuchi avtomaticheskoe skanirovanie s components: { dirs: [] } i vruchnyuю zagruzhai tol'ko nuzhnye komponenty:
export default defineNuxtConfig({
components: false,
imports: {
dirs: ['composables']
}
})
Etot korennoj podход umenshil razmer bundle na 28% (340KB → 245KB gzip). Kompromiss: padezhт developer experience — teba-ot' vruchnyuyu importirovat' kazhdyj komponent. Gibridnyj podход: avtoimportiruj komponenty iz /components/global, ostalnye — vruchnyuю.
Strategii Gidratacii
Samaya bol'shaya stoimost' SSG — eto gidratacija: sozdaniye Vue instance na client-side dajot 200-400ms TBT (Total Blocking Time). Nastrojka ssr: false v Nuxt 3 polnost'ju jejo deaktivizirует, no vedet k potере SEO.
<template>
<div>
<ClientOnly>
<HeavyInteractiveWidget />
</ClientOnly>
<StaticContent />
</div>
</template>
Komponent <ClientOnly> renderit obezvanyj kod tol'ko na client-side. V HTML-e, sozданnom s SSG, jeta oblast' ostaëtsja placeholder'om, i Vue ee propskaet pri gidratacii. S etim pattern'om na landing page s analytics dashboard my snikli TBT s 420ms do 180ms.
Seleктivnaya Gidratacija
S Nuxt 3.8+ — komponent nuxt-island obespechивает chastichну gidrataciju:
<template>
<NuxtIsland name="ProductCard" :props="{ id: 123 }" />
</template>
NuxtIsland renderitsja na servere i otpravlyaetsja klientu kak HTML, gidratacija rabotaet tol'ko dlja etogo komponenta. Ostalnaya chast' stranici ostaëtsja statichnij. Na e-commerce sajte my perenessli kartochki produktov v island, sto privelo к padezhu stoimosti gidratacii na 64% (TBT 380ms → 135ms).
Optimizacija Performance Sborki
Kogda SSG-sborkа s 15,000+ stranicami previshaet 20 minut, CI/CD pipeline zastrevаet. Jest' 3 sposoba uvelichit' performance sborki v Nuxt 3:
1. Parallel'nyj Prerender:
nitro: {
prerender: {
concurrency: 20,
interval: 0
}
}
concurrency: 20 renderit 20 marshrutov odnovremenno. Oднako est' risk memory leak'a — na 32GB RAM rabotaet bezproблemno, na 8GB vozmozhny OOM oshibki. Testiruй na production CI/CD servere.
2. Inkremental'naya Sborkа (Experimental):
experimental: {
buildCache: true
}
Čitaet neizmenënnye marshruty iz kesha. Но na Nuxt 3.12 eto еsho beta — cache invalidation mozhet rabotat' s oshibkami.
3. Chunking Marshrutov: Rasdelya marshruty na gruppy i buildya ih parallel'no cherez job'y:
# CI/CD pipeline
nuxt build --prerender-routes="/,/about"
nuxt build --prerender-routes="/blog/**" --append
nuxt build --prerender-routes="/product/**" --append
S etim podhodom my razdelili 18-minutnu sborku na 3 parallel'nyh job'a, obshchee vremja sniklo do 6.5 minut.
Consideracii Edge Deployment
Pri deploye SSG na Cloudflare Pages, Vercel Edge ili Netlify, obrati vnimaniye na sledujushchee:
Cloudflare Pages: Nastrojka nitro.preset: 'cloudflare-pages' — objazatel'na. ISR ne podderživaetsja, rabotaet tol'ko SWR. Cache-control nastrajvaetsja vruchnyuyu cherez _headers fajl.
Vercel: ISR nativno podderživaetsja, no vercel.json mozhet perekryvat' route-rules — risk konfigurационnyh konfliktov. Ispol'zuj Nuxt config kak edinственnyj istochnik istiny.
Netlify: _redirects i _headers fajly generirujutsja avtomaticheski, no dlja SWR trebuetsja manual'naya konfiguracija netlify.toml.
V Roibase my deploim storefront's Nuxt 3 SSG na Headless commerce proektah na Cloudflare Pages. Kombinacija edge caching i ISR daёt TTFB (Time to First Byte) nizhe 40ms, LCP (Largest Contentful Paint) ostaëtsja okolo 1.2s.
Strategicheskoe ispol'zovanie Nuxt 3 SSG — eto vyбor pravil'nogo rezhima renderirovanija dlja kazhdogo marshrutа. Kombinuja prerender vo vremja sborki, on-demand ISR i SWR, ty mozheš optimizirovat' Core Web Vitals i snizit' stoimost' sborki. Peresmotrya strategii gidratacii — snizheniye JavaScript nagruzki na client-side daëst 60% ot vsego vyigrysha v performance.