[{"data":1,"prerenderedAt":1553},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fit\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-ottimizzazione":13},{"i18nKey":4,"paths":5},"tech-001-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimierung","\u002Fen\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimization","\u002Fes\u002Ftech\u002Fnuxt3-cloudflare-pages-lcp-optimizacion","\u002Ffr\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimisation","\u002Fit\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-ottimizzazione","\u002Fru\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimization","\u002Ftr\u002Ftech\u002Fnuxt-3-cloudflare-pages-10s-lcpden-2sye",{"_path":10,"_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":1547,"_id":1548,"_source":1549,"_file":1550,"_stem":1551,"_extension":1552},"tech",false,"","Nuxt 3 + Cloudflare Pages: da 10s a 2s LCP","Font self-hosted, lazy hydration, content-visibility e edge caching: abbiamo ridotto l'LCP dell'80%. Benchmark reali, codice e trade-off.","2026-05-07",[21,22,23,24,25],"nuxt3","cloudflare-pages","web-performance","lcp","edge-caching",9,"Roibase",{"type":29,"children":30,"toc":1536},"root",[31,39,46,51,97,102,108,146,549,566,578,599,707,720,806,829,835,864,1008,1021,1036,1042,1055,1217,1230,1246,1252,1257,1387,1403,1409,1434,1444,1461,1471,1477,1482,1526,1531],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","Dopo l'aggiornamento Core Web Vitals di Google, l'LCP (Largest Contentful Paint) deve stare sotto i 2,5 secondi — altrimenti il ranking organico e il tasso di conversione crollano. Un sito e-commerce che abbiamo migrato allo stack Nuxt 3 + Cloudflare Pages ha registrato un LCP di 10,2 secondi al primo deploy. Combinando una strategia di font self-hosted, selective hydration, CSS content-visibility e edge caching, lo abbiamo portato a 2,1 secondi. Qui sotto puoi trovare il dettaglio di ogni ottimizzazione, i trade-off reali e il codice.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"diagnosticare-il-problema-anatomia-di-un-lcp-a-10s",[44],{"type":37,"value":45},"Diagnosticare il problema: anatomia di un LCP a 10s",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"Nel primo report CrUX il mediano LCP era 10,2s, TBT (Total Blocking Time) 2190ms. L'analisi del profilo Lighthouse in Chrome DevTools ha rivelato:",{"type":32,"tag":52,"props":53,"children":54},"ul",{},[55,67,77,87],{"type":32,"tag":56,"props":57,"children":58},"li",{},[59,65],{"type":32,"tag":60,"props":61,"children":62},"strong",{},[63],{"type":37,"value":64},"Caricamento font:",{"type":37,"value":66}," tre famiglie da Google Fonts CDN, render-blocking",{"type":32,"tag":56,"props":68,"children":69},{},[70,75],{"type":32,"tag":60,"props":71,"children":72},{},[73],{"type":37,"value":74},"Hydration JavaScript:",{"type":37,"value":76}," bundle da 420kB, tutta la pagina viene hydrata",{"type":32,"tag":56,"props":78,"children":79},{},[80,85],{"type":32,"tag":60,"props":81,"children":82},{},[83],{"type":37,"value":84},"Immagine above-the-fold:",{"type":37,"value":86}," JPEG da 1,2MB senza lazy load",{"type":32,"tag":56,"props":88,"children":89},{},[90,95],{"type":32,"tag":60,"props":91,"children":92},{},[93],{"type":37,"value":94},"Cache Cloudflare:",{"type":37,"value":96}," le risposte SSR non erano cachate, ogni request raggiungeva l'origin",{"type":32,"tag":33,"props":98,"children":99},{},[100],{"type":37,"value":101},"Misurazione baseline: PageSpeed Insights mobile score 34\u002F100. Desktop 62\u002F100. Questi numeri arrivano dalla migrazione da Shopify Liquid a Nuxt 3 — il cambio di framework da solo non garantisce guadagni di performance; serve ottimizzazione architetturale.",{"type":32,"tag":40,"props":103,"children":105},{"id":104},"font-self-hosted-strategia-preload",[106],{"type":37,"value":107},"Font self-hosted + strategia preload",{"type":32,"tag":33,"props":109,"children":110},{},[111,113,120,122,128,130,136,138,144],{"type":37,"value":112},"Abbiamo scaricato gli stessi file font da Google Fonts nella cartella ",{"type":32,"tag":114,"props":115,"children":117},"code",{"className":116},[],[118],{"type":37,"value":119},"public\u002Ffonts\u002F",{"type":37,"value":121}," e spostato la definizione ",{"type":32,"tag":114,"props":123,"children":125},{"className":124},[],[126],{"type":37,"value":127},"@font-face",{"type":37,"value":129}," in ",{"type":32,"tag":114,"props":131,"children":133},{"className":132},[],[134],{"type":37,"value":135},"app.vue",{"type":37,"value":137},". Il dettaglio critico: usiamo ",{"type":32,"tag":114,"props":139,"children":141},{"className":140},[],[142],{"type":37,"value":143},"\u003Clink rel=\"preload\">",{"type":37,"value":145}," per richiedere i file font direttamente nella risposta HTML iniziale, prima del parse CSS.",{"type":32,"tag":147,"props":148,"children":152},"pre",{"className":149,"code":150,"language":151,"meta":16,"style":16},"language-vue shiki shiki-themes github-dark","\u003C!-- app.vue -->\n\u003Cscript setup>\nuseHead({\n  link: [\n    {\n      rel: 'preload',\n      href: '\u002Ffonts\u002Finter-var.woff2',\n      as: 'font',\n      type: 'font\u002Fwoff2',\n      crossorigin: 'anonymous'\n    }\n  ]\n})\n\u003C\u002Fscript>\n\n\u003Cstyle>\n@font-face {\n  font-family: 'Inter';\n  src: url('\u002Ffonts\u002Finter-var.woff2') format('woff2');\n  font-display: swap;\n  font-weight: 100 900;\n}\n\u003C\u002Fstyle>\n","vue",[153],{"type":32,"tag":114,"props":154,"children":155},{"__ignoreMap":16},[156,168,195,209,218,227,247,265,283,300,314,323,332,341,358,368,385,399,424,475,497,524,533],{"type":32,"tag":157,"props":158,"children":161},"span",{"class":159,"line":160},"line",1,[162],{"type":32,"tag":157,"props":163,"children":165},{"style":164},"--shiki-default:#6A737D",[166],{"type":37,"value":167},"\u003C!-- app.vue -->\n",{"type":32,"tag":157,"props":169,"children":171},{"class":159,"line":170},2,[172,178,184,190],{"type":32,"tag":157,"props":173,"children":175},{"style":174},"--shiki-default:#E1E4E8",[176],{"type":37,"value":177},"\u003C",{"type":32,"tag":157,"props":179,"children":181},{"style":180},"--shiki-default:#85E89D",[182],{"type":37,"value":183},"script",{"type":32,"tag":157,"props":185,"children":187},{"style":186},"--shiki-default:#B392F0",[188],{"type":37,"value":189}," setup",{"type":32,"tag":157,"props":191,"children":192},{"style":174},[193],{"type":37,"value":194},">\n",{"type":32,"tag":157,"props":196,"children":198},{"class":159,"line":197},3,[199,204],{"type":32,"tag":157,"props":200,"children":201},{"style":186},[202],{"type":37,"value":203},"useHead",{"type":32,"tag":157,"props":205,"children":206},{"style":174},[207],{"type":37,"value":208},"({\n",{"type":32,"tag":157,"props":210,"children":212},{"class":159,"line":211},4,[213],{"type":32,"tag":157,"props":214,"children":215},{"style":174},[216],{"type":37,"value":217},"  link: [\n",{"type":32,"tag":157,"props":219,"children":221},{"class":159,"line":220},5,[222],{"type":32,"tag":157,"props":223,"children":224},{"style":174},[225],{"type":37,"value":226},"    {\n",{"type":32,"tag":157,"props":228,"children":230},{"class":159,"line":229},6,[231,236,242],{"type":32,"tag":157,"props":232,"children":233},{"style":174},[234],{"type":37,"value":235},"      rel: ",{"type":32,"tag":157,"props":237,"children":239},{"style":238},"--shiki-default:#9ECBFF",[240],{"type":37,"value":241},"'preload'",{"type":32,"tag":157,"props":243,"children":244},{"style":174},[245],{"type":37,"value":246},",\n",{"type":32,"tag":157,"props":248,"children":250},{"class":159,"line":249},7,[251,256,261],{"type":32,"tag":157,"props":252,"children":253},{"style":174},[254],{"type":37,"value":255},"      href: ",{"type":32,"tag":157,"props":257,"children":258},{"style":238},[259],{"type":37,"value":260},"'\u002Ffonts\u002Finter-var.woff2'",{"type":32,"tag":157,"props":262,"children":263},{"style":174},[264],{"type":37,"value":246},{"type":32,"tag":157,"props":266,"children":268},{"class":159,"line":267},8,[269,274,279],{"type":32,"tag":157,"props":270,"children":271},{"style":174},[272],{"type":37,"value":273},"      as: ",{"type":32,"tag":157,"props":275,"children":276},{"style":238},[277],{"type":37,"value":278},"'font'",{"type":32,"tag":157,"props":280,"children":281},{"style":174},[282],{"type":37,"value":246},{"type":32,"tag":157,"props":284,"children":285},{"class":159,"line":26},[286,291,296],{"type":32,"tag":157,"props":287,"children":288},{"style":174},[289],{"type":37,"value":290},"      type: ",{"type":32,"tag":157,"props":292,"children":293},{"style":238},[294],{"type":37,"value":295},"'font\u002Fwoff2'",{"type":32,"tag":157,"props":297,"children":298},{"style":174},[299],{"type":37,"value":246},{"type":32,"tag":157,"props":301,"children":303},{"class":159,"line":302},10,[304,309],{"type":32,"tag":157,"props":305,"children":306},{"style":174},[307],{"type":37,"value":308},"      crossorigin: ",{"type":32,"tag":157,"props":310,"children":311},{"style":238},[312],{"type":37,"value":313},"'anonymous'\n",{"type":32,"tag":157,"props":315,"children":317},{"class":159,"line":316},11,[318],{"type":32,"tag":157,"props":319,"children":320},{"style":174},[321],{"type":37,"value":322},"    }\n",{"type":32,"tag":157,"props":324,"children":326},{"class":159,"line":325},12,[327],{"type":32,"tag":157,"props":328,"children":329},{"style":174},[330],{"type":37,"value":331},"  ]\n",{"type":32,"tag":157,"props":333,"children":335},{"class":159,"line":334},13,[336],{"type":32,"tag":157,"props":337,"children":338},{"style":174},[339],{"type":37,"value":340},"})\n",{"type":32,"tag":157,"props":342,"children":344},{"class":159,"line":343},14,[345,350,354],{"type":32,"tag":157,"props":346,"children":347},{"style":174},[348],{"type":37,"value":349},"\u003C\u002F",{"type":32,"tag":157,"props":351,"children":352},{"style":180},[353],{"type":37,"value":183},{"type":32,"tag":157,"props":355,"children":356},{"style":174},[357],{"type":37,"value":194},{"type":32,"tag":157,"props":359,"children":361},{"class":159,"line":360},15,[362],{"type":32,"tag":157,"props":363,"children":365},{"emptyLinePlaceholder":364},true,[366],{"type":37,"value":367},"\n",{"type":32,"tag":157,"props":369,"children":371},{"class":159,"line":370},16,[372,376,381],{"type":32,"tag":157,"props":373,"children":374},{"style":174},[375],{"type":37,"value":177},{"type":32,"tag":157,"props":377,"children":378},{"style":180},[379],{"type":37,"value":380},"style",{"type":32,"tag":157,"props":382,"children":383},{"style":174},[384],{"type":37,"value":194},{"type":32,"tag":157,"props":386,"children":388},{"class":159,"line":387},17,[389,394],{"type":32,"tag":157,"props":390,"children":392},{"style":391},"--shiki-default:#F97583",[393],{"type":37,"value":127},{"type":32,"tag":157,"props":395,"children":396},{"style":174},[397],{"type":37,"value":398}," {\n",{"type":32,"tag":157,"props":400,"children":402},{"class":159,"line":401},18,[403,409,414,419],{"type":32,"tag":157,"props":404,"children":406},{"style":405},"--shiki-default:#79B8FF",[407],{"type":37,"value":408},"  font-family",{"type":32,"tag":157,"props":410,"children":411},{"style":174},[412],{"type":37,"value":413},": ",{"type":32,"tag":157,"props":415,"children":416},{"style":238},[417],{"type":37,"value":418},"'Inter'",{"type":32,"tag":157,"props":420,"children":421},{"style":174},[422],{"type":37,"value":423},";\n",{"type":32,"tag":157,"props":425,"children":427},{"class":159,"line":426},19,[428,433,437,442,447,451,456,461,465,470],{"type":32,"tag":157,"props":429,"children":430},{"style":405},[431],{"type":37,"value":432},"  src",{"type":32,"tag":157,"props":434,"children":435},{"style":174},[436],{"type":37,"value":413},{"type":32,"tag":157,"props":438,"children":439},{"style":405},[440],{"type":37,"value":441},"url",{"type":32,"tag":157,"props":443,"children":444},{"style":174},[445],{"type":37,"value":446},"(",{"type":32,"tag":157,"props":448,"children":449},{"style":238},[450],{"type":37,"value":260},{"type":32,"tag":157,"props":452,"children":453},{"style":174},[454],{"type":37,"value":455},") ",{"type":32,"tag":157,"props":457,"children":458},{"style":405},[459],{"type":37,"value":460},"format",{"type":32,"tag":157,"props":462,"children":463},{"style":174},[464],{"type":37,"value":446},{"type":32,"tag":157,"props":466,"children":467},{"style":238},[468],{"type":37,"value":469},"'woff2'",{"type":32,"tag":157,"props":471,"children":472},{"style":174},[473],{"type":37,"value":474},");\n",{"type":32,"tag":157,"props":476,"children":478},{"class":159,"line":477},20,[479,484,488,493],{"type":32,"tag":157,"props":480,"children":481},{"style":405},[482],{"type":37,"value":483},"  font-display",{"type":32,"tag":157,"props":485,"children":486},{"style":174},[487],{"type":37,"value":413},{"type":32,"tag":157,"props":489,"children":490},{"style":405},[491],{"type":37,"value":492},"swap",{"type":32,"tag":157,"props":494,"children":495},{"style":174},[496],{"type":37,"value":423},{"type":32,"tag":157,"props":498,"children":500},{"class":159,"line":499},21,[501,506,510,515,520],{"type":32,"tag":157,"props":502,"children":503},{"style":405},[504],{"type":37,"value":505},"  font-weight",{"type":32,"tag":157,"props":507,"children":508},{"style":174},[509],{"type":37,"value":413},{"type":32,"tag":157,"props":511,"children":512},{"style":405},[513],{"type":37,"value":514},"100",{"type":32,"tag":157,"props":516,"children":517},{"style":405},[518],{"type":37,"value":519}," 900",{"type":32,"tag":157,"props":521,"children":522},{"style":174},[523],{"type":37,"value":423},{"type":32,"tag":157,"props":525,"children":527},{"class":159,"line":526},22,[528],{"type":32,"tag":157,"props":529,"children":530},{"style":174},[531],{"type":37,"value":532},"}\n",{"type":32,"tag":157,"props":534,"children":536},{"class":159,"line":535},23,[537,541,545],{"type":32,"tag":157,"props":538,"children":539},{"style":174},[540],{"type":37,"value":349},{"type":32,"tag":157,"props":542,"children":543},{"style":180},[544],{"type":37,"value":380},{"type":32,"tag":157,"props":546,"children":547},{"style":174},[548],{"type":37,"value":194},{"type":32,"tag":33,"props":550,"children":551},{},[552,557,559,564],{"type":32,"tag":60,"props":553,"children":554},{},[555],{"type":37,"value":556},"Guadagno:",{"type":37,"value":558}," LCP 10,2s → 7,8s (riduzione di 2,4s). Il caricamento font esce dalla categoria render-blocking, FOIT (Flash of Invisible Text) passa da 1200ms a 180ms. ",{"type":32,"tag":60,"props":560,"children":561},{},[562],{"type":37,"value":563},"Trade-off:",{"type":37,"value":565}," i file font vivono ora nel nostro CDN, la versionatura diventa manuale (noi l'abbiamo risolta con bucket Cloudflare R2 + header Cache-Control).",{"type":32,"tag":40,"props":567,"children":569},{"id":568},"lazy-hydration-selettiva-content-visibility",[570,572],{"type":37,"value":571},"Lazy hydration selettiva + ",{"type":32,"tag":114,"props":573,"children":575},{"className":574},[],[576],{"type":37,"value":577},"content-visibility",{"type":32,"tag":33,"props":579,"children":580},{},[581,583,589,591,597],{"type":37,"value":582},"Il comportamento di default di Nuxt 3 è idratare ogni component. Ma i component che non stanno above-the-fold (footer, sezione commenti, prodotti correlati) non hanno bisogno di essere idratati prima che l'utente scrolli. Con il modulo ",{"type":32,"tag":114,"props":584,"children":586},{"className":585},[],[587],{"type":37,"value":588},"@nuxt\u002Flazy-hydration",{"type":37,"value":590}," abbiamo wrappato questi component in ",{"type":32,"tag":114,"props":592,"children":594},{"className":593},[],[595],{"type":37,"value":596},"LazyHydrate",{"type":37,"value":598},".",{"type":32,"tag":147,"props":600,"children":602},{"className":149,"code":601,"language":151,"meta":16,"style":16},"\u003Ctemplate>\n  \u003CLazyHydrate when-visible>\n    \u003CProductRecommendations :product-id=\"productId\" \u002F>\n  \u003C\u002FLazyHydrate>\n\u003C\u002Ftemplate>\n",[603],{"type":32,"tag":114,"props":604,"children":605},{"__ignoreMap":16},[606,622,643,676,692],{"type":32,"tag":157,"props":607,"children":608},{"class":159,"line":160},[609,613,618],{"type":32,"tag":157,"props":610,"children":611},{"style":174},[612],{"type":37,"value":177},{"type":32,"tag":157,"props":614,"children":615},{"style":180},[616],{"type":37,"value":617},"template",{"type":32,"tag":157,"props":619,"children":620},{"style":174},[621],{"type":37,"value":194},{"type":32,"tag":157,"props":623,"children":624},{"class":159,"line":170},[625,630,634,639],{"type":32,"tag":157,"props":626,"children":627},{"style":174},[628],{"type":37,"value":629},"  \u003C",{"type":32,"tag":157,"props":631,"children":632},{"style":180},[633],{"type":37,"value":596},{"type":32,"tag":157,"props":635,"children":636},{"style":186},[637],{"type":37,"value":638}," when-visible",{"type":32,"tag":157,"props":640,"children":641},{"style":174},[642],{"type":37,"value":194},{"type":32,"tag":157,"props":644,"children":645},{"class":159,"line":197},[646,651,656,661,666,671],{"type":32,"tag":157,"props":647,"children":648},{"style":174},[649],{"type":37,"value":650},"    \u003C",{"type":32,"tag":157,"props":652,"children":653},{"style":180},[654],{"type":37,"value":655},"ProductRecommendations",{"type":32,"tag":157,"props":657,"children":658},{"style":186},[659],{"type":37,"value":660}," :product-id",{"type":32,"tag":157,"props":662,"children":663},{"style":174},[664],{"type":37,"value":665},"=",{"type":32,"tag":157,"props":667,"children":668},{"style":238},[669],{"type":37,"value":670},"\"productId\"",{"type":32,"tag":157,"props":672,"children":673},{"style":174},[674],{"type":37,"value":675}," \u002F>\n",{"type":32,"tag":157,"props":677,"children":678},{"class":159,"line":211},[679,684,688],{"type":32,"tag":157,"props":680,"children":681},{"style":174},[682],{"type":37,"value":683},"  \u003C\u002F",{"type":32,"tag":157,"props":685,"children":686},{"style":180},[687],{"type":37,"value":596},{"type":32,"tag":157,"props":689,"children":690},{"style":174},[691],{"type":37,"value":194},{"type":32,"tag":157,"props":693,"children":694},{"class":159,"line":220},[695,699,703],{"type":32,"tag":157,"props":696,"children":697},{"style":174},[698],{"type":37,"value":349},{"type":32,"tag":157,"props":700,"children":701},{"style":180},[702],{"type":37,"value":617},{"type":32,"tag":157,"props":704,"children":705},{"style":174},[706],{"type":37,"value":194},{"type":32,"tag":33,"props":708,"children":709},{},[710,712,718],{"type":37,"value":711},"Dal lato CSS, ",{"type":32,"tag":114,"props":713,"children":715},{"className":714},[],[716],{"type":37,"value":717},"content-visibility: auto",{"type":37,"value":719}," comunica al browser: \"non fare calcoli di rendering per questo elemento se non è nel viewport\".",{"type":32,"tag":147,"props":721,"children":725},{"className":722,"code":723,"language":724,"meta":16,"style":16},"language-css shiki shiki-themes github-dark",".product-recommendations {\n  content-visibility: auto;\n  contain-intrinsic-size: 0 500px; \u002F* placeholder height *\u002F\n}\n","css",[726],{"type":32,"tag":114,"props":727,"children":728},{"__ignoreMap":16},[729,741,762,799],{"type":32,"tag":157,"props":730,"children":731},{"class":159,"line":160},[732,737],{"type":32,"tag":157,"props":733,"children":734},{"style":186},[735],{"type":37,"value":736},".product-recommendations",{"type":32,"tag":157,"props":738,"children":739},{"style":174},[740],{"type":37,"value":398},{"type":32,"tag":157,"props":742,"children":743},{"class":159,"line":170},[744,749,753,758],{"type":32,"tag":157,"props":745,"children":746},{"style":405},[747],{"type":37,"value":748},"  content-visibility",{"type":32,"tag":157,"props":750,"children":751},{"style":174},[752],{"type":37,"value":413},{"type":32,"tag":157,"props":754,"children":755},{"style":405},[756],{"type":37,"value":757},"auto",{"type":32,"tag":157,"props":759,"children":760},{"style":174},[761],{"type":37,"value":423},{"type":32,"tag":157,"props":763,"children":764},{"class":159,"line":197},[765,770,774,779,784,789,794],{"type":32,"tag":157,"props":766,"children":767},{"style":405},[768],{"type":37,"value":769},"  contain-intrinsic-size",{"type":32,"tag":157,"props":771,"children":772},{"style":174},[773],{"type":37,"value":413},{"type":32,"tag":157,"props":775,"children":776},{"style":405},[777],{"type":37,"value":778},"0",{"type":32,"tag":157,"props":780,"children":781},{"style":405},[782],{"type":37,"value":783}," 500",{"type":32,"tag":157,"props":785,"children":786},{"style":391},[787],{"type":37,"value":788},"px",{"type":32,"tag":157,"props":790,"children":791},{"style":174},[792],{"type":37,"value":793},"; ",{"type":32,"tag":157,"props":795,"children":796},{"style":164},[797],{"type":37,"value":798},"\u002F* placeholder height *\u002F\n",{"type":32,"tag":157,"props":800,"children":801},{"class":159,"line":211},[802],{"type":32,"tag":157,"props":803,"children":804},{"style":174},[805],{"type":37,"value":532},{"type":32,"tag":33,"props":807,"children":808},{},[809,813,815,819,821,827],{"type":32,"tag":60,"props":810,"children":811},{},[812],{"type":37,"value":556},{"type":37,"value":814}," TBT 2190ms → 420ms, LCP 7,8s → 4,1s. Il bundle JS iniziale è sceso da 420kB a 180kB (brotli-compressed). ",{"type":32,"tag":60,"props":816,"children":817},{},[818],{"type":37,"value":563},{"type":37,"value":820}," ",{"type":32,"tag":114,"props":822,"children":824},{"className":823},[],[825],{"type":37,"value":826},"when-visible",{"type":37,"value":828}," si affida all'Intersection Observer API; il polyfill per browser vecchi (IE11) è necessario, anche se nel nostro caso (target browser moderni) non è stato un problema.",{"type":32,"tag":40,"props":830,"children":832},{"id":831},"edge-caching-approccio-ibrido-isr",[833],{"type":37,"value":834},"Edge caching + approccio ibrido ISR",{"type":32,"tag":33,"props":836,"children":837},{},[838,840,846,848,854,856,862],{"type":37,"value":839},"Cloudflare Pages per default cachea i file statici ma non gli endpoint SSR (tutto fuori da ",{"type":32,"tag":114,"props":841,"children":843},{"className":842},[],[844],{"type":37,"value":845},"\u002F_nuxt\u002F...",{"type":37,"value":847},"). In ",{"type":32,"tag":114,"props":849,"children":851},{"className":850},[],[852],{"type":37,"value":853},"nuxt.config.ts",{"type":37,"value":855}," abbiamo definito ",{"type":32,"tag":114,"props":857,"children":859},{"className":858},[],[860],{"type":37,"value":861},"routeRules",{"type":37,"value":863}," per specificare quali path cacheare e per quanto tempo:",{"type":32,"tag":147,"props":865,"children":869},{"className":866,"code":867,"language":868,"meta":16,"style":16},"language-ts shiki shiki-themes github-dark","\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  routeRules: {\n    '\u002F': { swr: 3600 }, \u002F\u002F homepage 1h stale-while-revalidate\n    '\u002Furun\u002F**': { swr: 1800 }, \u002F\u002F pagine prodotto 30m\n    '\u002Fkategori\u002F**': { static: true } \u002F\u002F pagine categoria static build-time\n  }\n})\n","ts",[870],{"type":32,"tag":114,"props":871,"children":872},{"__ignoreMap":16},[873,881,903,911,939,965,993,1001],{"type":32,"tag":157,"props":874,"children":875},{"class":159,"line":160},[876],{"type":32,"tag":157,"props":877,"children":878},{"style":164},[879],{"type":37,"value":880},"\u002F\u002F nuxt.config.ts\n",{"type":32,"tag":157,"props":882,"children":883},{"class":159,"line":170},[884,889,894,899],{"type":32,"tag":157,"props":885,"children":886},{"style":391},[887],{"type":37,"value":888},"export",{"type":32,"tag":157,"props":890,"children":891},{"style":391},[892],{"type":37,"value":893}," default",{"type":32,"tag":157,"props":895,"children":896},{"style":186},[897],{"type":37,"value":898}," defineNuxtConfig",{"type":32,"tag":157,"props":900,"children":901},{"style":174},[902],{"type":37,"value":208},{"type":32,"tag":157,"props":904,"children":905},{"class":159,"line":197},[906],{"type":32,"tag":157,"props":907,"children":908},{"style":174},[909],{"type":37,"value":910},"  routeRules: {\n",{"type":32,"tag":157,"props":912,"children":913},{"class":159,"line":211},[914,919,924,929,934],{"type":32,"tag":157,"props":915,"children":916},{"style":238},[917],{"type":37,"value":918},"    '\u002F'",{"type":32,"tag":157,"props":920,"children":921},{"style":174},[922],{"type":37,"value":923},": { swr: ",{"type":32,"tag":157,"props":925,"children":926},{"style":405},[927],{"type":37,"value":928},"3600",{"type":32,"tag":157,"props":930,"children":931},{"style":174},[932],{"type":37,"value":933}," }, ",{"type":32,"tag":157,"props":935,"children":936},{"style":164},[937],{"type":37,"value":938},"\u002F\u002F homepage 1h stale-while-revalidate\n",{"type":32,"tag":157,"props":940,"children":941},{"class":159,"line":220},[942,947,951,956,960],{"type":32,"tag":157,"props":943,"children":944},{"style":238},[945],{"type":37,"value":946},"    '\u002Furun\u002F**'",{"type":32,"tag":157,"props":948,"children":949},{"style":174},[950],{"type":37,"value":923},{"type":32,"tag":157,"props":952,"children":953},{"style":405},[954],{"type":37,"value":955},"1800",{"type":32,"tag":157,"props":957,"children":958},{"style":174},[959],{"type":37,"value":933},{"type":32,"tag":157,"props":961,"children":962},{"style":164},[963],{"type":37,"value":964},"\u002F\u002F pagine prodotto 30m\n",{"type":32,"tag":157,"props":966,"children":967},{"class":159,"line":229},[968,973,978,983,988],{"type":32,"tag":157,"props":969,"children":970},{"style":238},[971],{"type":37,"value":972},"    '\u002Fkategori\u002F**'",{"type":32,"tag":157,"props":974,"children":975},{"style":174},[976],{"type":37,"value":977},": { static: ",{"type":32,"tag":157,"props":979,"children":980},{"style":405},[981],{"type":37,"value":982},"true",{"type":32,"tag":157,"props":984,"children":985},{"style":174},[986],{"type":37,"value":987}," } ",{"type":32,"tag":157,"props":989,"children":990},{"style":164},[991],{"type":37,"value":992},"\u002F\u002F pagine categoria static build-time\n",{"type":32,"tag":157,"props":994,"children":995},{"class":159,"line":249},[996],{"type":32,"tag":157,"props":997,"children":998},{"style":174},[999],{"type":37,"value":1000},"  }\n",{"type":32,"tag":157,"props":1002,"children":1003},{"class":159,"line":267},[1004],{"type":32,"tag":157,"props":1005,"children":1006},{"style":174},[1007],{"type":37,"value":340},{"type":32,"tag":33,"props":1009,"children":1010},{},[1011,1013,1019],{"type":37,"value":1012},"La strategia ",{"type":32,"tag":114,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":37,"value":1018},"swr",{"type":37,"value":1020}," (stale-while-revalidate): la prima request fa SSR render, le request successive vengono dalla cache mentre il re-render accade in background. Abbiamo usato Cloudflare KV store con URL + user segment (logged-in\u002Fanonimo) come cache key.",{"type":32,"tag":33,"props":1022,"children":1023},{},[1024,1028,1030,1034],{"type":32,"tag":60,"props":1025,"children":1026},{},[1027],{"type":37,"value":556},{"type":37,"value":1029}," TTFB (Time to First Byte) 840ms → 120ms, LCP 4,1s → 2,3s. Cache hit rate prima settimana 78%. ",{"type":32,"tag":60,"props":1031,"children":1032},{},[1033],{"type":37,"value":563},{"type":37,"value":1035}," la personalizzazione dipende dalla cache key; dati user-specific (numero di articoli nel carrello) non possono essere cachati, li fetchiamo client-side.",{"type":32,"tag":40,"props":1037,"children":1039},{"id":1038},"ottimizzazione-immagine-above-the-fold",[1040],{"type":37,"value":1041},"Ottimizzazione immagine above-the-fold",{"type":32,"tag":33,"props":1043,"children":1044},{},[1045,1047,1053],{"type":37,"value":1046},"L'immagine hero è passata da JPEG 1,2MB a WebP 180kB; abbiamo aggiunto breakpoint responsivi con ",{"type":32,"tag":114,"props":1048,"children":1050},{"className":1049},[],[1051],{"type":37,"value":1052},"\u003Cpicture>",{"type":37,"value":1054},":",{"type":32,"tag":147,"props":1056,"children":1058},{"className":149,"code":1057,"language":151,"meta":16,"style":16},"\u003Cpicture>\n  \u003Csource\n    srcset=\"\u002Fimages\u002Fhero-mobile.webp\"\n    media=\"(max-width: 640px)\"\n    type=\"image\u002Fwebp\"\n  \u002F>\n  \u003Csource\n    srcset=\"\u002Fimages\u002Fhero-desktop.webp\"\n    media=\"(min-width: 641px)\"\n    type=\"image\u002Fwebp\"\n  \u002F>\n  \u003Cimg\n    src=\"\u002Fimages\u002Fhero-desktop.jpg\"\n    alt=\"Collezione nuova stagione\"\n    fetchpriority=\"high\"\n    decoding=\"async\"\n  \u002F>\n\u003C\u002Fpicture>\n",[1059],{"type":32,"tag":114,"props":1060,"children":1061},{"__ignoreMap":16},[1062,1078,1086,1094,1102,1110,1118,1125,1133,1141,1148,1155,1163,1171,1179,1187,1195,1202],{"type":32,"tag":157,"props":1063,"children":1064},{"class":159,"line":160},[1065,1069,1074],{"type":32,"tag":157,"props":1066,"children":1067},{"style":174},[1068],{"type":37,"value":177},{"type":32,"tag":157,"props":1070,"children":1071},{"style":180},[1072],{"type":37,"value":1073},"picture",{"type":32,"tag":157,"props":1075,"children":1076},{"style":174},[1077],{"type":37,"value":194},{"type":32,"tag":157,"props":1079,"children":1080},{"class":159,"line":170},[1081],{"type":32,"tag":157,"props":1082,"children":1083},{"style":174},[1084],{"type":37,"value":1085},"  \u003Csource\n",{"type":32,"tag":157,"props":1087,"children":1088},{"class":159,"line":197},[1089],{"type":32,"tag":157,"props":1090,"children":1091},{"style":174},[1092],{"type":37,"value":1093},"    srcset=\"\u002Fimages\u002Fhero-mobile.webp\"\n",{"type":32,"tag":157,"props":1095,"children":1096},{"class":159,"line":211},[1097],{"type":32,"tag":157,"props":1098,"children":1099},{"style":174},[1100],{"type":37,"value":1101},"    media=\"(max-width: 640px)\"\n",{"type":32,"tag":157,"props":1103,"children":1104},{"class":159,"line":220},[1105],{"type":32,"tag":157,"props":1106,"children":1107},{"style":174},[1108],{"type":37,"value":1109},"    type=\"image\u002Fwebp\"\n",{"type":32,"tag":157,"props":1111,"children":1112},{"class":159,"line":229},[1113],{"type":32,"tag":157,"props":1114,"children":1115},{"style":174},[1116],{"type":37,"value":1117},"  \u002F>\n",{"type":32,"tag":157,"props":1119,"children":1120},{"class":159,"line":249},[1121],{"type":32,"tag":157,"props":1122,"children":1123},{"style":174},[1124],{"type":37,"value":1085},{"type":32,"tag":157,"props":1126,"children":1127},{"class":159,"line":267},[1128],{"type":32,"tag":157,"props":1129,"children":1130},{"style":174},[1131],{"type":37,"value":1132},"    srcset=\"\u002Fimages\u002Fhero-desktop.webp\"\n",{"type":32,"tag":157,"props":1134,"children":1135},{"class":159,"line":26},[1136],{"type":32,"tag":157,"props":1137,"children":1138},{"style":174},[1139],{"type":37,"value":1140},"    media=\"(min-width: 641px)\"\n",{"type":32,"tag":157,"props":1142,"children":1143},{"class":159,"line":302},[1144],{"type":32,"tag":157,"props":1145,"children":1146},{"style":174},[1147],{"type":37,"value":1109},{"type":32,"tag":157,"props":1149,"children":1150},{"class":159,"line":316},[1151],{"type":32,"tag":157,"props":1152,"children":1153},{"style":174},[1154],{"type":37,"value":1117},{"type":32,"tag":157,"props":1156,"children":1157},{"class":159,"line":325},[1158],{"type":32,"tag":157,"props":1159,"children":1160},{"style":174},[1161],{"type":37,"value":1162},"  \u003Cimg\n",{"type":32,"tag":157,"props":1164,"children":1165},{"class":159,"line":334},[1166],{"type":32,"tag":157,"props":1167,"children":1168},{"style":174},[1169],{"type":37,"value":1170},"    src=\"\u002Fimages\u002Fhero-desktop.jpg\"\n",{"type":32,"tag":157,"props":1172,"children":1173},{"class":159,"line":343},[1174],{"type":32,"tag":157,"props":1175,"children":1176},{"style":174},[1177],{"type":37,"value":1178},"    alt=\"Collezione nuova stagione\"\n",{"type":32,"tag":157,"props":1180,"children":1181},{"class":159,"line":360},[1182],{"type":32,"tag":157,"props":1183,"children":1184},{"style":174},[1185],{"type":37,"value":1186},"    fetchpriority=\"high\"\n",{"type":32,"tag":157,"props":1188,"children":1189},{"class":159,"line":370},[1190],{"type":32,"tag":157,"props":1191,"children":1192},{"style":174},[1193],{"type":37,"value":1194},"    decoding=\"async\"\n",{"type":32,"tag":157,"props":1196,"children":1197},{"class":159,"line":387},[1198],{"type":32,"tag":157,"props":1199,"children":1200},{"style":174},[1201],{"type":37,"value":1117},{"type":32,"tag":157,"props":1203,"children":1204},{"class":159,"line":401},[1205,1209,1213],{"type":32,"tag":157,"props":1206,"children":1207},{"style":174},[1208],{"type":37,"value":349},{"type":32,"tag":157,"props":1210,"children":1211},{"style":180},[1212],{"type":37,"value":1073},{"type":32,"tag":157,"props":1214,"children":1215},{"style":174},[1216],{"type":37,"value":194},{"type":32,"tag":33,"props":1218,"children":1219},{},[1220,1222,1228],{"type":37,"value":1221},"L'attributo ",{"type":32,"tag":114,"props":1223,"children":1225},{"className":1224},[],[1226],{"type":37,"value":1227},"fetchpriority=\"high\"",{"type":37,"value":1229}," comunica al browser: \"carica questa immagine con priorità\". Cloudflare Image Resizing gestisce la conversione formato agli edge (serve JPEG ai browser che non supportano WebP).",{"type":32,"tag":33,"props":1231,"children":1232},{},[1233,1237,1239,1245],{"type":32,"tag":60,"props":1234,"children":1235},{},[1236],{"type":37,"value":556},{"type":37,"value":1238}," LCP 2,3s → 2,1s, tempo caricamento immagine 1200ms → 320ms. CLS (Cumulative Layout Shift) 0,12 → 0,02 — abbiamo reservato lo spazio con la proprietà CSS ",{"type":32,"tag":114,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":37,"value":1244},"aspect-ratio",{"type":37,"value":598},{"type":32,"tag":40,"props":1247,"children":1249},{"id":1248},"risultati-del-benchmark-impatto-su-utenti-reali",[1250],{"type":37,"value":1251},"Risultati del benchmark + impatto su utenti reali",{"type":32,"tag":33,"props":1253,"children":1254},{},[1255],{"type":37,"value":1256},"PageSpeed Insights mobile score 34 → 92, desktop 62 → 98. Media CrUX a 28 giorni:",{"type":32,"tag":1258,"props":1259,"children":1260},"table",{},[1261,1290],{"type":32,"tag":1262,"props":1263,"children":1264},"thead",{},[1265],{"type":32,"tag":1266,"props":1267,"children":1268},"tr",{},[1269,1275,1280,1285],{"type":32,"tag":1270,"props":1271,"children":1272},"th",{},[1273],{"type":37,"value":1274},"Metrica",{"type":32,"tag":1270,"props":1276,"children":1277},{},[1278],{"type":37,"value":1279},"Prima",{"type":32,"tag":1270,"props":1281,"children":1282},{},[1283],{"type":37,"value":1284},"Dopo",{"type":32,"tag":1270,"props":1286,"children":1287},{},[1288],{"type":37,"value":1289},"Variazione",{"type":32,"tag":1291,"props":1292,"children":1293},"tbody",{},[1294,1318,1341,1364],{"type":32,"tag":1266,"props":1295,"children":1296},{},[1297,1303,1308,1313],{"type":32,"tag":1298,"props":1299,"children":1300},"td",{},[1301],{"type":37,"value":1302},"LCP",{"type":32,"tag":1298,"props":1304,"children":1305},{},[1306],{"type":37,"value":1307},"10,2s",{"type":32,"tag":1298,"props":1309,"children":1310},{},[1311],{"type":37,"value":1312},"2,1s",{"type":32,"tag":1298,"props":1314,"children":1315},{},[1316],{"type":37,"value":1317},"-79%",{"type":32,"tag":1266,"props":1319,"children":1320},{},[1321,1326,1331,1336],{"type":32,"tag":1298,"props":1322,"children":1323},{},[1324],{"type":37,"value":1325},"TBT",{"type":32,"tag":1298,"props":1327,"children":1328},{},[1329],{"type":37,"value":1330},"2190ms",{"type":32,"tag":1298,"props":1332,"children":1333},{},[1334],{"type":37,"value":1335},"420ms",{"type":32,"tag":1298,"props":1337,"children":1338},{},[1339],{"type":37,"value":1340},"-81%",{"type":32,"tag":1266,"props":1342,"children":1343},{},[1344,1349,1354,1359],{"type":32,"tag":1298,"props":1345,"children":1346},{},[1347],{"type":37,"value":1348},"CLS",{"type":32,"tag":1298,"props":1350,"children":1351},{},[1352],{"type":37,"value":1353},"0,12",{"type":32,"tag":1298,"props":1355,"children":1356},{},[1357],{"type":37,"value":1358},"0,02",{"type":32,"tag":1298,"props":1360,"children":1361},{},[1362],{"type":37,"value":1363},"-83%",{"type":32,"tag":1266,"props":1365,"children":1366},{},[1367,1372,1377,1382],{"type":32,"tag":1298,"props":1368,"children":1369},{},[1370],{"type":37,"value":1371},"TTFB",{"type":32,"tag":1298,"props":1373,"children":1374},{},[1375],{"type":37,"value":1376},"840ms",{"type":32,"tag":1298,"props":1378,"children":1379},{},[1380],{"type":37,"value":1381},"120ms",{"type":32,"tag":1298,"props":1383,"children":1384},{},[1385],{"type":37,"value":1386},"-86%",{"type":32,"tag":33,"props":1388,"children":1389},{},[1390,1392,1401],{"type":37,"value":1391},"Funnel conversione Google Analytics: tasso di inizio checkout sale da 3,2% a 4,8% (+50% relativo). Bounce rate 68% → 52%. Search Console: traffico organico aumenta del 34% in 2 mesi (altre variabili SEO costanti). Questi numeri rispecchiano gli obiettivi standard di Roibase nell'approccio ",{"type":32,"tag":1393,"props":1394,"children":1398},"a",{"href":1395,"rel":1396},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Fheadless",[1397],"nofollow",[1399],{"type":37,"value":1400},"Headless Commerce",{"type":37,"value":1402}," — se la performance non si converte in metriche di business, il cambio architetturale non è considerato vincente.",{"type":32,"tag":40,"props":1404,"children":1406},{"id":1405},"trade-off-e-criteri-decisionali",[1407],{"type":37,"value":1408},"Trade-off e criteri decisionali",{"type":32,"tag":33,"props":1410,"children":1411},{},[1412,1417,1419,1424,1426,1432],{"type":32,"tag":60,"props":1413,"children":1414},{},[1415],{"type":37,"value":1416},"Developer experience:",{"type":37,"value":1418}," aggiungere il wrapper lazy hydration espande la surface area dell'API dei component; i nuovi developer devono imparare la differenza tra ",{"type":32,"tag":114,"props":1420,"children":1422},{"className":1421},[],[1423],{"type":37,"value":826},{"type":37,"value":1425}," e ",{"type":32,"tag":114,"props":1427,"children":1429},{"className":1428},[],[1430],{"type":37,"value":1431},"when-idle",{"type":37,"value":1433},". L'abbiamo gestito con documentazione Storybook + ESLint rule.",{"type":32,"tag":33,"props":1435,"children":1436},{},[1437,1442],{"type":32,"tag":60,"props":1438,"children":1439},{},[1440],{"type":37,"value":1441},"Bundle size vs cost runtime:",{"type":37,"value":1443}," i file font self-hosted aggiungono +60kB al bundle iniziale, ma eliminano il costo di DNS lookup + TLS handshake del CDN esterno. Su reti mobile 3G è un guadagno netto; su fibra è neutrale.",{"type":32,"tag":33,"props":1445,"children":1446},{},[1447,1452,1454,1459],{"type":32,"tag":60,"props":1448,"children":1449},{},[1450],{"type":37,"value":1451},"Invalidazione cache:",{"type":37,"value":1453}," la strategia ",{"type":32,"tag":114,"props":1455,"children":1457},{"className":1456},[],[1458],{"type":37,"value":1018},{"type":37,"value":1460}," comporta il rischio di dati stantii. Per dati critici come disponibilità di stock, usiamo fetch client-side realtime (polling ogni 30s invece di WebSocket per ridurre i costi di edge function).",{"type":32,"tag":33,"props":1462,"children":1463},{},[1464,1469],{"type":32,"tag":60,"props":1465,"children":1466},{},[1467],{"type":37,"value":1468},"Vendor lock-in Cloudflare:",{"type":37,"value":1470}," il caching basato su KV è specifico di Cloudflare; migrare ad altro provider richiederebbe re-implementation. Però Vercel e Netlify hanno primitive simili, l'effort di migrazione è accettabile.",{"type":32,"tag":40,"props":1472,"children":1474},{"id":1473},"prossimi-passi",[1475],{"type":37,"value":1476},"Prossimi passi",{"type":32,"tag":33,"props":1478,"children":1479},{},[1480],{"type":37,"value":1481},"2,1s di LCP è buono, ma il P75 (75° percentile) in CrUX è ancora 3,2s. La roadmap:",{"type":32,"tag":1483,"props":1484,"children":1485},"ol",{},[1486,1496,1506,1516],{"type":32,"tag":56,"props":1487,"children":1488},{},[1489,1494],{"type":32,"tag":60,"props":1490,"children":1491},{},[1492],{"type":37,"value":1493},"Image CDN + automatic format negotiation:",{"type":37,"value":1495}," passare a Imgix da Cloudflare Polish, supporto AVIF",{"type":32,"tag":56,"props":1497,"children":1498},{},[1499,1504],{"type":32,"tag":60,"props":1500,"children":1501},{},[1502],{"type":37,"value":1503},"Prefetch strategy:",{"type":37,"value":1505}," Intersection Observer per prefetch dati delle product card quando entrano nel viewport",{"type":32,"tag":56,"props":1507,"children":1508},{},[1509,1514],{"type":32,"tag":60,"props":1510,"children":1511},{},[1512],{"type":37,"value":1513},"Service Worker + offline-first:",{"type":37,"value":1515}," Workbox per cacheare asset critici, network-first fallback",{"type":32,"tag":56,"props":1517,"children":1518},{},[1519,1524],{"type":32,"tag":60,"props":1520,"children":1521},{},[1522],{"type":37,"value":1523},"Aggressive bundle splitting:",{"type":37,"value":1525}," code splitting di Nuxt 3 più aggressivo, chunking per route",{"type":32,"tag":33,"props":1527,"children":1528},{},[1529],{"type":37,"value":1530},"L'ottimizzazione performance è un gioco senza fine — ogni 100ms guadagnati porta 1-2% di lift in conversione. La combinazione Nuxt 3 + Cloudflare Pages offre l'equilibrio tra rendering agli edge + ergonomia di un framework JS moderno. Quando si decide lo stack, il target LCP deve essere un requirement di business; poi si valutano le scelte architetturali dentro questo vincolo.",{"type":32,"tag":380,"props":1532,"children":1533},{},[1534],{"type":37,"value":1535},"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":197,"depth":197,"links":1537},[1538,1539,1540,1542,1543,1544,1545,1546],{"id":42,"depth":170,"text":45},{"id":104,"depth":170,"text":107},{"id":568,"depth":170,"text":1541},"Lazy hydration selettiva + content-visibility",{"id":831,"depth":170,"text":834},{"id":1038,"depth":170,"text":1041},{"id":1248,"depth":170,"text":1251},{"id":1405,"depth":170,"text":1408},{"id":1473,"depth":170,"text":1476},"markdown","content:it:tech:nuxt-3-cloudflare-pages-lcp-ottimizzazione.md","content","it\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-ottimizzazione.md","it\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-ottimizzazione","md",1778164176537]