[{"data":1,"prerenderedAt":2404},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fru\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimizacija":13},{"i18nKey":4,"paths":5},"tech-001-2026-06",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-verbesserung","\u002Fen\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimization","\u002Fes\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-2-segundos","\u002Ffr\u002Ftech\u002Fnuxt-3-cloudflare-pages-10s-lcp-vers-2s","\u002Fit\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-ottimizzazione","\u002Fru\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimizacija","\u002Ftr\u002Ftech\u002Fnuxt-3-cloudflare-pages-10s-lcpden-2sye",{"_path":11,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":2398,"_id":2399,"_source":2400,"_file":2401,"_stem":2402,"_extension":2403},"tech",false,"","Nuxt 3 + Cloudflare Pages: LCP с 10s до 2s","Self-hosted шрифты, ленивая гидратация, content-visibility и edge кеширование уменьшили Largest Contentful Paint на 80%. Бенчмарки и примеры кода.","2026-06-16",[21,22,23,24,25],"nuxt-3","cloudflare-pages","web-performance","core-web-vitals","edge-caching",9,"Roibase",{"type":29,"children":30,"toc":2386},"root",[31,48,55,68,101,114,143,155,349,362,367,373,378,399,483,488,832,837,850,857,869,956,968,974,987,1068,1079,1084,1191,1209,1317,1333,1339,1352,1360,1400,1405,1416,1422,1427,1702,1707,1713,1718,2105,2110,2182,2193,2317,2322,2328,2341,2365,2370,2375,2380],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,39,46],{"type":37,"value":38},"text","Nuxt 3 проект e-коммерции, развёрнутый на Cloudflare Pages, показывал LCP 10.2s в PageSpeed Insights. Google Fonts, гидратация на стороне клиента, загрузка above-the-fold контента и заголовки кеша CDN — классические узкие места. С помощью self-hosted font subsetting, Vue 3 lazy hydration API, CSS ",{"type":32,"tag":40,"props":41,"children":43},"code",{"className":42},[],[44],{"type":37,"value":45},"content-visibility",{"type":37,"value":47}," и Cloudflare edge cache TTL мы снизили LCP до 2.1s. В этой статье — техническая детализация четырёх оптимизаций и результаты бенчмарков.",{"type":32,"tag":49,"props":50,"children":52},"h2",{"id":51},"self-hosted-font-subsetting-fcp-снизился-на-900ms",[53],{"type":37,"value":54},"Self-Hosted Font Subsetting: FCP снизился на 900ms",{"type":32,"tag":33,"props":56,"children":57},{},[58,60,66],{"type":37,"value":59},"CSS файл Google Fonts блокировал рендеринг и занимал 320ms. WOFF2 шрифт загружался после, First Contentful Paint достигал 3.8s. Мы установили пакет ",{"type":32,"tag":40,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"@fontsource",{"type":37,"value":67}," и выбрали только Latin подмножество + weight range 400-700:",{"type":32,"tag":69,"props":70,"children":74},"pre",{"code":71,"language":72,"meta":16,"className":73,"style":16},"npm install @fontsource-variable\u002Finter\n","bash","language-bash shiki shiki-themes github-dark",[75],{"type":32,"tag":40,"props":76,"children":77},{"__ignoreMap":16},[78],{"type":32,"tag":79,"props":80,"children":83},"span",{"class":81,"line":82},"line",1,[84,90,96],{"type":32,"tag":79,"props":85,"children":87},{"style":86},"--shiki-default:#B392F0",[88],{"type":37,"value":89},"npm",{"type":32,"tag":79,"props":91,"children":93},{"style":92},"--shiki-default:#9ECBFF",[94],{"type":37,"value":95}," install",{"type":32,"tag":79,"props":97,"children":98},{"style":92},[99],{"type":37,"value":100}," @fontsource-variable\u002Finter\n",{"type":32,"tag":33,"props":102,"children":103},{},[104,106,112],{"type":37,"value":105},"Импорт в ",{"type":32,"tag":40,"props":107,"children":109},{"className":108},[],[110],{"type":37,"value":111},"app.vue",{"type":37,"value":113},":",{"type":32,"tag":69,"props":115,"children":119},{"code":116,"language":117,"meta":16,"className":118,"style":16},"import '@fontsource-variable\u002Finter\u002Fwght.css';\n","javascript","language-javascript shiki shiki-themes github-dark",[120],{"type":32,"tag":40,"props":121,"children":122},{"__ignoreMap":16},[123],{"type":32,"tag":79,"props":124,"children":125},{"class":81,"line":82},[126,132,137],{"type":32,"tag":79,"props":127,"children":129},{"style":128},"--shiki-default:#F97583",[130],{"type":37,"value":131},"import",{"type":32,"tag":79,"props":133,"children":134},{"style":92},[135],{"type":37,"value":136}," '@fontsource-variable\u002Finter\u002Fwght.css'",{"type":32,"tag":79,"props":138,"children":140},{"style":139},"--shiki-default:#E1E4E8",[141],{"type":37,"value":142},";\n",{"type":32,"tag":33,"props":144,"children":145},{},[146,148,154],{"type":37,"value":147},"Настройка в ",{"type":32,"tag":40,"props":149,"children":151},{"className":150},[],[152],{"type":37,"value":153},"nuxt.config.ts",{"type":37,"value":113},{"type":32,"tag":69,"props":156,"children":160},{"code":157,"language":158,"meta":16,"className":159,"style":16},"export default defineNuxtConfig({\n  css: ['@fontsource-variable\u002Finter\u002Fwght.css'],\n  vite: {\n    css: {\n      postcss: {\n        plugins: [\n          require('postcss-preset-env')({\n            features: { 'custom-properties': false }\n          })\n        ]\n      }\n    }\n  }\n});\n","typescript","language-typescript shiki shiki-themes github-dark",[161],{"type":32,"tag":40,"props":162,"children":163},{"__ignoreMap":16},[164,187,206,215,224,233,242,266,296,304,313,322,331,340],{"type":32,"tag":79,"props":165,"children":166},{"class":81,"line":82},[167,172,177,182],{"type":32,"tag":79,"props":168,"children":169},{"style":128},[170],{"type":37,"value":171},"export",{"type":32,"tag":79,"props":173,"children":174},{"style":128},[175],{"type":37,"value":176}," default",{"type":32,"tag":79,"props":178,"children":179},{"style":86},[180],{"type":37,"value":181}," defineNuxtConfig",{"type":32,"tag":79,"props":183,"children":184},{"style":139},[185],{"type":37,"value":186},"({\n",{"type":32,"tag":79,"props":188,"children":190},{"class":81,"line":189},2,[191,196,201],{"type":32,"tag":79,"props":192,"children":193},{"style":139},[194],{"type":37,"value":195},"  css: [",{"type":32,"tag":79,"props":197,"children":198},{"style":92},[199],{"type":37,"value":200},"'@fontsource-variable\u002Finter\u002Fwght.css'",{"type":32,"tag":79,"props":202,"children":203},{"style":139},[204],{"type":37,"value":205},"],\n",{"type":32,"tag":79,"props":207,"children":209},{"class":81,"line":208},3,[210],{"type":32,"tag":79,"props":211,"children":212},{"style":139},[213],{"type":37,"value":214},"  vite: {\n",{"type":32,"tag":79,"props":216,"children":218},{"class":81,"line":217},4,[219],{"type":32,"tag":79,"props":220,"children":221},{"style":139},[222],{"type":37,"value":223},"    css: {\n",{"type":32,"tag":79,"props":225,"children":227},{"class":81,"line":226},5,[228],{"type":32,"tag":79,"props":229,"children":230},{"style":139},[231],{"type":37,"value":232},"      postcss: {\n",{"type":32,"tag":79,"props":234,"children":236},{"class":81,"line":235},6,[237],{"type":32,"tag":79,"props":238,"children":239},{"style":139},[240],{"type":37,"value":241},"        plugins: [\n",{"type":32,"tag":79,"props":243,"children":245},{"class":81,"line":244},7,[246,251,256,261],{"type":32,"tag":79,"props":247,"children":248},{"style":86},[249],{"type":37,"value":250},"          require",{"type":32,"tag":79,"props":252,"children":253},{"style":139},[254],{"type":37,"value":255},"(",{"type":32,"tag":79,"props":257,"children":258},{"style":92},[259],{"type":37,"value":260},"'postcss-preset-env'",{"type":32,"tag":79,"props":262,"children":263},{"style":139},[264],{"type":37,"value":265},")({\n",{"type":32,"tag":79,"props":267,"children":269},{"class":81,"line":268},8,[270,275,280,285,291],{"type":32,"tag":79,"props":271,"children":272},{"style":139},[273],{"type":37,"value":274},"            features: { ",{"type":32,"tag":79,"props":276,"children":277},{"style":92},[278],{"type":37,"value":279},"'custom-properties'",{"type":32,"tag":79,"props":281,"children":282},{"style":139},[283],{"type":37,"value":284},": ",{"type":32,"tag":79,"props":286,"children":288},{"style":287},"--shiki-default:#79B8FF",[289],{"type":37,"value":290},"false",{"type":32,"tag":79,"props":292,"children":293},{"style":139},[294],{"type":37,"value":295}," }\n",{"type":32,"tag":79,"props":297,"children":298},{"class":81,"line":26},[299],{"type":32,"tag":79,"props":300,"children":301},{"style":139},[302],{"type":37,"value":303},"          })\n",{"type":32,"tag":79,"props":305,"children":307},{"class":81,"line":306},10,[308],{"type":32,"tag":79,"props":309,"children":310},{"style":139},[311],{"type":37,"value":312},"        ]\n",{"type":32,"tag":79,"props":314,"children":316},{"class":81,"line":315},11,[317],{"type":32,"tag":79,"props":318,"children":319},{"style":139},[320],{"type":37,"value":321},"      }\n",{"type":32,"tag":79,"props":323,"children":325},{"class":81,"line":324},12,[326],{"type":32,"tag":79,"props":327,"children":328},{"style":139},[329],{"type":37,"value":330},"    }\n",{"type":32,"tag":79,"props":332,"children":334},{"class":81,"line":333},13,[335],{"type":32,"tag":79,"props":336,"children":337},{"style":139},[338],{"type":37,"value":339},"  }\n",{"type":32,"tag":79,"props":341,"children":343},{"class":81,"line":342},14,[344],{"type":32,"tag":79,"props":345,"children":346},{"style":139},[347],{"type":37,"value":348},"});\n",{"type":32,"tag":33,"props":350,"children":351},{},[352,354,360],{"type":37,"value":353},"Результат: WOFF2 файл 24KB, встроен в первый запрос. FCP улучшился: 3.8s → 2.9s. Время блокировки рендеринга: 320ms → 0ms. Мы использовали ",{"type":32,"tag":40,"props":355,"children":357},{"className":356},[],[358],{"type":37,"value":359},"wght.css",{"type":37,"value":361}," для сохранения переменных осей шрифта вместо статических файлов весов.",{"type":32,"tag":33,"props":363,"children":364},{},[365],{"type":37,"value":366},"CDN Google Fonts имеет много edge location'ов, но DNS lookup + TLS handshake добавляли 200-300ms для каждого посетителя. Self-hosted решение исключило дополнительный DNS переход, хотя доставка с Cloudflare Pages edge'а остаётся одинаково быстрой.",{"type":32,"tag":49,"props":368,"children":370},{"id":369},"lazy-hydration-tbt-снизился-с-2190ms-до-200ms",[371],{"type":37,"value":372},"Lazy Hydration: TBT снизился с 2190ms до 200ms",{"type":32,"tag":33,"props":374,"children":375},{},[376],{"type":37,"value":377},"Nuxt 3 по умолчанию гидратирует все компоненты на стороне клиента. На странице каталога товаров 48 карточек, каждая требует 120KB JavaScript для Vue reactivity. Общее время блокировки потока (Total Blocking Time) — 2190ms. Пользователь не может скроллить страницу две секунды.",{"type":32,"tag":33,"props":379,"children":380},{},[381,383,389,391,397],{"type":37,"value":382},"Мы использовали Vue 3.5+ ",{"type":32,"tag":40,"props":384,"children":386},{"className":385},[],[387],{"type":37,"value":388},"defineAsyncComponent",{"type":37,"value":390}," + ",{"type":32,"tag":40,"props":392,"children":394},{"className":393},[],[395],{"type":37,"value":396},"hydration: lazy",{"type":37,"value":398}," для отложенной гидратации below-the-fold компонентов:",{"type":32,"tag":69,"props":400,"children":402},{"code":401,"language":117,"meta":16,"className":118,"style":16},"\u002F\u002F components\u002FProductCard.vue\n\u003Cscript setup>\ndefineOptions({\n  hydration: 'lazy'\n});\n\u003C\u002Fscript>\n",[403],{"type":32,"tag":40,"props":404,"children":405},{"__ignoreMap":16},[406,415,439,447,460,467],{"type":32,"tag":79,"props":407,"children":408},{"class":81,"line":82},[409],{"type":32,"tag":79,"props":410,"children":412},{"style":411},"--shiki-default:#6A737D",[413],{"type":37,"value":414},"\u002F\u002F components\u002FProductCard.vue\n",{"type":32,"tag":79,"props":416,"children":417},{"class":81,"line":189},[418,423,429,434],{"type":32,"tag":79,"props":419,"children":420},{"style":139},[421],{"type":37,"value":422},"\u003C",{"type":32,"tag":79,"props":424,"children":426},{"style":425},"--shiki-default:#85E89D",[427],{"type":37,"value":428},"script",{"type":32,"tag":79,"props":430,"children":431},{"style":86},[432],{"type":37,"value":433}," setup",{"type":32,"tag":79,"props":435,"children":436},{"style":139},[437],{"type":37,"value":438},">\n",{"type":32,"tag":79,"props":440,"children":441},{"class":81,"line":208},[442],{"type":32,"tag":79,"props":443,"children":444},{"style":139},[445],{"type":37,"value":446},"defineOptions({\n",{"type":32,"tag":79,"props":448,"children":449},{"class":81,"line":217},[450,455],{"type":32,"tag":79,"props":451,"children":452},{"style":139},[453],{"type":37,"value":454},"  hydration: ",{"type":32,"tag":79,"props":456,"children":457},{"style":92},[458],{"type":37,"value":459},"'lazy'\n",{"type":32,"tag":79,"props":461,"children":462},{"class":81,"line":226},[463],{"type":32,"tag":79,"props":464,"children":465},{"style":139},[466],{"type":37,"value":348},{"type":32,"tag":79,"props":468,"children":469},{"class":81,"line":235},[470,475,479],{"type":32,"tag":79,"props":471,"children":472},{"style":139},[473],{"type":37,"value":474},"\u003C\u002F",{"type":32,"tag":79,"props":476,"children":477},{"style":425},[478],{"type":37,"value":428},{"type":32,"tag":79,"props":480,"children":481},{"style":139},[482],{"type":37,"value":438},{"type":32,"tag":33,"props":484,"children":485},{},[486],{"type":37,"value":487},"С Intersection Observer гидратация запускается при входе в viewport:",{"type":32,"tag":69,"props":489,"children":491},{"code":490,"language":117,"meta":16,"className":118,"style":16},"\u002F\u002F plugins\u002Flazy-hydration.client.ts\nexport default defineNuxtPlugin((nuxtApp) => {\n  nuxtApp.vueApp.mixin({\n    mounted() {\n      if (this.$options.hydration === 'lazy') {\n        const observer = new IntersectionObserver((entries) => {\n          entries.forEach((entry) => {\n            if (entry.isIntersecting) {\n              this.$forceUpdate();\n              observer.disconnect();\n            }\n          });\n        });\n        observer.observe(this.$el);\n      }\n    }\n  });\n});\n",[492],{"type":32,"tag":40,"props":493,"children":494},{"__ignoreMap":16},[495,503,545,562,575,613,662,696,709,732,749,757,765,773,799,807,815,824],{"type":32,"tag":79,"props":496,"children":497},{"class":81,"line":82},[498],{"type":32,"tag":79,"props":499,"children":500},{"style":411},[501],{"type":37,"value":502},"\u002F\u002F plugins\u002Flazy-hydration.client.ts\n",{"type":32,"tag":79,"props":504,"children":505},{"class":81,"line":189},[506,510,514,519,524,530,535,540],{"type":32,"tag":79,"props":507,"children":508},{"style":128},[509],{"type":37,"value":171},{"type":32,"tag":79,"props":511,"children":512},{"style":128},[513],{"type":37,"value":176},{"type":32,"tag":79,"props":515,"children":516},{"style":86},[517],{"type":37,"value":518}," defineNuxtPlugin",{"type":32,"tag":79,"props":520,"children":521},{"style":139},[522],{"type":37,"value":523},"((",{"type":32,"tag":79,"props":525,"children":527},{"style":526},"--shiki-default:#FFAB70",[528],{"type":37,"value":529},"nuxtApp",{"type":32,"tag":79,"props":531,"children":532},{"style":139},[533],{"type":37,"value":534},") ",{"type":32,"tag":79,"props":536,"children":537},{"style":128},[538],{"type":37,"value":539},"=>",{"type":32,"tag":79,"props":541,"children":542},{"style":139},[543],{"type":37,"value":544}," {\n",{"type":32,"tag":79,"props":546,"children":547},{"class":81,"line":208},[548,553,558],{"type":32,"tag":79,"props":549,"children":550},{"style":139},[551],{"type":37,"value":552},"  nuxtApp.vueApp.",{"type":32,"tag":79,"props":554,"children":555},{"style":86},[556],{"type":37,"value":557},"mixin",{"type":32,"tag":79,"props":559,"children":560},{"style":139},[561],{"type":37,"value":186},{"type":32,"tag":79,"props":563,"children":564},{"class":81,"line":217},[565,570],{"type":32,"tag":79,"props":566,"children":567},{"style":86},[568],{"type":37,"value":569},"    mounted",{"type":32,"tag":79,"props":571,"children":572},{"style":139},[573],{"type":37,"value":574},"() {\n",{"type":32,"tag":79,"props":576,"children":577},{"class":81,"line":226},[578,583,588,593,598,603,608],{"type":32,"tag":79,"props":579,"children":580},{"style":128},[581],{"type":37,"value":582},"      if",{"type":32,"tag":79,"props":584,"children":585},{"style":139},[586],{"type":37,"value":587}," (",{"type":32,"tag":79,"props":589,"children":590},{"style":287},[591],{"type":37,"value":592},"this",{"type":32,"tag":79,"props":594,"children":595},{"style":139},[596],{"type":37,"value":597},".$options.hydration ",{"type":32,"tag":79,"props":599,"children":600},{"style":128},[601],{"type":37,"value":602},"===",{"type":32,"tag":79,"props":604,"children":605},{"style":92},[606],{"type":37,"value":607}," 'lazy'",{"type":32,"tag":79,"props":609,"children":610},{"style":139},[611],{"type":37,"value":612},") {\n",{"type":32,"tag":79,"props":614,"children":615},{"class":81,"line":235},[616,621,626,631,636,641,645,650,654,658],{"type":32,"tag":79,"props":617,"children":618},{"style":128},[619],{"type":37,"value":620},"        const",{"type":32,"tag":79,"props":622,"children":623},{"style":287},[624],{"type":37,"value":625}," observer",{"type":32,"tag":79,"props":627,"children":628},{"style":128},[629],{"type":37,"value":630}," =",{"type":32,"tag":79,"props":632,"children":633},{"style":128},[634],{"type":37,"value":635}," new",{"type":32,"tag":79,"props":637,"children":638},{"style":86},[639],{"type":37,"value":640}," IntersectionObserver",{"type":32,"tag":79,"props":642,"children":643},{"style":139},[644],{"type":37,"value":523},{"type":32,"tag":79,"props":646,"children":647},{"style":526},[648],{"type":37,"value":649},"entries",{"type":32,"tag":79,"props":651,"children":652},{"style":139},[653],{"type":37,"value":534},{"type":32,"tag":79,"props":655,"children":656},{"style":128},[657],{"type":37,"value":539},{"type":32,"tag":79,"props":659,"children":660},{"style":139},[661],{"type":37,"value":544},{"type":32,"tag":79,"props":663,"children":664},{"class":81,"line":244},[665,670,675,679,684,688,692],{"type":32,"tag":79,"props":666,"children":667},{"style":139},[668],{"type":37,"value":669},"          entries.",{"type":32,"tag":79,"props":671,"children":672},{"style":86},[673],{"type":37,"value":674},"forEach",{"type":32,"tag":79,"props":676,"children":677},{"style":139},[678],{"type":37,"value":523},{"type":32,"tag":79,"props":680,"children":681},{"style":526},[682],{"type":37,"value":683},"entry",{"type":32,"tag":79,"props":685,"children":686},{"style":139},[687],{"type":37,"value":534},{"type":32,"tag":79,"props":689,"children":690},{"style":128},[691],{"type":37,"value":539},{"type":32,"tag":79,"props":693,"children":694},{"style":139},[695],{"type":37,"value":544},{"type":32,"tag":79,"props":697,"children":698},{"class":81,"line":268},[699,704],{"type":32,"tag":79,"props":700,"children":701},{"style":128},[702],{"type":37,"value":703},"            if",{"type":32,"tag":79,"props":705,"children":706},{"style":139},[707],{"type":37,"value":708}," (entry.isIntersecting) {\n",{"type":32,"tag":79,"props":710,"children":711},{"class":81,"line":26},[712,717,722,727],{"type":32,"tag":79,"props":713,"children":714},{"style":287},[715],{"type":37,"value":716},"              this",{"type":32,"tag":79,"props":718,"children":719},{"style":139},[720],{"type":37,"value":721},".",{"type":32,"tag":79,"props":723,"children":724},{"style":86},[725],{"type":37,"value":726},"$forceUpdate",{"type":32,"tag":79,"props":728,"children":729},{"style":139},[730],{"type":37,"value":731},"();\n",{"type":32,"tag":79,"props":733,"children":734},{"class":81,"line":306},[735,740,745],{"type":32,"tag":79,"props":736,"children":737},{"style":139},[738],{"type":37,"value":739},"              observer.",{"type":32,"tag":79,"props":741,"children":742},{"style":86},[743],{"type":37,"value":744},"disconnect",{"type":32,"tag":79,"props":746,"children":747},{"style":139},[748],{"type":37,"value":731},{"type":32,"tag":79,"props":750,"children":751},{"class":81,"line":315},[752],{"type":32,"tag":79,"props":753,"children":754},{"style":139},[755],{"type":37,"value":756},"            }\n",{"type":32,"tag":79,"props":758,"children":759},{"class":81,"line":324},[760],{"type":32,"tag":79,"props":761,"children":762},{"style":139},[763],{"type":37,"value":764},"          });\n",{"type":32,"tag":79,"props":766,"children":767},{"class":81,"line":333},[768],{"type":32,"tag":79,"props":769,"children":770},{"style":139},[771],{"type":37,"value":772},"        });\n",{"type":32,"tag":79,"props":774,"children":775},{"class":81,"line":342},[776,781,786,790,794],{"type":32,"tag":79,"props":777,"children":778},{"style":139},[779],{"type":37,"value":780},"        observer.",{"type":32,"tag":79,"props":782,"children":783},{"style":86},[784],{"type":37,"value":785},"observe",{"type":32,"tag":79,"props":787,"children":788},{"style":139},[789],{"type":37,"value":255},{"type":32,"tag":79,"props":791,"children":792},{"style":287},[793],{"type":37,"value":592},{"type":32,"tag":79,"props":795,"children":796},{"style":139},[797],{"type":37,"value":798},".$el);\n",{"type":32,"tag":79,"props":800,"children":802},{"class":81,"line":801},15,[803],{"type":32,"tag":79,"props":804,"children":805},{"style":139},[806],{"type":37,"value":321},{"type":32,"tag":79,"props":808,"children":810},{"class":81,"line":809},16,[811],{"type":32,"tag":79,"props":812,"children":813},{"style":139},[814],{"type":37,"value":330},{"type":32,"tag":79,"props":816,"children":818},{"class":81,"line":817},17,[819],{"type":32,"tag":79,"props":820,"children":821},{"style":139},[822],{"type":37,"value":823},"  });\n",{"type":32,"tag":79,"props":825,"children":827},{"class":81,"line":826},18,[828],{"type":32,"tag":79,"props":829,"children":830},{"style":139},[831],{"type":37,"value":348},{"type":32,"tag":33,"props":833,"children":834},{},[835],{"type":37,"value":836},"Above-the-fold контент (герой + первые 6 товаров) гидратируется сразу, остальное — по требованию. Размер бандла: 480KB → 280KB initial, 200KB lazy chunk. TBT: 2190ms → 200ms. Пользователь может скроллить через одну секунду.",{"type":32,"tag":33,"props":838,"children":839},{},[840,842,848],{"type":37,"value":841},"Компромисс: Event listener для lazy hydration может задержать инициализацию. Для компонентов с обработчиком клика (кнопка \"Добавить в корзину\") мы оставили ",{"type":32,"tag":40,"props":843,"children":845},{"className":844},[],[846],{"type":37,"value":847},"hydration: 'immediate'",{"type":37,"value":849},". Для scroll-triggered контента lazy-гидратация идеальна.",{"type":32,"tag":851,"props":852,"children":854},"h3",{"id":853},"встроенный-lazy-componentи-в-nuxt",[855],{"type":37,"value":856},"Встроенный Lazy Component'и в Nuxt",{"type":32,"tag":33,"props":858,"children":859},{},[860,862,868],{"type":37,"value":861},"Nuxt 3.0+ имеет встроенный префикс ",{"type":32,"tag":40,"props":863,"children":865},{"className":864},[],[866],{"type":37,"value":867},"\u003CLazyComponentName>",{"type":37,"value":113},{"type":32,"tag":69,"props":870,"children":874},{"code":871,"language":872,"meta":16,"className":873,"style":16},"\u003Ctemplate>\n  \u003CLazyProductCard v-for=\"product in products\" :key=\"product.id\" \u002F>\n\u003C\u002Ftemplate>\n","vue","language-vue shiki shiki-themes github-dark",[875],{"type":32,"tag":40,"props":876,"children":877},{"__ignoreMap":16},[878,894,941],{"type":32,"tag":79,"props":879,"children":880},{"class":81,"line":82},[881,885,890],{"type":32,"tag":79,"props":882,"children":883},{"style":139},[884],{"type":37,"value":422},{"type":32,"tag":79,"props":886,"children":887},{"style":425},[888],{"type":37,"value":889},"template",{"type":32,"tag":79,"props":891,"children":892},{"style":139},[893],{"type":37,"value":438},{"type":32,"tag":79,"props":895,"children":896},{"class":81,"line":189},[897,902,907,912,917,922,927,931,936],{"type":32,"tag":79,"props":898,"children":899},{"style":139},[900],{"type":37,"value":901},"  \u003C",{"type":32,"tag":79,"props":903,"children":904},{"style":425},[905],{"type":37,"value":906},"LazyProductCard",{"type":32,"tag":79,"props":908,"children":909},{"style":86},[910],{"type":37,"value":911}," v-for",{"type":32,"tag":79,"props":913,"children":914},{"style":139},[915],{"type":37,"value":916},"=",{"type":32,"tag":79,"props":918,"children":919},{"style":92},[920],{"type":37,"value":921},"\"product in products\"",{"type":32,"tag":79,"props":923,"children":924},{"style":86},[925],{"type":37,"value":926}," :key",{"type":32,"tag":79,"props":928,"children":929},{"style":139},[930],{"type":37,"value":916},{"type":32,"tag":79,"props":932,"children":933},{"style":92},[934],{"type":37,"value":935},"\"product.id\"",{"type":32,"tag":79,"props":937,"children":938},{"style":139},[939],{"type":37,"value":940}," \u002F>\n",{"type":32,"tag":79,"props":942,"children":943},{"class":81,"line":208},[944,948,952],{"type":32,"tag":79,"props":945,"children":946},{"style":139},[947],{"type":37,"value":474},{"type":32,"tag":79,"props":949,"children":950},{"style":425},[951],{"type":37,"value":889},{"type":32,"tag":79,"props":953,"children":954},{"style":139},[955],{"type":37,"value":438},{"type":32,"tag":33,"props":957,"children":958},{},[959,961,967],{"type":37,"value":960},"Этот метод не выполняет SSR компонента, только клиентский mount. Для SEO нужен SSR, поэтому мы выбрали подход с ",{"type":32,"tag":40,"props":962,"children":964},{"className":963},[],[965],{"type":37,"value":966},"defineOptions",{"type":37,"value":721},{"type":32,"tag":49,"props":969,"children":971},{"id":970},"css-content-visibility-lcp-сэкономил-14s",[972],{"type":37,"value":973},"CSS content-visibility: LCP сэкономил 1.4s",{"type":32,"tag":33,"props":975,"children":976},{},[977,979,985],{"type":37,"value":978},"Сетка товаров из 48 карточек вызывала layout shift. Браузер рендерит каждую карточку и пересчитывает CLS, LCP задерживается. Мы использовали ",{"type":32,"tag":40,"props":980,"children":982},{"className":981},[],[983],{"type":37,"value":984},"content-visibility: auto",{"type":37,"value":986}," чтобы исключить off-screen контент из цикла рендеринга:",{"type":32,"tag":69,"props":988,"children":992},{"code":989,"language":990,"meta":16,"className":991,"style":16},".product-card {\n  content-visibility: auto;\n  contain-intrinsic-size: 0 360px;\n}\n","css","language-css shiki shiki-themes github-dark",[993],{"type":32,"tag":40,"props":994,"children":995},{"__ignoreMap":16},[996,1008,1029,1060],{"type":32,"tag":79,"props":997,"children":998},{"class":81,"line":82},[999,1004],{"type":32,"tag":79,"props":1000,"children":1001},{"style":86},[1002],{"type":37,"value":1003},".product-card",{"type":32,"tag":79,"props":1005,"children":1006},{"style":139},[1007],{"type":37,"value":544},{"type":32,"tag":79,"props":1009,"children":1010},{"class":81,"line":189},[1011,1016,1020,1025],{"type":32,"tag":79,"props":1012,"children":1013},{"style":287},[1014],{"type":37,"value":1015},"  content-visibility",{"type":32,"tag":79,"props":1017,"children":1018},{"style":139},[1019],{"type":37,"value":284},{"type":32,"tag":79,"props":1021,"children":1022},{"style":287},[1023],{"type":37,"value":1024},"auto",{"type":32,"tag":79,"props":1026,"children":1027},{"style":139},[1028],{"type":37,"value":142},{"type":32,"tag":79,"props":1030,"children":1031},{"class":81,"line":208},[1032,1037,1041,1046,1051,1056],{"type":32,"tag":79,"props":1033,"children":1034},{"style":287},[1035],{"type":37,"value":1036},"  contain-intrinsic-size",{"type":32,"tag":79,"props":1038,"children":1039},{"style":139},[1040],{"type":37,"value":284},{"type":32,"tag":79,"props":1042,"children":1043},{"style":287},[1044],{"type":37,"value":1045},"0",{"type":32,"tag":79,"props":1047,"children":1048},{"style":287},[1049],{"type":37,"value":1050}," 360",{"type":32,"tag":79,"props":1052,"children":1053},{"style":128},[1054],{"type":37,"value":1055},"px",{"type":32,"tag":79,"props":1057,"children":1058},{"style":139},[1059],{"type":37,"value":142},{"type":32,"tag":79,"props":1061,"children":1062},{"class":81,"line":217},[1063],{"type":32,"tag":79,"props":1064,"children":1065},{"style":139},[1066],{"type":37,"value":1067},"}\n",{"type":32,"tag":33,"props":1069,"children":1070},{},[1071,1077],{"type":32,"tag":40,"props":1072,"children":1074},{"className":1073},[],[1075],{"type":37,"value":1076},"contain-intrinsic-size",{"type":37,"value":1078}," подсказывает браузеру размер элемента (360px высота) и сохраняет layout space для off-screen контента. CLS: 0.18 → 0.02.",{"type":32,"tag":33,"props":1080,"children":1081},{},[1082],{"type":37,"value":1083},"Бенчмарк (Lighthouse 10.4, throttled 4G):",{"type":32,"tag":1085,"props":1086,"children":1087},"table",{},[1088,1117],{"type":32,"tag":1089,"props":1090,"children":1091},"thead",{},[1092],{"type":32,"tag":1093,"props":1094,"children":1095},"tr",{},[1096,1102,1107,1112],{"type":32,"tag":1097,"props":1098,"children":1099},"th",{},[1100],{"type":37,"value":1101},"Метрика",{"type":32,"tag":1097,"props":1103,"children":1104},{},[1105],{"type":37,"value":1106},"До",{"type":32,"tag":1097,"props":1108,"children":1109},{},[1110],{"type":37,"value":1111},"После",{"type":32,"tag":1097,"props":1113,"children":1114},{},[1115],{"type":37,"value":1116},"Улучшение",{"type":32,"tag":1118,"props":1119,"children":1120},"tbody",{},[1121,1145,1168],{"type":32,"tag":1093,"props":1122,"children":1123},{},[1124,1130,1135,1140],{"type":32,"tag":1125,"props":1126,"children":1127},"td",{},[1128],{"type":37,"value":1129},"LCP",{"type":32,"tag":1125,"props":1131,"children":1132},{},[1133],{"type":37,"value":1134},"10.2s",{"type":32,"tag":1125,"props":1136,"children":1137},{},[1138],{"type":37,"value":1139},"2.1s",{"type":32,"tag":1125,"props":1141,"children":1142},{},[1143],{"type":37,"value":1144},"-8.1s",{"type":32,"tag":1093,"props":1146,"children":1147},{},[1148,1153,1158,1163],{"type":32,"tag":1125,"props":1149,"children":1150},{},[1151],{"type":37,"value":1152},"CLS",{"type":32,"tag":1125,"props":1154,"children":1155},{},[1156],{"type":37,"value":1157},"0.18",{"type":32,"tag":1125,"props":1159,"children":1160},{},[1161],{"type":37,"value":1162},"0.02",{"type":32,"tag":1125,"props":1164,"children":1165},{},[1166],{"type":37,"value":1167},"-0.16",{"type":32,"tag":1093,"props":1169,"children":1170},{},[1171,1176,1181,1186],{"type":32,"tag":1125,"props":1172,"children":1173},{},[1174],{"type":37,"value":1175},"TBT",{"type":32,"tag":1125,"props":1177,"children":1178},{},[1179],{"type":37,"value":1180},"2190ms",{"type":32,"tag":1125,"props":1182,"children":1183},{},[1184],{"type":37,"value":1185},"200ms",{"type":32,"tag":1125,"props":1187,"children":1188},{},[1189],{"type":37,"value":1190},"-1990ms",{"type":32,"tag":33,"props":1192,"children":1193},{},[1194,1199,1201,1207],{"type":32,"tag":40,"props":1195,"children":1197},{"className":1196},[],[1198],{"type":37,"value":45},{"type":37,"value":1200}," поддерживается в Safari 17+, на iOS 16 работает fallback. Используйте ",{"type":32,"tag":40,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":37,"value":1206},"@supports",{"type":37,"value":1208}," для progressive enhancement:",{"type":32,"tag":69,"props":1210,"children":1212},{"code":1211,"language":990,"meta":16,"className":991,"style":16},"@supports (content-visibility: auto) {\n  .product-card {\n    content-visibility: auto;\n    contain-intrinsic-size: 0 360px;\n  }\n}\n",[1213],{"type":32,"tag":40,"props":1214,"children":1215},{"__ignoreMap":16},[1216,1243,1255,1275,1303,1310],{"type":32,"tag":79,"props":1217,"children":1218},{"class":81,"line":82},[1219,1223,1227,1231,1235,1239],{"type":32,"tag":79,"props":1220,"children":1221},{"style":128},[1222],{"type":37,"value":1206},{"type":32,"tag":79,"props":1224,"children":1225},{"style":139},[1226],{"type":37,"value":587},{"type":32,"tag":79,"props":1228,"children":1229},{"style":287},[1230],{"type":37,"value":45},{"type":32,"tag":79,"props":1232,"children":1233},{"style":139},[1234],{"type":37,"value":284},{"type":32,"tag":79,"props":1236,"children":1237},{"style":287},[1238],{"type":37,"value":1024},{"type":32,"tag":79,"props":1240,"children":1241},{"style":139},[1242],{"type":37,"value":612},{"type":32,"tag":79,"props":1244,"children":1245},{"class":81,"line":189},[1246,1251],{"type":32,"tag":79,"props":1247,"children":1248},{"style":86},[1249],{"type":37,"value":1250},"  .product-card",{"type":32,"tag":79,"props":1252,"children":1253},{"style":139},[1254],{"type":37,"value":544},{"type":32,"tag":79,"props":1256,"children":1257},{"class":81,"line":208},[1258,1263,1267,1271],{"type":32,"tag":79,"props":1259,"children":1260},{"style":287},[1261],{"type":37,"value":1262},"    content-visibility",{"type":32,"tag":79,"props":1264,"children":1265},{"style":139},[1266],{"type":37,"value":284},{"type":32,"tag":79,"props":1268,"children":1269},{"style":287},[1270],{"type":37,"value":1024},{"type":32,"tag":79,"props":1272,"children":1273},{"style":139},[1274],{"type":37,"value":142},{"type":32,"tag":79,"props":1276,"children":1277},{"class":81,"line":217},[1278,1283,1287,1291,1295,1299],{"type":32,"tag":79,"props":1279,"children":1280},{"style":287},[1281],{"type":37,"value":1282},"    contain-intrinsic-size",{"type":32,"tag":79,"props":1284,"children":1285},{"style":139},[1286],{"type":37,"value":284},{"type":32,"tag":79,"props":1288,"children":1289},{"style":287},[1290],{"type":37,"value":1045},{"type":32,"tag":79,"props":1292,"children":1293},{"style":287},[1294],{"type":37,"value":1050},{"type":32,"tag":79,"props":1296,"children":1297},{"style":128},[1298],{"type":37,"value":1055},{"type":32,"tag":79,"props":1300,"children":1301},{"style":139},[1302],{"type":37,"value":142},{"type":32,"tag":79,"props":1304,"children":1305},{"class":81,"line":226},[1306],{"type":32,"tag":79,"props":1307,"children":1308},{"style":139},[1309],{"type":37,"value":339},{"type":32,"tag":79,"props":1311,"children":1312},{"class":81,"line":235},[1313],{"type":32,"tag":79,"props":1314,"children":1315},{"style":139},[1316],{"type":37,"value":1067},{"type":32,"tag":33,"props":1318,"children":1319},{},[1320,1322,1331],{"type":37,"value":1321},"Этот подход критичен в процессе ",{"type":32,"tag":1323,"props":1324,"children":1328},"a",{"href":1325,"rel":1326},"https:\u002F\u002Fwww.roibase.com.tr\u002Fru\u002Fui-ux",[1327],"nofollow",[1329],{"type":37,"value":1330},"UI\u002FUX дизайна",{"type":37,"value":1332},". Пользовательский опыт независим от стоимости рендеринга off-screen контента.",{"type":32,"tag":49,"props":1334,"children":1336},{"id":1335},"cloudflare-pages-edge-cache-ttl-оптимизация",[1337],{"type":37,"value":1338},"Cloudflare Pages Edge Cache TTL Оптимизация",{"type":32,"tag":33,"props":1340,"children":1341},{},[1342,1344,1350],{"type":37,"value":1343},"Cloudflare Pages использует стандартный edge cache TTL 2 часа. Цены товаров обновляются каждые 15 минут, но визуальные ассеты (изображения, шрифты) остаются неизменными 7 дней. Файл ",{"type":32,"tag":40,"props":1345,"children":1347},{"className":1346},[],[1348],{"type":37,"value":1349},"_headers",{"type":37,"value":1351}," позволяет granular cache control:",{"type":32,"tag":69,"props":1353,"children":1355},{"code":1354},"# _headers\n\u002Fassets\u002F*\n  Cache-Control: public, max-age=604800, immutable\n\n\u002F_nuxt\u002F*\n  Cache-Control: public, max-age=31536000, immutable\n\n\u002Fapi\u002F*\n  Cache-Control: public, s-maxage=900, stale-while-revalidate=60\n\n\u002F*\n  Cache-Control: public, max-age=0, s-maxage=3600, stale-while-revalidate=300\n",[1356],{"type":32,"tag":40,"props":1357,"children":1358},{"__ignoreMap":16},[1359],{"type":37,"value":1354},{"type":32,"tag":1361,"props":1362,"children":1363},"ul",{},[1364,1384,1395],{"type":32,"tag":1365,"props":1366,"children":1367},"li",{},[1368,1374,1376,1382],{"type":32,"tag":40,"props":1369,"children":1371},{"className":1370},[],[1372],{"type":37,"value":1373},"\u002Fassets\u002F*",{"type":37,"value":1375}," и ",{"type":32,"tag":40,"props":1377,"children":1379},{"className":1378},[],[1380],{"type":37,"value":1381},"\u002F_nuxt\u002F*",{"type":37,"value":1383},": 1 год immutable (URL меняется с хешем, новый файл = новый путь)",{"type":32,"tag":1365,"props":1385,"children":1386},{},[1387,1393],{"type":32,"tag":40,"props":1388,"children":1390},{"className":1389},[],[1391],{"type":37,"value":1392},"\u002Fapi\u002F*",{"type":37,"value":1394},": 15 минут edge cache, 60 сек stale-while-revalidate (если origin упал, отдай старые данные)",{"type":32,"tag":1365,"props":1396,"children":1397},{},[1398],{"type":37,"value":1399},"Root HTML: 1 час edge cache, 5 минут stale-while-revalidate",{"type":32,"tag":33,"props":1401,"children":1402},{},[1403],{"type":37,"value":1404},"Time to First Byte с edge location'а — 40ms, с origin — 280ms. Hit rate кеша: 89% → 96%. TTFB median: 280ms → 45ms.",{"type":32,"tag":33,"props":1406,"children":1407},{},[1408,1414],{"type":32,"tag":40,"props":1409,"children":1411},{"className":1410},[],[1412],{"type":37,"value":1413},"stale-while-revalidate",{"type":37,"value":1415}," критичен для UX: Если origin обновляется, кеш отдаёт старую версию пользователю, а в фоне запрашивает свежие данные. Пользователь не ждёт.",{"type":32,"tag":851,"props":1417,"children":1419},{"id":1418},"cloudflare-kv-для-selective-cache-purge",[1420],{"type":37,"value":1421},"Cloudflare KV для Selective Cache Purge",{"type":32,"tag":33,"props":1423,"children":1424},{},[1425],{"type":37,"value":1426},"Вместо purge всего кеша при обновлении цены используем Cloudflare KV + Workers для targeted invalidation:",{"type":32,"tag":69,"props":1428,"children":1430},{"code":1429,"language":117,"meta":16,"className":118,"style":16},"\u002F\u002F workers\u002Fcache-purge.js\nexport default {\n  async fetch(request, env) {\n    const url = new URL(request.url);\n    const productId = url.searchParams.get('id');\n    \n    const cacheKey = `product:${productId}`;\n    await env.CACHE_KV.delete(cacheKey);\n    \n    return new Response('Cache purged', { status: 200 });\n  }\n};\n",[1431],{"type":32,"tag":40,"props":1432,"children":1433},{"__ignoreMap":16},[1434,1442,1457,1493,1524,1564,1572,1607,1639,1646,1687,1694],{"type":32,"tag":79,"props":1435,"children":1436},{"class":81,"line":82},[1437],{"type":32,"tag":79,"props":1438,"children":1439},{"style":411},[1440],{"type":37,"value":1441},"\u002F\u002F workers\u002Fcache-purge.js\n",{"type":32,"tag":79,"props":1443,"children":1444},{"class":81,"line":189},[1445,1449,1453],{"type":32,"tag":79,"props":1446,"children":1447},{"style":128},[1448],{"type":37,"value":171},{"type":32,"tag":79,"props":1450,"children":1451},{"style":128},[1452],{"type":37,"value":176},{"type":32,"tag":79,"props":1454,"children":1455},{"style":139},[1456],{"type":37,"value":544},{"type":32,"tag":79,"props":1458,"children":1459},{"class":81,"line":208},[1460,1465,1470,1474,1479,1484,1489],{"type":32,"tag":79,"props":1461,"children":1462},{"style":128},[1463],{"type":37,"value":1464},"  async",{"type":32,"tag":79,"props":1466,"children":1467},{"style":86},[1468],{"type":37,"value":1469}," fetch",{"type":32,"tag":79,"props":1471,"children":1472},{"style":139},[1473],{"type":37,"value":255},{"type":32,"tag":79,"props":1475,"children":1476},{"style":526},[1477],{"type":37,"value":1478},"request",{"type":32,"tag":79,"props":1480,"children":1481},{"style":139},[1482],{"type":37,"value":1483},", ",{"type":32,"tag":79,"props":1485,"children":1486},{"style":526},[1487],{"type":37,"value":1488},"env",{"type":32,"tag":79,"props":1490,"children":1491},{"style":139},[1492],{"type":37,"value":612},{"type":32,"tag":79,"props":1494,"children":1495},{"class":81,"line":217},[1496,1501,1506,1510,1514,1519],{"type":32,"tag":79,"props":1497,"children":1498},{"style":128},[1499],{"type":37,"value":1500},"    const",{"type":32,"tag":79,"props":1502,"children":1503},{"style":287},[1504],{"type":37,"value":1505}," url",{"type":32,"tag":79,"props":1507,"children":1508},{"style":128},[1509],{"type":37,"value":630},{"type":32,"tag":79,"props":1511,"children":1512},{"style":128},[1513],{"type":37,"value":635},{"type":32,"tag":79,"props":1515,"children":1516},{"style":86},[1517],{"type":37,"value":1518}," URL",{"type":32,"tag":79,"props":1520,"children":1521},{"style":139},[1522],{"type":37,"value":1523},"(request.url);\n",{"type":32,"tag":79,"props":1525,"children":1526},{"class":81,"line":226},[1527,1531,1536,1540,1545,1550,1554,1559],{"type":32,"tag":79,"props":1528,"children":1529},{"style":128},[1530],{"type":37,"value":1500},{"type":32,"tag":79,"props":1532,"children":1533},{"style":287},[1534],{"type":37,"value":1535}," productId",{"type":32,"tag":79,"props":1537,"children":1538},{"style":128},[1539],{"type":37,"value":630},{"type":32,"tag":79,"props":1541,"children":1542},{"style":139},[1543],{"type":37,"value":1544}," url.searchParams.",{"type":32,"tag":79,"props":1546,"children":1547},{"style":86},[1548],{"type":37,"value":1549},"get",{"type":32,"tag":79,"props":1551,"children":1552},{"style":139},[1553],{"type":37,"value":255},{"type":32,"tag":79,"props":1555,"children":1556},{"style":92},[1557],{"type":37,"value":1558},"'id'",{"type":32,"tag":79,"props":1560,"children":1561},{"style":139},[1562],{"type":37,"value":1563},");\n",{"type":32,"tag":79,"props":1565,"children":1566},{"class":81,"line":235},[1567],{"type":32,"tag":79,"props":1568,"children":1569},{"style":139},[1570],{"type":37,"value":1571},"    \n",{"type":32,"tag":79,"props":1573,"children":1574},{"class":81,"line":244},[1575,1579,1584,1588,1593,1598,1603],{"type":32,"tag":79,"props":1576,"children":1577},{"style":128},[1578],{"type":37,"value":1500},{"type":32,"tag":79,"props":1580,"children":1581},{"style":287},[1582],{"type":37,"value":1583}," cacheKey",{"type":32,"tag":79,"props":1585,"children":1586},{"style":128},[1587],{"type":37,"value":630},{"type":32,"tag":79,"props":1589,"children":1590},{"style":92},[1591],{"type":37,"value":1592}," `product:${",{"type":32,"tag":79,"props":1594,"children":1595},{"style":139},[1596],{"type":37,"value":1597},"productId",{"type":32,"tag":79,"props":1599,"children":1600},{"style":92},[1601],{"type":37,"value":1602},"}`",{"type":32,"tag":79,"props":1604,"children":1605},{"style":139},[1606],{"type":37,"value":142},{"type":32,"tag":79,"props":1608,"children":1609},{"class":81,"line":268},[1610,1615,1620,1625,1629,1634],{"type":32,"tag":79,"props":1611,"children":1612},{"style":128},[1613],{"type":37,"value":1614},"    await",{"type":32,"tag":79,"props":1616,"children":1617},{"style":139},[1618],{"type":37,"value":1619}," env.",{"type":32,"tag":79,"props":1621,"children":1622},{"style":287},[1623],{"type":37,"value":1624},"CACHE_KV",{"type":32,"tag":79,"props":1626,"children":1627},{"style":139},[1628],{"type":37,"value":721},{"type":32,"tag":79,"props":1630,"children":1631},{"style":86},[1632],{"type":37,"value":1633},"delete",{"type":32,"tag":79,"props":1635,"children":1636},{"style":139},[1637],{"type":37,"value":1638},"(cacheKey);\n",{"type":32,"tag":79,"props":1640,"children":1641},{"class":81,"line":26},[1642],{"type":32,"tag":79,"props":1643,"children":1644},{"style":139},[1645],{"type":37,"value":1571},{"type":32,"tag":79,"props":1647,"children":1648},{"class":81,"line":306},[1649,1654,1658,1663,1667,1672,1677,1682],{"type":32,"tag":79,"props":1650,"children":1651},{"style":128},[1652],{"type":37,"value":1653},"    return",{"type":32,"tag":79,"props":1655,"children":1656},{"style":128},[1657],{"type":37,"value":635},{"type":32,"tag":79,"props":1659,"children":1660},{"style":86},[1661],{"type":37,"value":1662}," Response",{"type":32,"tag":79,"props":1664,"children":1665},{"style":139},[1666],{"type":37,"value":255},{"type":32,"tag":79,"props":1668,"children":1669},{"style":92},[1670],{"type":37,"value":1671},"'Cache purged'",{"type":32,"tag":79,"props":1673,"children":1674},{"style":139},[1675],{"type":37,"value":1676},", { status: ",{"type":32,"tag":79,"props":1678,"children":1679},{"style":287},[1680],{"type":37,"value":1681},"200",{"type":32,"tag":79,"props":1683,"children":1684},{"style":139},[1685],{"type":37,"value":1686}," });\n",{"type":32,"tag":79,"props":1688,"children":1689},{"class":81,"line":315},[1690],{"type":32,"tag":79,"props":1691,"children":1692},{"style":139},[1693],{"type":37,"value":339},{"type":32,"tag":79,"props":1695,"children":1696},{"class":81,"line":324},[1697],{"type":32,"tag":79,"props":1698,"children":1699},{"style":139},[1700],{"type":37,"value":1701},"};\n",{"type":32,"tag":33,"props":1703,"children":1704},{},[1705],{"type":37,"value":1706},"Админ-панель → обновление цены → webhook → Cloudflare Worker → KV delete. Edge cache TTL сохраняется, только изменённые товары invalidate.",{"type":32,"tag":49,"props":1708,"children":1710},{"id":1709},"performance-мониторинг-и-regression-prevention",[1711],{"type":37,"value":1712},"Performance Мониторинг и Regression Prevention",{"type":32,"tag":33,"props":1714,"children":1715},{},[1716],{"type":37,"value":1717},"RUM (Real User Monitoring) с Cloudflare Web Analytics + custom Navigation Timing beacon:",{"type":32,"tag":69,"props":1719,"children":1721},{"code":1720,"language":117,"meta":16,"className":118,"style":16},"\u002F\u002F plugins\u002Fanalytics.client.ts\nexport default defineNuxtPlugin(() => {\n  if (typeof window !== 'undefined') {\n    window.addEventListener('load', () => {\n      const perfData = performance.getEntriesByType('navigation')[0];\n      const lcp = performance.getEntriesByType('largest-contentful-paint')[0];\n      \n      fetch('\u002Fapi\u002Fperf', {\n        method: 'POST',\n        body: JSON.stringify({\n          ttfb: perfData.responseStart - perfData.requestStart,\n          fcp: perfData.domContentLoadedEventEnd - perfData.fetchStart,\n          lcp: lcp?.renderTime || 0,\n          pathname: window.location.pathname\n        })\n      });\n    });\n  }\n});\n",[1722],{"type":32,"tag":40,"props":1723,"children":1724},{"__ignoreMap":16},[1725,1733,1761,1797,1832,1882,1927,1935,1957,1975,2001,2019,2036,2058,2066,2074,2082,2090,2097],{"type":32,"tag":79,"props":1726,"children":1727},{"class":81,"line":82},[1728],{"type":32,"tag":79,"props":1729,"children":1730},{"style":411},[1731],{"type":37,"value":1732},"\u002F\u002F plugins\u002Fanalytics.client.ts\n",{"type":32,"tag":79,"props":1734,"children":1735},{"class":81,"line":189},[1736,1740,1744,1748,1753,1757],{"type":32,"tag":79,"props":1737,"children":1738},{"style":128},[1739],{"type":37,"value":171},{"type":32,"tag":79,"props":1741,"children":1742},{"style":128},[1743],{"type":37,"value":176},{"type":32,"tag":79,"props":1745,"children":1746},{"style":86},[1747],{"type":37,"value":518},{"type":32,"tag":79,"props":1749,"children":1750},{"style":139},[1751],{"type":37,"value":1752},"(() ",{"type":32,"tag":79,"props":1754,"children":1755},{"style":128},[1756],{"type":37,"value":539},{"type":32,"tag":79,"props":1758,"children":1759},{"style":139},[1760],{"type":37,"value":544},{"type":32,"tag":79,"props":1762,"children":1763},{"class":81,"line":208},[1764,1769,1773,1778,1783,1788,1793],{"type":32,"tag":79,"props":1765,"children":1766},{"style":128},[1767],{"type":37,"value":1768},"  if",{"type":32,"tag":79,"props":1770,"children":1771},{"style":139},[1772],{"type":37,"value":587},{"type":32,"tag":79,"props":1774,"children":1775},{"style":128},[1776],{"type":37,"value":1777},"typeof",{"type":32,"tag":79,"props":1779,"children":1780},{"style":139},[1781],{"type":37,"value":1782}," window ",{"type":32,"tag":79,"props":1784,"children":1785},{"style":128},[1786],{"type":37,"value":1787},"!==",{"type":32,"tag":79,"props":1789,"children":1790},{"style":92},[1791],{"type":37,"value":1792}," 'undefined'",{"type":32,"tag":79,"props":1794,"children":1795},{"style":139},[1796],{"type":37,"value":612},{"type":32,"tag":79,"props":1798,"children":1799},{"class":81,"line":217},[1800,1805,1810,1814,1819,1824,1828],{"type":32,"tag":79,"props":1801,"children":1802},{"style":139},[1803],{"type":37,"value":1804},"    window.",{"type":32,"tag":79,"props":1806,"children":1807},{"style":86},[1808],{"type":37,"value":1809},"addEventListener",{"type":32,"tag":79,"props":1811,"children":1812},{"style":139},[1813],{"type":37,"value":255},{"type":32,"tag":79,"props":1815,"children":1816},{"style":92},[1817],{"type":37,"value":1818},"'load'",{"type":32,"tag":79,"props":1820,"children":1821},{"style":139},[1822],{"type":37,"value":1823},", () ",{"type":32,"tag":79,"props":1825,"children":1826},{"style":128},[1827],{"type":37,"value":539},{"type":32,"tag":79,"props":1829,"children":1830},{"style":139},[1831],{"type":37,"value":544},{"type":32,"tag":79,"props":1833,"children":1834},{"class":81,"line":226},[1835,1840,1845,1849,1854,1859,1863,1868,1873,1877],{"type":32,"tag":79,"props":1836,"children":1837},{"style":128},[1838],{"type":37,"value":1839},"      const",{"type":32,"tag":79,"props":1841,"children":1842},{"style":287},[1843],{"type":37,"value":1844}," perfData",{"type":32,"tag":79,"props":1846,"children":1847},{"style":128},[1848],{"type":37,"value":630},{"type":32,"tag":79,"props":1850,"children":1851},{"style":139},[1852],{"type":37,"value":1853}," performance.",{"type":32,"tag":79,"props":1855,"children":1856},{"style":86},[1857],{"type":37,"value":1858},"getEntriesByType",{"type":32,"tag":79,"props":1860,"children":1861},{"style":139},[1862],{"type":37,"value":255},{"type":32,"tag":79,"props":1864,"children":1865},{"style":92},[1866],{"type":37,"value":1867},"'navigation'",{"type":32,"tag":79,"props":1869,"children":1870},{"style":139},[1871],{"type":37,"value":1872},")[",{"type":32,"tag":79,"props":1874,"children":1875},{"style":287},[1876],{"type":37,"value":1045},{"type":32,"tag":79,"props":1878,"children":1879},{"style":139},[1880],{"type":37,"value":1881},"];\n",{"type":32,"tag":79,"props":1883,"children":1884},{"class":81,"line":235},[1885,1889,1894,1898,1902,1906,1910,1915,1919,1923],{"type":32,"tag":79,"props":1886,"children":1887},{"style":128},[1888],{"type":37,"value":1839},{"type":32,"tag":79,"props":1890,"children":1891},{"style":287},[1892],{"type":37,"value":1893}," lcp",{"type":32,"tag":79,"props":1895,"children":1896},{"style":128},[1897],{"type":37,"value":630},{"type":32,"tag":79,"props":1899,"children":1900},{"style":139},[1901],{"type":37,"value":1853},{"type":32,"tag":79,"props":1903,"children":1904},{"style":86},[1905],{"type":37,"value":1858},{"type":32,"tag":79,"props":1907,"children":1908},{"style":139},[1909],{"type":37,"value":255},{"type":32,"tag":79,"props":1911,"children":1912},{"style":92},[1913],{"type":37,"value":1914},"'largest-contentful-paint'",{"type":32,"tag":79,"props":1916,"children":1917},{"style":139},[1918],{"type":37,"value":1872},{"type":32,"tag":79,"props":1920,"children":1921},{"style":287},[1922],{"type":37,"value":1045},{"type":32,"tag":79,"props":1924,"children":1925},{"style":139},[1926],{"type":37,"value":1881},{"type":32,"tag":79,"props":1928,"children":1929},{"class":81,"line":244},[1930],{"type":32,"tag":79,"props":1931,"children":1932},{"style":139},[1933],{"type":37,"value":1934},"      \n",{"type":32,"tag":79,"props":1936,"children":1937},{"class":81,"line":268},[1938,1943,1947,1952],{"type":32,"tag":79,"props":1939,"children":1940},{"style":86},[1941],{"type":37,"value":1942},"      fetch",{"type":32,"tag":79,"props":1944,"children":1945},{"style":139},[1946],{"type":37,"value":255},{"type":32,"tag":79,"props":1948,"children":1949},{"style":92},[1950],{"type":37,"value":1951},"'\u002Fapi\u002Fperf'",{"type":32,"tag":79,"props":1953,"children":1954},{"style":139},[1955],{"type":37,"value":1956},", {\n",{"type":32,"tag":79,"props":1958,"children":1959},{"class":81,"line":26},[1960,1965,1970],{"type":32,"tag":79,"props":1961,"children":1962},{"style":139},[1963],{"type":37,"value":1964},"        method: ",{"type":32,"tag":79,"props":1966,"children":1967},{"style":92},[1968],{"type":37,"value":1969},"'POST'",{"type":32,"tag":79,"props":1971,"children":1972},{"style":139},[1973],{"type":37,"value":1974},",\n",{"type":32,"tag":79,"props":1976,"children":1977},{"class":81,"line":306},[1978,1983,1988,1992,1997],{"type":32,"tag":79,"props":1979,"children":1980},{"style":139},[1981],{"type":37,"value":1982},"        body: ",{"type":32,"tag":79,"props":1984,"children":1985},{"style":287},[1986],{"type":37,"value":1987},"JSON",{"type":32,"tag":79,"props":1989,"children":1990},{"style":139},[1991],{"type":37,"value":721},{"type":32,"tag":79,"props":1993,"children":1994},{"style":86},[1995],{"type":37,"value":1996},"stringify",{"type":32,"tag":79,"props":1998,"children":1999},{"style":139},[2000],{"type":37,"value":186},{"type":32,"tag":79,"props":2002,"children":2003},{"class":81,"line":315},[2004,2009,2014],{"type":32,"tag":79,"props":2005,"children":2006},{"style":139},[2007],{"type":37,"value":2008},"          ttfb: perfData.responseStart ",{"type":32,"tag":79,"props":2010,"children":2011},{"style":128},[2012],{"type":37,"value":2013},"-",{"type":32,"tag":79,"props":2015,"children":2016},{"style":139},[2017],{"type":37,"value":2018}," perfData.requestStart,\n",{"type":32,"tag":79,"props":2020,"children":2021},{"class":81,"line":324},[2022,2027,2031],{"type":32,"tag":79,"props":2023,"children":2024},{"style":139},[2025],{"type":37,"value":2026},"          fcp: perfData.domContentLoadedEventEnd ",{"type":32,"tag":79,"props":2028,"children":2029},{"style":128},[2030],{"type":37,"value":2013},{"type":32,"tag":79,"props":2032,"children":2033},{"style":139},[2034],{"type":37,"value":2035}," perfData.fetchStart,\n",{"type":32,"tag":79,"props":2037,"children":2038},{"class":81,"line":333},[2039,2044,2049,2054],{"type":32,"tag":79,"props":2040,"children":2041},{"style":139},[2042],{"type":37,"value":2043},"          lcp: lcp?.renderTime ",{"type":32,"tag":79,"props":2045,"children":2046},{"style":128},[2047],{"type":37,"value":2048},"||",{"type":32,"tag":79,"props":2050,"children":2051},{"style":287},[2052],{"type":37,"value":2053}," 0",{"type":32,"tag":79,"props":2055,"children":2056},{"style":139},[2057],{"type":37,"value":1974},{"type":32,"tag":79,"props":2059,"children":2060},{"class":81,"line":342},[2061],{"type":32,"tag":79,"props":2062,"children":2063},{"style":139},[2064],{"type":37,"value":2065},"          pathname: window.location.pathname\n",{"type":32,"tag":79,"props":2067,"children":2068},{"class":81,"line":801},[2069],{"type":32,"tag":79,"props":2070,"children":2071},{"style":139},[2072],{"type":37,"value":2073},"        })\n",{"type":32,"tag":79,"props":2075,"children":2076},{"class":81,"line":809},[2077],{"type":32,"tag":79,"props":2078,"children":2079},{"style":139},[2080],{"type":37,"value":2081},"      });\n",{"type":32,"tag":79,"props":2083,"children":2084},{"class":81,"line":817},[2085],{"type":32,"tag":79,"props":2086,"children":2087},{"style":139},[2088],{"type":37,"value":2089},"    });\n",{"type":32,"tag":79,"props":2091,"children":2092},{"class":81,"line":826},[2093],{"type":32,"tag":79,"props":2094,"children":2095},{"style":139},[2096],{"type":37,"value":339},{"type":32,"tag":79,"props":2098,"children":2100},{"class":81,"line":2099},19,[2101],{"type":32,"tag":79,"props":2102,"children":2103},{"style":139},[2104],{"type":37,"value":348},{"type":32,"tag":33,"props":2106,"children":2107},{},[2108],{"type":37,"value":2109},"Данные в BigQuery, дневной P75 LCP мониторится. При превышении 2.5s — Slack alert. CI\u002FCD pipeline использует Lighthouse CI для regression check:",{"type":32,"tag":69,"props":2111,"children":2115},{"code":2112,"language":2113,"meta":16,"className":2114,"style":16},"# .github\u002Fworkflows\u002Flighthouse.yml\n- name: Lighthouse CI\n  run: |\n    npm install -g @lhci\u002Fcli\n    lhci autorun --config=.\u002Flighthouserc.json\n","yaml","language-yaml shiki shiki-themes github-dark",[2116],{"type":32,"tag":40,"props":2117,"children":2118},{"__ignoreMap":16},[2119,2127,2149,2166,2174],{"type":32,"tag":79,"props":2120,"children":2121},{"class":81,"line":82},[2122],{"type":32,"tag":79,"props":2123,"children":2124},{"style":411},[2125],{"type":37,"value":2126},"# .github\u002Fworkflows\u002Flighthouse.yml\n",{"type":32,"tag":79,"props":2128,"children":2129},{"class":81,"line":189},[2130,2135,2140,2144],{"type":32,"tag":79,"props":2131,"children":2132},{"style":139},[2133],{"type":37,"value":2134},"- ",{"type":32,"tag":79,"props":2136,"children":2137},{"style":425},[2138],{"type":37,"value":2139},"name",{"type":32,"tag":79,"props":2141,"children":2142},{"style":139},[2143],{"type":37,"value":284},{"type":32,"tag":79,"props":2145,"children":2146},{"style":92},[2147],{"type":37,"value":2148},"Lighthouse CI\n",{"type":32,"tag":79,"props":2150,"children":2151},{"class":81,"line":208},[2152,2157,2161],{"type":32,"tag":79,"props":2153,"children":2154},{"style":425},[2155],{"type":37,"value":2156},"  run",{"type":32,"tag":79,"props":2158,"children":2159},{"style":139},[2160],{"type":37,"value":284},{"type":32,"tag":79,"props":2162,"children":2163},{"style":128},[2164],{"type":37,"value":2165},"|\n",{"type":32,"tag":79,"props":2167,"children":2168},{"class":81,"line":217},[2169],{"type":32,"tag":79,"props":2170,"children":2171},{"style":92},[2172],{"type":37,"value":2173},"    npm install -g @lhci\u002Fcli\n",{"type":32,"tag":79,"props":2175,"children":2176},{"class":81,"line":226},[2177],{"type":32,"tag":79,"props":2178,"children":2179},{"style":92},[2180],{"type":37,"value":2181},"    lhci autorun --config=.\u002Flighthouserc.json\n",{"type":32,"tag":33,"props":2183,"children":2184},{},[2185,2191],{"type":32,"tag":40,"props":2186,"children":2188},{"className":2187},[],[2189],{"type":37,"value":2190},"lighthouserc.json",{"type":37,"value":2192}," содержит LCP assertion:",{"type":32,"tag":69,"props":2194,"children":2198},{"code":2195,"language":2196,"meta":16,"className":2197,"style":16},"{\n  \"ci\": {\n    \"assert\": {\n      \"assertions\": {\n        \"largest-contentful-paint\": [\"error\", { \"maxNumericValue\": 2500 }]\n      }\n    }\n  }\n}\n","json","language-json shiki shiki-themes github-dark",[2199],{"type":32,"tag":40,"props":2200,"children":2201},{"__ignoreMap":16},[2202,2210,2223,2235,2247,2289,2296,2303,2310],{"type":32,"tag":79,"props":2203,"children":2204},{"class":81,"line":82},[2205],{"type":32,"tag":79,"props":2206,"children":2207},{"style":139},[2208],{"type":37,"value":2209},"{\n",{"type":32,"tag":79,"props":2211,"children":2212},{"class":81,"line":189},[2213,2218],{"type":32,"tag":79,"props":2214,"children":2215},{"style":287},[2216],{"type":37,"value":2217},"  \"ci\"",{"type":32,"tag":79,"props":2219,"children":2220},{"style":139},[2221],{"type":37,"value":2222},": {\n",{"type":32,"tag":79,"props":2224,"children":2225},{"class":81,"line":208},[2226,2231],{"type":32,"tag":79,"props":2227,"children":2228},{"style":287},[2229],{"type":37,"value":2230},"    \"assert\"",{"type":32,"tag":79,"props":2232,"children":2233},{"style":139},[2234],{"type":37,"value":2222},{"type":32,"tag":79,"props":2236,"children":2237},{"class":81,"line":217},[2238,2243],{"type":32,"tag":79,"props":2239,"children":2240},{"style":287},[2241],{"type":37,"value":2242},"      \"assertions\"",{"type":32,"tag":79,"props":2244,"children":2245},{"style":139},[2246],{"type":37,"value":2222},{"type":32,"tag":79,"props":2248,"children":2249},{"class":81,"line":226},[2250,2255,2260,2265,2270,2275,2279,2284],{"type":32,"tag":79,"props":2251,"children":2252},{"style":287},[2253],{"type":37,"value":2254},"        \"largest-contentful-paint\"",{"type":32,"tag":79,"props":2256,"children":2257},{"style":139},[2258],{"type":37,"value":2259},": [",{"type":32,"tag":79,"props":2261,"children":2262},{"style":92},[2263],{"type":37,"value":2264},"\"error\"",{"type":32,"tag":79,"props":2266,"children":2267},{"style":139},[2268],{"type":37,"value":2269},", { ",{"type":32,"tag":79,"props":2271,"children":2272},{"style":287},[2273],{"type":37,"value":2274},"\"maxNumericValue\"",{"type":32,"tag":79,"props":2276,"children":2277},{"style":139},[2278],{"type":37,"value":284},{"type":32,"tag":79,"props":2280,"children":2281},{"style":287},[2282],{"type":37,"value":2283},"2500",{"type":32,"tag":79,"props":2285,"children":2286},{"style":139},[2287],{"type":37,"value":2288}," }]\n",{"type":32,"tag":79,"props":2290,"children":2291},{"class":81,"line":235},[2292],{"type":32,"tag":79,"props":2293,"children":2294},{"style":139},[2295],{"type":37,"value":321},{"type":32,"tag":79,"props":2297,"children":2298},{"class":81,"line":244},[2299],{"type":32,"tag":79,"props":2300,"children":2301},{"style":139},[2302],{"type":37,"value":330},{"type":32,"tag":79,"props":2304,"children":2305},{"class":81,"line":268},[2306],{"type":32,"tag":79,"props":2307,"children":2308},{"style":139},[2309],{"type":37,"value":339},{"type":32,"tag":79,"props":2311,"children":2312},{"class":81,"line":26},[2313],{"type":32,"tag":79,"props":2314,"children":2315},{"style":139},[2316],{"type":37,"value":1067},{"type":32,"tag":33,"props":2318,"children":2319},{},[2320],{"type":37,"value":2321},"Если LCP при развёртывании превышает 2.5s, сборка падает. Production регрессия предотвращена.",{"type":32,"tag":49,"props":2323,"children":2325},{"id":2324},"компромиссы-и-edge-cases",[2326],{"type":37,"value":2327},"Компромиссы и Edge Cases",{"type":32,"tag":33,"props":2329,"children":2330},{},[2331,2333,2339],{"type":37,"value":2332},"Lazy hydration зависит от scroll position. Быстрый скролл может отложить гидратацию и влияет на interactivity. Решение: Intersection Observer с ",{"type":32,"tag":40,"props":2334,"children":2336},{"className":2335},[],[2337],{"type":37,"value":2338},"rootMargin: '100px'",{"type":37,"value":2340}," — гидратация запускается за 100px до viewport.",{"type":32,"tag":33,"props":2342,"children":2343},{},[2344,2349,2351,2357,2358,2363],{"type":32,"tag":40,"props":2345,"children":2347},{"className":2346},[],[2348],{"type":37,"value":45},{"type":37,"value":2350}," в grid layout'ах может вызвать CLS при изменении column count. Необходимо фиксировать ",{"type":32,"tag":40,"props":2352,"children":2354},{"className":2353},[],[2355],{"type":37,"value":2356},"grid-template-columns",{"type":37,"value":390},{"type":32,"tag":40,"props":2359,"children":2361},{"className":2360},[],[2362],{"type":37,"value":1076},{"type":37,"value":2364}," комбинацию.",{"type":32,"tag":33,"props":2366,"children":2367},{},[2368],{"type":37,"value":2369},"Edge cache с stale-while-revalidate создаёт риск несогласованности цен: Пользователь A видит старую цену, пользователь B — новую. Выбор зависит от требований: E-коммерция допускает 60 сек stale window, fintech — нет.",{"type":32,"tag":33,"props":2371,"children":2372},{},[2373],{"type":37,"value":2374},"Self-hosted шрифты требуют проверки лицензии. Google Fonts использует SIL Open Font License (свободна), коммерческие шрифты требуют соглашения о лицензировании.",{"type":32,"tag":33,"props":2376,"children":2377},{},[2378],{"type":37,"value":2379},"Эти четыре оптимизации снизили LCP на 80%. Nuxt 3 с Vue 3 reactivity идеален для lazy hydration. Cloudflare Pages edge network достаточна как CDN, для динамического контента KV + Workers дают granular cache control. Production требует RUM + Lighthouse CI для regression prevention.",{"type":32,"tag":2381,"props":2382,"children":2383},"style",{},[2384],{"type":37,"value":2385},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":16,"searchDepth":208,"depth":208,"links":2387},[2388,2389,2392,2393,2396,2397],{"id":51,"depth":189,"text":54},{"id":369,"depth":189,"text":372,"children":2390},[2391],{"id":853,"depth":208,"text":856},{"id":970,"depth":189,"text":973},{"id":1335,"depth":189,"text":1338,"children":2394},[2395],{"id":1418,"depth":208,"text":1421},{"id":1709,"depth":189,"text":1712},{"id":2324,"depth":189,"text":2327},"markdown","content:ru:tech:nuxt-3-cloudflare-pages-lcp-optimizacija.md","content","ru\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimizacija.md","ru\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimizacija","md",1782079494936]