[{"data":1,"prerenderedAt":3822},["ShallowReactive",2],{"navigation_docs_ru":3,"-ru-guides-seo-checklist-nuxt":361,"-ru-guides-seo-checklist-nuxt-surround":3817},[4,23,49,83,93,115,343,353],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":22},"Начало работы","i-lucide-rocket","\u002Fru\u002Fgetting-started","ru\u002F1.getting-started",[10,14,18],{"title":11,"path":12,"stem":13},"Введение","\u002Fru\u002Fgetting-started\u002Fintroduction","ru\u002F1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Установка","\u002Fru\u002Fgetting-started\u002Finstallation","ru\u002F1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"ranklint init","\u002Fru\u002Fgetting-started\u002Finit","ru\u002F1.getting-started\u002F3.init",false,{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":22},"Nuxt-модуль","i-lucide-box","\u002Fru\u002Fmodule","ru\u002F2.module",[29,33,37,41,45],{"title":30,"path":31,"stem":32},"Обзор","\u002Fru\u002Fmodule\u002Foverview","ru\u002F2.module\u002F1.overview",{"title":34,"path":35,"stem":36},"Sitemap","\u002Fru\u002Fmodule\u002Fsitemap","ru\u002F2.module\u002F2.sitemap",{"title":38,"path":39,"stem":40},"Robots","\u002Fru\u002Fmodule\u002Frobots","ru\u002F2.module\u002F3.robots",{"title":42,"path":43,"stem":44},"Композаблы","\u002Fru\u002Fmodule\u002Fcomposables","ru\u002F2.module\u002F4.composables",{"title":46,"path":47,"stem":48},"DevTools","\u002Fru\u002Fmodule\u002Fdevtools","ru\u002F2.module\u002F5.devtools",{"title":50,"icon":51,"path":52,"stem":53,"children":54,"page":22},"CLI","i-lucide-terminal","\u002Fru\u002Fcli","ru\u002F3.cli",[55,59,63,67,71,75,79],{"title":56,"path":57,"stem":58},"ranklint audit","\u002Fru\u002Fcli\u002Faudit","ru\u002F3.cli\u002F1.audit",{"title":60,"path":61,"stem":62},"Diff и CI","\u002Fru\u002Fcli\u002Fdiff-and-ci","ru\u002F3.cli\u002F2.diff-and-ci",{"title":64,"path":65,"stem":66},"Мониторинг прода","\u002Fru\u002Fcli\u002Fmonitor","ru\u002F3.cli\u002F3.monitor",{"title":68,"path":69,"stem":70},"Lighthouse","\u002Fru\u002Fcli\u002Flighthouse","ru\u002F3.cli\u002F4.lighthouse",{"title":72,"path":73,"stem":74},"Зоны (multi-app домены)","\u002Fru\u002Fcli\u002Fzones","ru\u002F3.cli\u002F5.zones",{"title":76,"path":77,"stem":78},"Остальные команды","\u002Fru\u002Fcli\u002Fother-commands","ru\u002F3.cli\u002F6.other-commands",{"title":80,"path":81,"stem":82},"Watch mode","\u002Fru\u002Fcli\u002Fwatch","ru\u002F3.cli\u002F7.watch",{"title":84,"icon":85,"path":86,"stem":87,"children":88,"page":22},"Конфигурация","i-lucide-settings-2","\u002Fru\u002Fconfig","ru\u002F4.config",[89],{"title":90,"path":91,"stem":92},"Справочник","\u002Fru\u002Fconfig\u002Freference","ru\u002F4.config\u002F1.reference",{"title":94,"icon":95,"path":96,"stem":97,"children":98,"page":22},"Продвинутое","i-lucide-wrench","\u002Fru\u002Fadvanced","ru\u002F5.advanced",[99,103,107,111],{"title":100,"path":101,"stem":102},"Кастомные правила и пресеты","\u002Fru\u002Fadvanced\u002Fcustom-rules","ru\u002F5.advanced\u002F1.custom-rules",{"title":104,"path":105,"stem":106},"Умные эвристики","\u002Fru\u002Fadvanced\u002Fheuristics","ru\u002F5.advanced\u002F2.heuristics",{"title":108,"path":109,"stem":110},"Env-переменные","\u002Fru\u002Fadvanced\u002Fenv","ru\u002F5.advanced\u002F3.env",{"title":112,"path":113,"stem":114},"Нюансы и ограничения","\u002Fru\u002Fadvanced\u002Fnuances","ru\u002F5.advanced\u002F4.nuances",{"title":116,"icon":117,"path":118,"stem":119,"children":120},"Правила","i-lucide-list-checks","\u002Fru\u002Frules","ru\u002F6.rules\u002Findex",[121,123,148,173,190,207,228,257,306,330],{"title":122,"path":118,"stem":119},"Все правила",{"title":124,"path":125,"stem":126,"children":127,"page":22},"Headings","\u002Fru\u002Frules\u002Fheadings","ru\u002F6.rules\u002Fheadings",[128,132,136,140,144],{"title":129,"path":130,"stem":131},"headings:h1-length","\u002Fru\u002Frules\u002Fheadings\u002Fheadings-h1-length","ru\u002F6.rules\u002Fheadings\u002Fheadings-h1-length",{"title":133,"path":134,"stem":135},"headings:hierarchy","\u002Fru\u002Frules\u002Fheadings\u002Fheadings-hierarchy","ru\u002F6.rules\u002Fheadings\u002Fheadings-hierarchy",{"title":137,"path":138,"stem":139},"headings:no-empty","\u002Fru\u002Frules\u002Fheadings\u002Fheadings-no-empty","ru\u002F6.rules\u002Fheadings\u002Fheadings-no-empty",{"title":141,"path":142,"stem":143},"headings:single-h1","\u002Fru\u002Frules\u002Fheadings\u002Fheadings-single-h1","ru\u002F6.rules\u002Fheadings\u002Fheadings-single-h1",{"title":145,"path":146,"stem":147},"headings:unique-h1","\u002Fru\u002Frules\u002Fheadings\u002Fheadings-unique-h1","ru\u002F6.rules\u002Fheadings\u002Fheadings-unique-h1",{"title":149,"path":150,"stem":151,"children":152,"page":22},"Http","\u002Fru\u002Frules\u002Fhttp","ru\u002F6.rules\u002Fhttp",[153,157,161,165,169],{"title":154,"path":155,"stem":156},"http:no-mixed-content","\u002Fru\u002Frules\u002Fhttp\u002Fhttp-no-mixed-content","ru\u002F6.rules\u002Fhttp\u002Fhttp-no-mixed-content",{"title":158,"path":159,"stem":160},"http:no-soft-404","\u002Fru\u002Frules\u002Fhttp\u002Fhttp-no-soft-404","ru\u002F6.rules\u002Fhttp\u002Fhttp-no-soft-404",{"title":162,"path":163,"stem":164},"http:ttfb-budget","\u002Fru\u002Frules\u002Fhttp\u002Fhttp-ttfb-budget","ru\u002F6.rules\u002Fhttp\u002Fhttp-ttfb-budget",{"title":166,"path":167,"stem":168},"http:x-robots-consistent","\u002Fru\u002Frules\u002Fhttp\u002Fhttp-x-robots-consistent","ru\u002F6.rules\u002Fhttp\u002Fhttp-x-robots-consistent",{"title":170,"path":171,"stem":172},"mobile:viewport","\u002Fru\u002Frules\u002Fhttp\u002Fmobile-viewport","ru\u002F6.rules\u002Fhttp\u002Fmobile-viewport",{"title":174,"path":175,"stem":176,"children":177,"page":22},"I18n","\u002Fru\u002Frules\u002Fi18n","ru\u002F6.rules\u002Fi18n",[178,182,186],{"title":179,"path":180,"stem":181},"hreflang:symmetric","\u002Fru\u002Frules\u002Fi18n\u002Fhreflang-symmetric","ru\u002F6.rules\u002Fi18n\u002Fhreflang-symmetric",{"title":183,"path":184,"stem":185},"hreflang:valid-targets","\u002Fru\u002Frules\u002Fi18n\u002Fhreflang-valid-targets","ru\u002F6.rules\u002Fi18n\u002Fhreflang-valid-targets",{"title":187,"path":188,"stem":189},"i18n:no-locale-leak","\u002Fru\u002Frules\u002Fi18n\u002Fi18n-no-locale-leak","ru\u002F6.rules\u002Fi18n\u002Fi18n-no-locale-leak",{"title":191,"path":192,"stem":193,"children":194,"page":22},"Images","\u002Fru\u002Frules\u002Fimages","ru\u002F6.rules\u002Fimages",[195,199,203],{"title":196,"path":197,"stem":198},"images:alt-required","\u002Fru\u002Frules\u002Fimages\u002Fimages-alt-required","ru\u002F6.rules\u002Fimages\u002Fimages-alt-required",{"title":200,"path":201,"stem":202},"images:dimensions-required","\u002Fru\u002Frules\u002Fimages\u002Fimages-dimensions-required","ru\u002F6.rules\u002Fimages\u002Fimages-dimensions-required",{"title":204,"path":205,"stem":206},"images:no-lazy-above-fold","\u002Fru\u002Frules\u002Fimages\u002Fimages-no-lazy-above-fold","ru\u002F6.rules\u002Fimages\u002Fimages-no-lazy-above-fold",{"title":208,"path":209,"stem":210,"children":211,"page":22},"Indexability","\u002Fru\u002Frules\u002Findexability","ru\u002F6.rules\u002Findexability",[212,218,224],{"title":213,"path":214,"stem":215,"children":216},"indexability:ssr-content","\u002Fru\u002Frules\u002Findexability\u002Findexability-ssr-content","ru\u002F6.rules\u002Findexability\u002Findexability-ssr-content",[217],{"title":213,"path":214,"stem":215},{"title":219,"path":220,"stem":221,"children":222},"sitemap:no-noindex","\u002Fru\u002Frules\u002Findexability\u002Fsitemap-no-noindex","ru\u002F6.rules\u002Findexability\u002Fsitemap-no-noindex",[223],{"title":219,"path":220,"stem":221},{"title":225,"path":226,"stem":227},"sitemap:reachable","\u002Fru\u002Frules\u002Findexability\u002Fsitemap-reachable","ru\u002F6.rules\u002Findexability\u002Fsitemap-reachable",{"title":229,"path":230,"stem":231,"children":232,"page":22},"Links","\u002Fru\u002Frules\u002Flinks","ru\u002F6.rules\u002Flinks",[233,237,241,245,249,253],{"title":234,"path":235,"stem":236},"links:no-broken","\u002Fru\u002Frules\u002Flinks\u002Flinks-no-broken","ru\u002F6.rules\u002Flinks\u002Flinks-no-broken",{"title":238,"path":239,"stem":240},"links:no-orphans","\u002Fru\u002Frules\u002Flinks\u002Flinks-no-orphans","ru\u002F6.rules\u002Flinks\u002Flinks-no-orphans",{"title":242,"path":243,"stem":244},"links:no-redirect-chain","\u002Fru\u002Frules\u002Flinks\u002Flinks-no-redirect-chain","ru\u002F6.rules\u002Flinks\u002Flinks-no-redirect-chain",{"title":246,"path":247,"stem":248},"links:no-utm-internal","\u002Fru\u002Frules\u002Flinks\u002Flinks-no-utm-internal","ru\u002F6.rules\u002Flinks\u002Flinks-no-utm-internal",{"title":250,"path":251,"stem":252},"links:permanent-redirects","\u002Fru\u002Frules\u002Flinks\u002Flinks-permanent-redirects","ru\u002F6.rules\u002Flinks\u002Flinks-permanent-redirects",{"title":254,"path":255,"stem":256},"links:trailing-slash-consistent","\u002Fru\u002Frules\u002Flinks\u002Flinks-trailing-slash-consistent","ru\u002F6.rules\u002Flinks\u002Flinks-trailing-slash-consistent",{"title":258,"path":259,"stem":260,"children":261,"page":22},"Meta","\u002Fru\u002Frules\u002Fmeta","ru\u002F6.rules\u002Fmeta",[262,266,270,274,278,282,286,290,294,298,302],{"title":263,"path":264,"stem":265},"canonical:no-chain","\u002Fru\u002Frules\u002Fmeta\u002Fcanonical-no-chain","ru\u002F6.rules\u002Fmeta\u002Fcanonical-no-chain",{"title":267,"path":268,"stem":269},"canonical:required","\u002Fru\u002Frules\u002Fmeta\u002Fcanonical-required","ru\u002F6.rules\u002Fmeta\u002Fcanonical-required",{"title":271,"path":272,"stem":273},"canonical:valid","\u002Fru\u002Frules\u002Fmeta\u002Fcanonical-valid","ru\u002F6.rules\u002Fmeta\u002Fcanonical-valid",{"title":275,"path":276,"stem":277},"meta:description-length","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-description-length","ru\u002F6.rules\u002Fmeta\u002Fmeta-description-length",{"title":279,"path":280,"stem":281},"meta:description-required","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-description-required","ru\u002F6.rules\u002Fmeta\u002Fmeta-description-required",{"title":283,"path":284,"stem":285},"meta:no-duplicate-description","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-no-duplicate-description","ru\u002F6.rules\u002Fmeta\u002Fmeta-no-duplicate-description",{"title":287,"path":288,"stem":289},"meta:no-duplicate-title","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-no-duplicate-title","ru\u002F6.rules\u002Fmeta\u002Fmeta-no-duplicate-title",{"title":291,"path":292,"stem":293},"meta:og-required","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-og-required","ru\u002F6.rules\u002Fmeta\u002Fmeta-og-required",{"title":295,"path":296,"stem":297},"meta:title-length","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-title-length","ru\u002F6.rules\u002Fmeta\u002Fmeta-title-length",{"title":299,"path":300,"stem":301},"meta:title-required","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-title-required","ru\u002F6.rules\u002Fmeta\u002Fmeta-title-required",{"title":303,"path":304,"stem":305},"meta:twitter-card","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-twitter-card","ru\u002F6.rules\u002Fmeta\u002Fmeta-twitter-card",{"title":38,"path":307,"stem":308,"children":309,"page":22},"\u002Fru\u002Frules\u002Frobots","ru\u002F6.rules\u002Frobots",[310,314,318,322,326],{"title":311,"path":312,"stem":313},"robots:env-policy","\u002Fru\u002Frules\u002Frobots\u002Frobots-env-policy","ru\u002F6.rules\u002Frobots\u002Frobots-env-policy",{"title":315,"path":316,"stem":317},"robots:expected-disallow","\u002Fru\u002Frules\u002Frobots\u002Frobots-expected-disallow","ru\u002F6.rules\u002Frobots\u002Frobots-expected-disallow",{"title":319,"path":320,"stem":321},"robots:reachable","\u002Fru\u002Frules\u002Frobots\u002Frobots-reachable","ru\u002F6.rules\u002Frobots\u002Frobots-reachable",{"title":323,"path":324,"stem":325},"robots:sitemap-declared","\u002Fru\u002Frules\u002Frobots\u002Frobots-sitemap-declared","ru\u002F6.rules\u002Frobots\u002Frobots-sitemap-declared",{"title":327,"path":328,"stem":329},"robots:zone-not-blocked","\u002Fru\u002Frules\u002Frobots\u002Frobots-zone-not-blocked","ru\u002F6.rules\u002Frobots\u002Frobots-zone-not-blocked",{"title":331,"path":332,"stem":333,"children":334,"page":22},"Structured Data","\u002Fru\u002Frules\u002Fstructured-data","ru\u002F6.rules\u002Fstructured-data",[335,339],{"title":336,"path":337,"stem":338},"jsonld:parseable","\u002Fru\u002Frules\u002Fstructured-data\u002Fjsonld-parseable","ru\u002F6.rules\u002Fstructured-data\u002Fjsonld-parseable",{"title":340,"path":341,"stem":342},"jsonld:valid-schema","\u002Fru\u002Frules\u002Fstructured-data\u002Fjsonld-valid-schema","ru\u002F6.rules\u002Fstructured-data\u002Fjsonld-valid-schema",{"title":344,"icon":345,"path":346,"stem":347,"children":348,"page":22},"Гайды","i-lucide-book-open","\u002Fru\u002Fguides","ru\u002F7.guides",[349],{"title":350,"path":351,"stem":352},"SEO-чеклист для Nuxt-проекта","\u002Fru\u002Fguides\u002Fseo-checklist-nuxt","ru\u002F7.guides\u002F1.seo-checklist-nuxt",{"title":354,"path":355,"stem":356,"children":357,"icon":360},"Изменения","\u002Fru\u002Fchangelog","ru\u002F8.changelog\u002Findex",[358],{"title":359,"path":355,"stem":356},"Изменения и релизы ranklint","i-lucide-history",{"id":362,"title":350,"body":363,"description":3811,"extension":3812,"links":3813,"meta":3814,"navigation":532,"path":351,"seo":3815,"stem":352,"__hash__":3816},"docs_ru\u002Fru\u002F7.guides\u002F1.seo-checklist-nuxt.md",{"type":364,"value":365,"toc":3773},"minimark",[366,375,397,402,416,430,738,766,771,811,815,822,833,950,953,985,989,996,1002,1273,1276,1314,1318,1325,1354,1475,1478,1510,1514,1521,1542,1726,1849,1852,1872,1876,1879,1903,2173,2176,2190,2194,2214,2225,2723,2726,2746,2749,2763,2784,2995,2998,3030,3034,3051,3076,3268,3271,3291,3295,3311,3317,3425,3428,3448,3452,3455,3458,3631,3634,3672,3676,3679,3714,3744,3749,3752,3769],[367,368,369,370,374],"p",{},"Большинство SEO-регрессий в Nuxt-приложении вызваны не стратегией, а кодом: ",[371,372,373],"code",{},"noindex",", переживший релиз, canonical, собранный от неправильного базового URL, дерево заголовков с пропущенным уровнем, sitemap, в котором всё ещё лежит удалённый роут. Этот чеклист проходит по двенадцати областям, которые Google Search Central описывает как технические требования, показывает код на Nuxt 4 для каждой из них и называет правила ranklint, которые валят сборку, когда код расходится с ними. У Яндекса набор требований почти тот же, но отчёты и подтверждение прав живут в Яндекс Вебмастере, а не в Search Console, и расхождения отмечены прямо в соответствующих блоках.",[367,376,377,378,381,382,381,385,388,389,392,393,396],{},"Все сниппеты ниже используют API, которые поставляются с Nuxt 4, ",[371,379,380],{},"@nuxtjs\u002Fi18n",", ",[371,383,384],{},"@nuxt\u002Fimage",[371,386,387],{},"@nuxtjs\u002Frobots"," или самим модулем ",[371,390,391],{},"@ranklint\u002Fnuxt",". Идентификаторы правил ведут в полный справочник: ",[394,395,122],"a",{"href":118},".",[398,399,401],"h2",{"id":400},"индексируемость","Индексируемость",[367,403,404,405,408,409,411,412,415],{},"Индексируемая страница обязана одинаково отвечать на три вопроса: что говорит мета-тег robots, что говорит заголовок ",[371,406,407],{},"X-Robots-Tag"," и что разрешает robots.txt. Google Search Central прямо пишет, что закрытую в robots.txt страницу прочитать нельзя, поэтому ",[371,410,373],{}," внутри неё никто не увидит, а URL всё равно может попасть в выдачу без сниппета. Яндекс читает те же директивы, но дополнительно учитывает ",[371,413,414],{},"Clean-param",": она схлопывает дубли по параметрам запроса, а Googlebot её игнорирует, так что в общем robots.txt её стоит держать отдельно от правил обхода, важных для Google.",[367,417,418,419,422,423,426,427,396],{},"За вторую половину индексируемости отвечает серверный рендеринг. Если основной контент появляется только после гидратации, первый проход краулера видит пустую оболочку. В Nuxt это обычно означает страницу с ",[371,420,421],{},"ssr: false"," или загрузку данных в ",[371,424,425],{},"onMounted"," вместо ",[371,428,429],{},"useAsyncData",[431,432,437],"pre",{"className":433,"code":434,"language":435,"meta":436,"style":436},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F app\u002Fpages\u002Fadmin\u002F[id].vue\nuseHead({\n  meta: [{ name: 'robots', content: 'noindex, follow' }],\n})\n\n\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['@nuxtjs\u002Frobots', '@ranklint\u002Fnuxt'],\n  robots: {\n    disallow: ['\u002Fadmin', '\u002Fcheckout'],\n    sitemap: ['https:\u002F\u002Fexample.com\u002Fsitemap.xml'],\n  },\n  ranklint: {\n    site: { url: 'https:\u002F\u002Fexample.com', name: 'Example' },\n    robots: { mode: 'external' },\n  },\n})\n","ts","",[371,438,439,448,463,518,527,534,540,557,585,596,626,647,653,663,702,726,731],{"__ignoreMap":436},[440,441,444],"span",{"class":442,"line":443},"line",1,[440,445,447],{"class":446},"sHwdD","\u002F\u002F app\u002Fpages\u002Fadmin\u002F[id].vue\n",[440,449,451,455,459],{"class":442,"line":450},2,[440,452,454],{"class":453},"s2Zo4","useHead",[440,456,458],{"class":457},"sTEyZ","(",[440,460,462],{"class":461},"sMK4o","{\n",[440,464,466,470,473,476,479,482,484,487,491,494,497,500,502,504,507,509,512,515],{"class":442,"line":465},3,[440,467,469],{"class":468},"swJcz","  meta",[440,471,472],{"class":461},":",[440,474,475],{"class":457}," [",[440,477,478],{"class":461},"{",[440,480,481],{"class":468}," name",[440,483,472],{"class":461},[440,485,486],{"class":461}," '",[440,488,490],{"class":489},"sfazB","robots",[440,492,493],{"class":461},"'",[440,495,496],{"class":461},",",[440,498,499],{"class":468}," content",[440,501,472],{"class":461},[440,503,486],{"class":461},[440,505,506],{"class":489},"noindex, follow",[440,508,493],{"class":461},[440,510,511],{"class":461}," }",[440,513,514],{"class":457},"]",[440,516,517],{"class":461},",\n",[440,519,521,524],{"class":442,"line":520},4,[440,522,523],{"class":461},"}",[440,525,526],{"class":457},")\n",[440,528,530],{"class":442,"line":529},5,[440,531,533],{"emptyLinePlaceholder":532},true,"\n",[440,535,537],{"class":442,"line":536},6,[440,538,539],{"class":446},"\u002F\u002F nuxt.config.ts\n",[440,541,543,547,550,553,555],{"class":442,"line":542},7,[440,544,546],{"class":545},"s7zQu","export",[440,548,549],{"class":545}," default",[440,551,552],{"class":453}," defineNuxtConfig",[440,554,458],{"class":457},[440,556,462],{"class":461},[440,558,560,563,565,567,569,571,573,575,577,579,581,583],{"class":442,"line":559},8,[440,561,562],{"class":468},"  modules",[440,564,472],{"class":461},[440,566,475],{"class":457},[440,568,493],{"class":461},[440,570,387],{"class":489},[440,572,493],{"class":461},[440,574,496],{"class":461},[440,576,486],{"class":461},[440,578,391],{"class":489},[440,580,493],{"class":461},[440,582,514],{"class":457},[440,584,517],{"class":461},[440,586,588,591,593],{"class":442,"line":587},9,[440,589,590],{"class":468},"  robots",[440,592,472],{"class":461},[440,594,595],{"class":461}," {\n",[440,597,599,602,604,606,608,611,613,615,617,620,622,624],{"class":442,"line":598},10,[440,600,601],{"class":468},"    disallow",[440,603,472],{"class":461},[440,605,475],{"class":457},[440,607,493],{"class":461},[440,609,610],{"class":489},"\u002Fadmin",[440,612,493],{"class":461},[440,614,496],{"class":461},[440,616,486],{"class":461},[440,618,619],{"class":489},"\u002Fcheckout",[440,621,493],{"class":461},[440,623,514],{"class":457},[440,625,517],{"class":461},[440,627,629,632,634,636,638,641,643,645],{"class":442,"line":628},11,[440,630,631],{"class":468},"    sitemap",[440,633,472],{"class":461},[440,635,475],{"class":457},[440,637,493],{"class":461},[440,639,640],{"class":489},"https:\u002F\u002Fexample.com\u002Fsitemap.xml",[440,642,493],{"class":461},[440,644,514],{"class":457},[440,646,517],{"class":461},[440,648,650],{"class":442,"line":649},12,[440,651,652],{"class":461},"  },\n",[440,654,656,659,661],{"class":442,"line":655},13,[440,657,658],{"class":468},"  ranklint",[440,660,472],{"class":461},[440,662,595],{"class":461},[440,664,666,669,671,674,677,679,681,684,686,688,690,692,694,697,699],{"class":442,"line":665},14,[440,667,668],{"class":468},"    site",[440,670,472],{"class":461},[440,672,673],{"class":461}," {",[440,675,676],{"class":468}," url",[440,678,472],{"class":461},[440,680,486],{"class":461},[440,682,683],{"class":489},"https:\u002F\u002Fexample.com",[440,685,493],{"class":461},[440,687,496],{"class":461},[440,689,481],{"class":468},[440,691,472],{"class":461},[440,693,486],{"class":461},[440,695,696],{"class":489},"Example",[440,698,493],{"class":461},[440,700,701],{"class":461}," },\n",[440,703,705,708,710,712,715,717,719,722,724],{"class":442,"line":704},15,[440,706,707],{"class":468},"    robots",[440,709,472],{"class":461},[440,711,673],{"class":461},[440,713,714],{"class":468}," mode",[440,716,472],{"class":461},[440,718,486],{"class":461},[440,720,721],{"class":489},"external",[440,723,493],{"class":461},[440,725,701],{"class":461},[440,727,729],{"class":442,"line":728},16,[440,730,652],{"class":461},[440,732,734,736],{"class":442,"line":733},17,[440,735,523],{"class":461},[440,737,526],{"class":457},[367,739,740,741,744,745,747,748,750,751,754,755,758,759,761,762,765],{},"Владеть ",[371,742,743],{},"\u002Frobots.txt"," может только один модуль. Если в стеке есть ",[371,746,387],{},", файл пишет он, поэтому ",[371,749,391],{}," запускается с ",[371,752,753],{},"robots: { mode: 'external' }"," (или ",[371,756,757],{},"robots: false",") и не регистрирует конкурирующий обработчик роута. Обратный вариант тоже рабочий: выкинуть ",[371,760,387],{},", оставить дефолтный ",[371,763,764],{},"mode: 'owner'",", и модуль ranklint отдаст robots.txt с учётом окружения, закрыв непродакшн-хосты и объявив sitemap.",[767,768,770],"h3",{"id":769},"как-это-проверяет-ranklint","Как это проверяет ranklint",[772,773,774,781,787,793,799,805],"ul",{},[775,776,777],"li",{},[394,778,779],{"href":214},[371,780,213],{},[775,782,783],{},[394,784,785],{"href":167},[371,786,166],{},[775,788,789],{},[394,790,791],{"href":312},[371,792,311],{},[775,794,795],{},[394,796,797],{"href":328},[371,798,327],{},[775,800,801],{},[394,802,803],{"href":316},[371,804,315],{},[775,806,807],{},[394,808,809],{"href":220},[371,810,219],{},[398,812,814],{"id":813},"canonical-и-дубли","Canonical и дубли",[367,816,817,818,821],{},"Google считает ",[371,819,820],{},"rel=canonical"," сильной подсказкой, а не командой, и при расхождении сигналов выбирает канонический URL сам. Практическое правило из Search Central: каждая индексируемая страница объявляет абсолютный canonical на саму себя, а дубли указывают на ту версию, которую вы действительно хотите видеть в выдаче. Яндекс реагирует на тот же тег, но сходится медленнее, и на больших каталогах стабильный canonical от этого только ценнее.",[367,823,824,825,828,829,832],{},"В Nuxt-проектах доминируют два сценария поломки. Первый: относительный canonical без origin, собранный из одного ",[371,826,827],{},"useRoute().fullPath",". Второй: цепочка, в которой страница A указывает на B, а B указывает на C. Собирайте значение из ",[371,830,831],{},"useRequestURL()",", тогда origin будет корректным и на localhost, и на превью-деплоях, и в продакшене.",[431,834,836],{"className":433,"code":835,"language":435,"meta":436,"style":436},"\u002F\u002F app\u002Fpages\u002Fproducts\u002F[slug].vue\nconst url = useRequestURL()\nconst canonical = `${url.origin}${url.pathname}`\n\nuseHead({\n  link: [{ rel: 'canonical', href: canonical }],\n})\n",[371,837,838,843,861,894,898,906,944],{"__ignoreMap":436},[440,839,840],{"class":442,"line":443},[440,841,842],{"class":446},"\u002F\u002F app\u002Fpages\u002Fproducts\u002F[slug].vue\n",[440,844,845,849,852,855,858],{"class":442,"line":450},[440,846,848],{"class":847},"spNyl","const",[440,850,851],{"class":457}," url ",[440,853,854],{"class":461},"=",[440,856,857],{"class":453}," useRequestURL",[440,859,860],{"class":457},"()\n",[440,862,863,865,868,870,873,876,878,881,884,886,888,891],{"class":442,"line":465},[440,864,848],{"class":847},[440,866,867],{"class":457}," canonical ",[440,869,854],{"class":461},[440,871,872],{"class":461}," `${",[440,874,875],{"class":457},"url",[440,877,396],{"class":461},[440,879,880],{"class":457},"origin",[440,882,883],{"class":461},"}${",[440,885,875],{"class":457},[440,887,396],{"class":461},[440,889,890],{"class":457},"pathname",[440,892,893],{"class":461},"}`\n",[440,895,896],{"class":442,"line":520},[440,897,533],{"emptyLinePlaceholder":532},[440,899,900,902,904],{"class":442,"line":529},[440,901,454],{"class":453},[440,903,458],{"class":457},[440,905,462],{"class":461},[440,907,908,911,913,915,917,920,922,924,927,929,931,934,936,938,940,942],{"class":442,"line":536},[440,909,910],{"class":468},"  link",[440,912,472],{"class":461},[440,914,475],{"class":457},[440,916,478],{"class":461},[440,918,919],{"class":468}," rel",[440,921,472],{"class":461},[440,923,486],{"class":461},[440,925,926],{"class":489},"canonical",[440,928,493],{"class":461},[440,930,496],{"class":461},[440,932,933],{"class":468}," href",[440,935,472],{"class":461},[440,937,867],{"class":457},[440,939,523],{"class":461},[440,941,514],{"class":457},[440,943,517],{"class":461},[440,945,946,948],{"class":442,"line":542},[440,947,523],{"class":461},[440,949,526],{"class":457},[767,951,770],{"id":952},"как-это-проверяет-ranklint-1",[772,954,955,961,967,973,979],{},[775,956,957],{},[394,958,959],{"href":268},[371,960,267],{},[775,962,963],{},[394,964,965],{"href":272},[371,966,271],{},[775,968,969],{},[394,970,971],{"href":264},[371,972,263],{},[775,974,975],{},[394,976,977],{"href":288},[371,978,287],{},[775,980,981],{},[394,982,983],{"href":284},[371,984,283],{},[398,986,988],{"id":987},"title-и-description","Title и description",[367,990,991,992,995],{},"Search Central просит уникальный описательный ",[371,993,994],{},"\u003Ctitle>"," на каждую страницу и мета-описание, которое пересказывает страницу, а не повторяет заголовок. Ни то, ни другое само по себе не фактор ранжирования, но оба управляют сниппетом, а отсутствие описания означает, что Google напишет его сам из тела страницы. Open Graph и Twitter-теги вообще не поисковые сигналы, они решают, как расшаренная ссылка выглядит в мессенджерах и соцсетях, и поэтому живут в том же блоке кода.",[367,997,998,1001],{},[371,999,1000],{},"useSeoMeta"," даёт плоский типизированный способ описать всё это в Nuxt 4. Держите title в районе 30-60 символов, а description в районе 70-160: именно такие дефолты у ranklint.",[431,1003,1005],{"className":433,"code":1004,"language":435,"meta":436,"style":436},"\u002F\u002F app\u002Fpages\u002Fproducts\u002F[slug].vue\nconst route = useRoute()\nconst { data: product } = await useAsyncData(() => $fetch(`\u002Fapi\u002Fproducts\u002F${route.params.slug}`))\n\nuseSeoMeta({\n  title: () => `${product.value?.name} price and specs`,\n  description: () => product.value?.summary,\n  ogTitle: () => product.value?.name,\n  ogDescription: () => product.value?.summary,\n  ogImage: () => product.value?.image,\n  ogType: 'website',\n  twitterCard: 'summary_large_image',\n})\n",[371,1006,1007,1011,1025,1091,1095,1103,1140,1165,1188,1211,1235,1251,1267],{"__ignoreMap":436},[440,1008,1009],{"class":442,"line":443},[440,1010,842],{"class":446},[440,1012,1013,1015,1018,1020,1023],{"class":442,"line":450},[440,1014,848],{"class":847},[440,1016,1017],{"class":457}," route ",[440,1019,854],{"class":461},[440,1021,1022],{"class":453}," useRoute",[440,1024,860],{"class":457},[440,1026,1027,1029,1031,1034,1036,1039,1041,1044,1047,1050,1052,1055,1058,1061,1063,1066,1069,1072,1075,1077,1080,1082,1085,1088],{"class":442,"line":465},[440,1028,848],{"class":847},[440,1030,673],{"class":461},[440,1032,1033],{"class":468}," data",[440,1035,472],{"class":461},[440,1037,1038],{"class":457}," product ",[440,1040,523],{"class":461},[440,1042,1043],{"class":461}," =",[440,1045,1046],{"class":545}," await",[440,1048,1049],{"class":453}," useAsyncData",[440,1051,458],{"class":457},[440,1053,1054],{"class":461},"()",[440,1056,1057],{"class":847}," =>",[440,1059,1060],{"class":453}," $fetch",[440,1062,458],{"class":457},[440,1064,1065],{"class":461},"`",[440,1067,1068],{"class":489},"\u002Fapi\u002Fproducts\u002F",[440,1070,1071],{"class":461},"${",[440,1073,1074],{"class":457},"route",[440,1076,396],{"class":461},[440,1078,1079],{"class":457},"params",[440,1081,396],{"class":461},[440,1083,1084],{"class":457},"slug",[440,1086,1087],{"class":461},"}`",[440,1089,1090],{"class":457},"))\n",[440,1092,1093],{"class":442,"line":520},[440,1094,533],{"emptyLinePlaceholder":532},[440,1096,1097,1099,1101],{"class":442,"line":529},[440,1098,1000],{"class":453},[440,1100,458],{"class":457},[440,1102,462],{"class":461},[440,1104,1105,1108,1110,1113,1115,1117,1120,1122,1125,1128,1131,1133,1136,1138],{"class":442,"line":536},[440,1106,1107],{"class":453},"  title",[440,1109,472],{"class":461},[440,1111,1112],{"class":461}," ()",[440,1114,1057],{"class":847},[440,1116,872],{"class":461},[440,1118,1119],{"class":457},"product",[440,1121,396],{"class":461},[440,1123,1124],{"class":457},"value",[440,1126,1127],{"class":461},"?.",[440,1129,1130],{"class":457},"name",[440,1132,523],{"class":461},[440,1134,1135],{"class":489}," price and specs",[440,1137,1065],{"class":461},[440,1139,517],{"class":461},[440,1141,1142,1145,1147,1149,1151,1154,1156,1158,1160,1163],{"class":442,"line":542},[440,1143,1144],{"class":453},"  description",[440,1146,472],{"class":461},[440,1148,1112],{"class":461},[440,1150,1057],{"class":847},[440,1152,1153],{"class":457}," product",[440,1155,396],{"class":461},[440,1157,1124],{"class":457},[440,1159,1127],{"class":461},[440,1161,1162],{"class":457},"summary",[440,1164,517],{"class":461},[440,1166,1167,1170,1172,1174,1176,1178,1180,1182,1184,1186],{"class":442,"line":559},[440,1168,1169],{"class":453},"  ogTitle",[440,1171,472],{"class":461},[440,1173,1112],{"class":461},[440,1175,1057],{"class":847},[440,1177,1153],{"class":457},[440,1179,396],{"class":461},[440,1181,1124],{"class":457},[440,1183,1127],{"class":461},[440,1185,1130],{"class":457},[440,1187,517],{"class":461},[440,1189,1190,1193,1195,1197,1199,1201,1203,1205,1207,1209],{"class":442,"line":587},[440,1191,1192],{"class":453},"  ogDescription",[440,1194,472],{"class":461},[440,1196,1112],{"class":461},[440,1198,1057],{"class":847},[440,1200,1153],{"class":457},[440,1202,396],{"class":461},[440,1204,1124],{"class":457},[440,1206,1127],{"class":461},[440,1208,1162],{"class":457},[440,1210,517],{"class":461},[440,1212,1213,1216,1218,1220,1222,1224,1226,1228,1230,1233],{"class":442,"line":598},[440,1214,1215],{"class":453},"  ogImage",[440,1217,472],{"class":461},[440,1219,1112],{"class":461},[440,1221,1057],{"class":847},[440,1223,1153],{"class":457},[440,1225,396],{"class":461},[440,1227,1124],{"class":457},[440,1229,1127],{"class":461},[440,1231,1232],{"class":457},"image",[440,1234,517],{"class":461},[440,1236,1237,1240,1242,1244,1247,1249],{"class":442,"line":628},[440,1238,1239],{"class":468},"  ogType",[440,1241,472],{"class":461},[440,1243,486],{"class":461},[440,1245,1246],{"class":489},"website",[440,1248,493],{"class":461},[440,1250,517],{"class":461},[440,1252,1253,1256,1258,1260,1263,1265],{"class":442,"line":649},[440,1254,1255],{"class":468},"  twitterCard",[440,1257,472],{"class":461},[440,1259,486],{"class":461},[440,1261,1262],{"class":489},"summary_large_image",[440,1264,493],{"class":461},[440,1266,517],{"class":461},[440,1268,1269,1271],{"class":442,"line":655},[440,1270,523],{"class":461},[440,1272,526],{"class":457},[767,1274,770],{"id":1275},"как-это-проверяет-ranklint-2",[772,1277,1278,1284,1290,1296,1302,1308],{},[775,1279,1280],{},[394,1281,1282],{"href":300},[371,1283,299],{},[775,1285,1286],{},[394,1287,1288],{"href":296},[371,1289,295],{},[775,1291,1292],{},[394,1293,1294],{"href":280},[371,1295,279],{},[775,1297,1298],{},[394,1299,1300],{"href":276},[371,1301,275],{},[775,1303,1304],{},[394,1305,1306],{"href":292},[371,1307,291],{},[775,1309,1310],{},[394,1311,1312],{"href":304},[371,1313,303],{},[398,1315,1317],{"id":1316},"заголовки","Заголовки",[367,1319,1320,1321,1324],{},"Google Search Central описывает заголовки как способ выразить структуру документа, а не как инструмент оформления. Один ",[371,1322,1323],{},"h1"," на страницу, без пропуска уровней, без пустых заголовков, оставленных компонентом, который рендерит слот с названием по условию. Скринридеры читают то же дерево, так что выигрыш в доступности достаётся бесплатно.",[367,1326,1327,1328,1331,1332,1334,1335,1337,1338,1340,1341,1343,1344,1347,1348,1350,1351,1353],{},"Специфичная для Nuxt ловушка прячется в ",[371,1329,1330],{},"layout",". Если ",[371,1333,1330],{}," рендерит имя сайта внутри ",[371,1336,1323],{},", а страница добавляет свой, на каждом роуте выходит два заголовка первого уровня и одинаковый текст ",[371,1339,1323],{}," по всему сайту. Оставьте в ",[371,1342,1330],{}," тег ",[371,1345,1346],{},"div"," или ",[371,1349,367],{},", а единственный ",[371,1352,1323],{}," отдайте странице.",[431,1355,1359],{"className":1356,"code":1357,"language":1358,"meta":436,"style":436},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- app\u002Fpages\u002Fproducts\u002F[slug].vue -->\n\u003Ctemplate>\n  \u003Carticle>\n    \u003Ch1>{{ product.name }}\u003C\u002Fh1>\n    \u003Ch2>Specifications\u003C\u002Fh2>\n    \u003Ch3>Dimensions\u003C\u002Fh3>\n    \u003Ch2>Reviews\u003C\u002Fh2>\n  \u003C\u002Farticle>\n\u003C\u002Ftemplate>\n","vue",[371,1360,1361,1366,1377,1387,1407,1424,1441,1458,1467],{"__ignoreMap":436},[440,1362,1363],{"class":442,"line":443},[440,1364,1365],{"class":446},"\u003C!-- app\u002Fpages\u002Fproducts\u002F[slug].vue -->\n",[440,1367,1368,1371,1374],{"class":442,"line":450},[440,1369,1370],{"class":461},"\u003C",[440,1372,1373],{"class":468},"template",[440,1375,1376],{"class":461},">\n",[440,1378,1379,1382,1385],{"class":442,"line":465},[440,1380,1381],{"class":461},"  \u003C",[440,1383,1384],{"class":468},"article",[440,1386,1376],{"class":461},[440,1388,1389,1392,1394,1397,1400,1403,1405],{"class":442,"line":520},[440,1390,1391],{"class":461},"    \u003C",[440,1393,1323],{"class":468},[440,1395,1396],{"class":461},">",[440,1398,1399],{"class":457},"{{ product.name }}",[440,1401,1402],{"class":461},"\u003C\u002F",[440,1404,1323],{"class":468},[440,1406,1376],{"class":461},[440,1408,1409,1411,1413,1415,1418,1420,1422],{"class":442,"line":529},[440,1410,1391],{"class":461},[440,1412,398],{"class":468},[440,1414,1396],{"class":461},[440,1416,1417],{"class":457},"Specifications",[440,1419,1402],{"class":461},[440,1421,398],{"class":468},[440,1423,1376],{"class":461},[440,1425,1426,1428,1430,1432,1435,1437,1439],{"class":442,"line":536},[440,1427,1391],{"class":461},[440,1429,767],{"class":468},[440,1431,1396],{"class":461},[440,1433,1434],{"class":457},"Dimensions",[440,1436,1402],{"class":461},[440,1438,767],{"class":468},[440,1440,1376],{"class":461},[440,1442,1443,1445,1447,1449,1452,1454,1456],{"class":442,"line":542},[440,1444,1391],{"class":461},[440,1446,398],{"class":468},[440,1448,1396],{"class":461},[440,1450,1451],{"class":457},"Reviews",[440,1453,1402],{"class":461},[440,1455,398],{"class":468},[440,1457,1376],{"class":461},[440,1459,1460,1463,1465],{"class":442,"line":559},[440,1461,1462],{"class":461},"  \u003C\u002F",[440,1464,1384],{"class":468},[440,1466,1376],{"class":461},[440,1468,1469,1471,1473],{"class":442,"line":587},[440,1470,1402],{"class":461},[440,1472,1373],{"class":468},[440,1474,1376],{"class":461},[767,1476,770],{"id":1477},"как-это-проверяет-ranklint-3",[772,1479,1480,1486,1492,1498,1504],{},[775,1481,1482],{},[394,1483,1484],{"href":142},[371,1485,141],{},[775,1487,1488],{},[394,1489,1490],{"href":130},[371,1491,129],{},[775,1493,1494],{},[394,1495,1496],{"href":134},[371,1497,133],{},[775,1499,1500],{},[394,1501,1502],{"href":138},[371,1503,137],{},[775,1505,1506],{},[394,1507,1508],{"href":146},[371,1509,145],{},[398,1511,1513],{"id":1512},"hreflang-и-i18n","hreflang и i18n",[367,1515,1516,1517,1520],{},"Документация по hreflang на Search Central формулирует одно жёсткое требование: аннотации должны быть взаимными. Если английская страница перечисляет немецкую, немецкая обязана перечислить английскую в ответ, и в каждом наборе должен быть ",[371,1518,1519],{},"x-default"," для языкового переключателя или запасной локали. Нарушенная взаимность молча игнорируется, поэтому теги выглядят проставленными в исходнике страницы и при этом ничего не делают. Яндекс тоже читает эти аннотации.",[367,1522,1523,1524,1526,1527,1530,1531,1534,1535,1537,1538,1541],{},"В Nuxt ",[371,1525,380],{}," генерирует весь набор из конфига локалей, если у каждой локали есть тег ",[371,1528,1529],{},"language"," в формате BCP 47, а ",[371,1532,1533],{},"baseUrl"," абсолютный. Композабл возвращает ref, поэтому передавайте его в ",[371,1536,454],{}," геттером: одно разворачивание ",[371,1539,1540],{},".value"," в setup заморозит аннотации на первом отрендеренном роуте.",[431,1543,1545],{"className":433,"code":1544,"language":435,"meta":436,"style":436},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['@nuxtjs\u002Fi18n'],\n  i18n: {\n    baseUrl: 'https:\u002F\u002Fexample.com',\n    defaultLocale: 'en',\n    strategy: 'prefix_except_default',\n    locales: [\n      { code: 'en', language: 'en-US' },\n      { code: 'de', language: 'de-DE' },\n    ],\n  },\n})\n",[371,1546,1547,1551,1563,1581,1590,1605,1621,1637,1647,1679,1709,1716,1720],{"__ignoreMap":436},[440,1548,1549],{"class":442,"line":443},[440,1550,539],{"class":446},[440,1552,1553,1555,1557,1559,1561],{"class":442,"line":450},[440,1554,546],{"class":545},[440,1556,549],{"class":545},[440,1558,552],{"class":453},[440,1560,458],{"class":457},[440,1562,462],{"class":461},[440,1564,1565,1567,1569,1571,1573,1575,1577,1579],{"class":442,"line":465},[440,1566,562],{"class":468},[440,1568,472],{"class":461},[440,1570,475],{"class":457},[440,1572,493],{"class":461},[440,1574,380],{"class":489},[440,1576,493],{"class":461},[440,1578,514],{"class":457},[440,1580,517],{"class":461},[440,1582,1583,1586,1588],{"class":442,"line":520},[440,1584,1585],{"class":468},"  i18n",[440,1587,472],{"class":461},[440,1589,595],{"class":461},[440,1591,1592,1595,1597,1599,1601,1603],{"class":442,"line":529},[440,1593,1594],{"class":468},"    baseUrl",[440,1596,472],{"class":461},[440,1598,486],{"class":461},[440,1600,683],{"class":489},[440,1602,493],{"class":461},[440,1604,517],{"class":461},[440,1606,1607,1610,1612,1614,1617,1619],{"class":442,"line":536},[440,1608,1609],{"class":468},"    defaultLocale",[440,1611,472],{"class":461},[440,1613,486],{"class":461},[440,1615,1616],{"class":489},"en",[440,1618,493],{"class":461},[440,1620,517],{"class":461},[440,1622,1623,1626,1628,1630,1633,1635],{"class":442,"line":542},[440,1624,1625],{"class":468},"    strategy",[440,1627,472],{"class":461},[440,1629,486],{"class":461},[440,1631,1632],{"class":489},"prefix_except_default",[440,1634,493],{"class":461},[440,1636,517],{"class":461},[440,1638,1639,1642,1644],{"class":442,"line":559},[440,1640,1641],{"class":468},"    locales",[440,1643,472],{"class":461},[440,1645,1646],{"class":457}," [\n",[440,1648,1649,1652,1655,1657,1659,1661,1663,1665,1668,1670,1672,1675,1677],{"class":442,"line":587},[440,1650,1651],{"class":461},"      {",[440,1653,1654],{"class":468}," code",[440,1656,472],{"class":461},[440,1658,486],{"class":461},[440,1660,1616],{"class":489},[440,1662,493],{"class":461},[440,1664,496],{"class":461},[440,1666,1667],{"class":468}," language",[440,1669,472],{"class":461},[440,1671,486],{"class":461},[440,1673,1674],{"class":489},"en-US",[440,1676,493],{"class":461},[440,1678,701],{"class":461},[440,1680,1681,1683,1685,1687,1689,1692,1694,1696,1698,1700,1702,1705,1707],{"class":442,"line":598},[440,1682,1651],{"class":461},[440,1684,1654],{"class":468},[440,1686,472],{"class":461},[440,1688,486],{"class":461},[440,1690,1691],{"class":489},"de",[440,1693,493],{"class":461},[440,1695,496],{"class":461},[440,1697,1667],{"class":468},[440,1699,472],{"class":461},[440,1701,486],{"class":461},[440,1703,1704],{"class":489},"de-DE",[440,1706,493],{"class":461},[440,1708,701],{"class":461},[440,1710,1711,1714],{"class":442,"line":628},[440,1712,1713],{"class":457},"    ]",[440,1715,517],{"class":461},[440,1717,1718],{"class":442,"line":649},[440,1719,652],{"class":461},[440,1721,1722,1724],{"class":442,"line":655},[440,1723,523],{"class":461},[440,1725,526],{"class":457},[431,1727,1729],{"className":433,"code":1728,"language":435,"meta":436,"style":436},"\u002F\u002F app\u002Fapp.vue\nconst head = useLocaleHead({ seo: true })\n\nuseHead(() => ({\n  htmlAttrs: head.value.htmlAttrs,\n  link: head.value.link,\n  meta: head.value.meta,\n}))\n",[371,1730,1731,1736,1765,1769,1784,1805,1824,1843],{"__ignoreMap":436},[440,1732,1733],{"class":442,"line":443},[440,1734,1735],{"class":446},"\u002F\u002F app\u002Fapp.vue\n",[440,1737,1738,1740,1743,1745,1748,1750,1752,1755,1757,1761,1763],{"class":442,"line":450},[440,1739,848],{"class":847},[440,1741,1742],{"class":457}," head ",[440,1744,854],{"class":461},[440,1746,1747],{"class":453}," useLocaleHead",[440,1749,458],{"class":457},[440,1751,478],{"class":461},[440,1753,1754],{"class":468}," seo",[440,1756,472],{"class":461},[440,1758,1760],{"class":1759},"sfNiH"," true",[440,1762,511],{"class":461},[440,1764,526],{"class":457},[440,1766,1767],{"class":442,"line":465},[440,1768,533],{"emptyLinePlaceholder":532},[440,1770,1771,1773,1775,1777,1779,1782],{"class":442,"line":520},[440,1772,454],{"class":453},[440,1774,458],{"class":457},[440,1776,1054],{"class":461},[440,1778,1057],{"class":847},[440,1780,1781],{"class":457}," (",[440,1783,462],{"class":461},[440,1785,1786,1789,1791,1794,1796,1798,1800,1803],{"class":442,"line":529},[440,1787,1788],{"class":468},"  htmlAttrs",[440,1790,472],{"class":461},[440,1792,1793],{"class":457}," head",[440,1795,396],{"class":461},[440,1797,1124],{"class":457},[440,1799,396],{"class":461},[440,1801,1802],{"class":457},"htmlAttrs",[440,1804,517],{"class":461},[440,1806,1807,1809,1811,1813,1815,1817,1819,1822],{"class":442,"line":536},[440,1808,910],{"class":468},[440,1810,472],{"class":461},[440,1812,1793],{"class":457},[440,1814,396],{"class":461},[440,1816,1124],{"class":457},[440,1818,396],{"class":461},[440,1820,1821],{"class":457},"link",[440,1823,517],{"class":461},[440,1825,1826,1828,1830,1832,1834,1836,1838,1841],{"class":442,"line":542},[440,1827,469],{"class":468},[440,1829,472],{"class":461},[440,1831,1793],{"class":457},[440,1833,396],{"class":461},[440,1835,1124],{"class":457},[440,1837,396],{"class":461},[440,1839,1840],{"class":457},"meta",[440,1842,517],{"class":461},[440,1844,1845,1847],{"class":442,"line":559},[440,1846,523],{"class":461},[440,1848,1090],{"class":457},[767,1850,770],{"id":1851},"как-это-проверяет-ranklint-4",[772,1853,1854,1860,1866],{},[775,1855,1856],{},[394,1857,1858],{"href":180},[371,1859,179],{},[775,1861,1862],{},[394,1863,1864],{"href":184},[371,1865,183],{},[775,1867,1868],{},[394,1869,1870],{"href":188},[371,1871,187],{},[398,1873,1875],{"id":1874},"json-ld","JSON-LD",[367,1877,1878],{},"Расширенным сниппетам нужна структурированная разметка, и Search Central предпочитает JSON-LD микроданным, потому что он не переплетается с вёрсткой. Яндекс читает JSON-LD наравне с Google. Ломаются в продакшене обычно две тривиальные вещи: JSON не парсится, чаще всего после того как в скрипт подставили строку с неэкранированной кавычкой, либо у выбранного типа не хватает обязательного свойства, и тогда тип отбрасывается целиком, а не понижается.",[367,1880,1881,1882,1884,1885,1888,1889,1891,1892,1895,1896,1899,1900,1902],{},"Модуль ",[371,1883,391],{}," поставляет ",[371,1886,1887],{},"useJsonLd(type, data)",", который рендерит скрипт через ",[371,1890,454],{}," с проставленными ",[371,1893,1894],{},"@context"," и ",[371,1897,1898],{},"@type"," и валидирует payload через Zod только в dev. Без модуля эквивалентом служит обычный ",[371,1901,454],{}," с сырым скриптом.",[431,1904,1906],{"className":433,"code":1905,"language":435,"meta":436,"style":436},"\u002F\u002F app\u002Fpages\u002Fproducts\u002F[slug].vue\nuseJsonLd('Product', {\n  name: product.value?.name,\n  description: product.value?.summary,\n  offers: { price: product.value?.price, priceCurrency: 'EUR' },\n})\n\n\u002F\u002F without the module\nuseHead({\n  script: [{\n    type: 'application\u002Fld+json',\n    innerHTML: JSON.stringify({\n      '@context': 'https:\u002F\u002Fschema.org',\n      '@type': 'Organization',\n      name: 'Example',\n      url: 'https:\u002F\u002Fexample.com',\n    }),\n  }],\n})\n",[371,1907,1908,1912,1930,1949,1967,2008,2014,2018,2023,2031,2042,2058,2077,2097,2116,2131,2146,2156,2166],{"__ignoreMap":436},[440,1909,1910],{"class":442,"line":443},[440,1911,842],{"class":446},[440,1913,1914,1917,1919,1921,1924,1926,1928],{"class":442,"line":450},[440,1915,1916],{"class":453},"useJsonLd",[440,1918,458],{"class":457},[440,1920,493],{"class":461},[440,1922,1923],{"class":489},"Product",[440,1925,493],{"class":461},[440,1927,496],{"class":461},[440,1929,595],{"class":461},[440,1931,1932,1935,1937,1939,1941,1943,1945,1947],{"class":442,"line":465},[440,1933,1934],{"class":468},"  name",[440,1936,472],{"class":461},[440,1938,1153],{"class":457},[440,1940,396],{"class":461},[440,1942,1124],{"class":457},[440,1944,1127],{"class":461},[440,1946,1130],{"class":457},[440,1948,517],{"class":461},[440,1950,1951,1953,1955,1957,1959,1961,1963,1965],{"class":442,"line":520},[440,1952,1144],{"class":468},[440,1954,472],{"class":461},[440,1956,1153],{"class":457},[440,1958,396],{"class":461},[440,1960,1124],{"class":457},[440,1962,1127],{"class":461},[440,1964,1162],{"class":457},[440,1966,517],{"class":461},[440,1968,1969,1972,1974,1976,1979,1981,1983,1985,1987,1989,1992,1994,1997,1999,2001,2004,2006],{"class":442,"line":529},[440,1970,1971],{"class":468},"  offers",[440,1973,472],{"class":461},[440,1975,673],{"class":461},[440,1977,1978],{"class":468}," price",[440,1980,472],{"class":461},[440,1982,1153],{"class":457},[440,1984,396],{"class":461},[440,1986,1124],{"class":457},[440,1988,1127],{"class":461},[440,1990,1991],{"class":457},"price",[440,1993,496],{"class":461},[440,1995,1996],{"class":468}," priceCurrency",[440,1998,472],{"class":461},[440,2000,486],{"class":461},[440,2002,2003],{"class":489},"EUR",[440,2005,493],{"class":461},[440,2007,701],{"class":461},[440,2009,2010,2012],{"class":442,"line":536},[440,2011,523],{"class":461},[440,2013,526],{"class":457},[440,2015,2016],{"class":442,"line":542},[440,2017,533],{"emptyLinePlaceholder":532},[440,2019,2020],{"class":442,"line":559},[440,2021,2022],{"class":446},"\u002F\u002F without the module\n",[440,2024,2025,2027,2029],{"class":442,"line":587},[440,2026,454],{"class":453},[440,2028,458],{"class":457},[440,2030,462],{"class":461},[440,2032,2033,2036,2038,2040],{"class":442,"line":598},[440,2034,2035],{"class":468},"  script",[440,2037,472],{"class":461},[440,2039,475],{"class":457},[440,2041,462],{"class":461},[440,2043,2044,2047,2049,2051,2054,2056],{"class":442,"line":628},[440,2045,2046],{"class":468},"    type",[440,2048,472],{"class":461},[440,2050,486],{"class":461},[440,2052,2053],{"class":489},"application\u002Fld+json",[440,2055,493],{"class":461},[440,2057,517],{"class":461},[440,2059,2060,2063,2065,2068,2070,2073,2075],{"class":442,"line":649},[440,2061,2062],{"class":468},"    innerHTML",[440,2064,472],{"class":461},[440,2066,2067],{"class":457}," JSON",[440,2069,396],{"class":461},[440,2071,2072],{"class":453},"stringify",[440,2074,458],{"class":457},[440,2076,462],{"class":461},[440,2078,2079,2082,2084,2086,2088,2090,2093,2095],{"class":442,"line":655},[440,2080,2081],{"class":461},"      '",[440,2083,1894],{"class":468},[440,2085,493],{"class":461},[440,2087,472],{"class":461},[440,2089,486],{"class":461},[440,2091,2092],{"class":489},"https:\u002F\u002Fschema.org",[440,2094,493],{"class":461},[440,2096,517],{"class":461},[440,2098,2099,2101,2103,2105,2107,2109,2112,2114],{"class":442,"line":665},[440,2100,2081],{"class":461},[440,2102,1898],{"class":468},[440,2104,493],{"class":461},[440,2106,472],{"class":461},[440,2108,486],{"class":461},[440,2110,2111],{"class":489},"Organization",[440,2113,493],{"class":461},[440,2115,517],{"class":461},[440,2117,2118,2121,2123,2125,2127,2129],{"class":442,"line":704},[440,2119,2120],{"class":468},"      name",[440,2122,472],{"class":461},[440,2124,486],{"class":461},[440,2126,696],{"class":489},[440,2128,493],{"class":461},[440,2130,517],{"class":461},[440,2132,2133,2136,2138,2140,2142,2144],{"class":442,"line":728},[440,2134,2135],{"class":468},"      url",[440,2137,472],{"class":461},[440,2139,486],{"class":461},[440,2141,683],{"class":489},[440,2143,493],{"class":461},[440,2145,517],{"class":461},[440,2147,2148,2151,2154],{"class":442,"line":733},[440,2149,2150],{"class":461},"    }",[440,2152,2153],{"class":457},")",[440,2155,517],{"class":461},[440,2157,2159,2162,2164],{"class":442,"line":2158},18,[440,2160,2161],{"class":461},"  }",[440,2163,514],{"class":457},[440,2165,517],{"class":461},[440,2167,2169,2171],{"class":442,"line":2168},19,[440,2170,523],{"class":461},[440,2172,526],{"class":457},[767,2174,770],{"id":2175},"как-это-проверяет-ranklint-5",[772,2177,2178,2184],{},[775,2179,2180],{},[394,2181,2182],{"href":337},[371,2183,336],{},[775,2185,2186],{},[394,2187,2188],{"href":341},[371,2189,340],{},[398,2191,2193],{"id":2192},"хлебные-крошки","Хлебные крошки",[367,2195,2196,2197,2200,2201,2204,2205,381,2208,1895,2210,2213],{},"Расширенный сниппет с хлебными крошками заменяет в выдаче Google голый URL на читаемый путь, и Search Central требует тип ",[371,2198,2199],{},"BreadcrumbList"," с упорядоченным ",[371,2202,2203],{},"itemListElement",", где у каждого элемента есть ",[371,2206,2207],{},"position",[371,2209,1130],{},[371,2211,2212],{},"item",". Яндекс рисует свою навигационную цепочку по той же разметке. Список обязан повторять то, что видит пользователь: невидимые крошки, существующие только в JSON-LD, нарушают правила структурированных данных.",[367,2215,2216,2217,2220,2221,2224],{},"Рендерьте видимую цепочку через ",[371,2218,2219],{},"NuxtLink",", чтобы внутренняя навигация оставалась клиентской, а краулер всё равно получал настоящие ",[371,2222,2223],{},"href",", и отдавайте соответствующий JSON-LD из того же массива.",[431,2226,2228],{"className":1356,"code":2227,"language":1358,"meta":436,"style":436},"\u003C!-- app\u002Fcomponents\u002FBreadcrumbs.vue -->\n\u003Cscript setup lang=\"ts\">\nconst props = defineProps\u003C{ product: { name: string, slug: string } }>()\n\nconst crumbs = [\n  { name: 'Home', path: '\u002F' },\n  { name: 'Products', path: '\u002Fproducts' },\n  { name: props.product.name, path: `\u002Fproducts\u002F${props.product.slug}` },\n]\n\nuseJsonLd('BreadcrumbList', {\n  itemListElement: crumbs.map((crumb, index) => ({\n    '@type': 'ListItem',\n    position: index + 1,\n    name: crumb.name,\n    item: `https:\u002F\u002Fexample.com${crumb.path}`,\n  })),\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cnav aria-label=\"Breadcrumb\">\n    \u003CNuxtLink v-for=\"crumb in crumbs\" :key=\"crumb.path\" :to=\"crumb.path\">\n      {{ crumb.name }}\n    \u003C\u002FNuxtLink>\n  \u003C\u002Fnav>\n\u003C\u002Ftemplate>\n",[371,2229,2230,2235,2259,2304,2308,2319,2351,2381,2429,2434,2438,2454,2490,2510,2529,2545,2569,2578,2584,2592,2597,2606,2628,2689,2695,2705,2714],{"__ignoreMap":436},[440,2231,2232],{"class":442,"line":443},[440,2233,2234],{"class":446},"\u003C!-- app\u002Fcomponents\u002FBreadcrumbs.vue -->\n",[440,2236,2237,2239,2242,2245,2248,2250,2253,2255,2257],{"class":442,"line":450},[440,2238,1370],{"class":461},[440,2240,2241],{"class":468},"script",[440,2243,2244],{"class":847}," setup",[440,2246,2247],{"class":847}," lang",[440,2249,854],{"class":461},[440,2251,2252],{"class":461},"\"",[440,2254,435],{"class":489},[440,2256,2252],{"class":461},[440,2258,1376],{"class":461},[440,2260,2261,2263,2266,2268,2271,2274,2276,2278,2280,2282,2284,2288,2290,2293,2295,2297,2299,2302],{"class":442,"line":465},[440,2262,848],{"class":847},[440,2264,2265],{"class":457}," props ",[440,2267,854],{"class":461},[440,2269,2270],{"class":453}," defineProps",[440,2272,2273],{"class":461},"\u003C{",[440,2275,1153],{"class":468},[440,2277,472],{"class":461},[440,2279,673],{"class":461},[440,2281,481],{"class":468},[440,2283,472],{"class":461},[440,2285,2287],{"class":2286},"sBMFI"," string",[440,2289,496],{"class":461},[440,2291,2292],{"class":468}," slug",[440,2294,472],{"class":461},[440,2296,2287],{"class":2286},[440,2298,511],{"class":461},[440,2300,2301],{"class":461}," }>",[440,2303,860],{"class":457},[440,2305,2306],{"class":442,"line":520},[440,2307,533],{"emptyLinePlaceholder":532},[440,2309,2310,2312,2315,2317],{"class":442,"line":529},[440,2311,848],{"class":847},[440,2313,2314],{"class":457}," crumbs ",[440,2316,854],{"class":461},[440,2318,1646],{"class":457},[440,2320,2321,2324,2326,2328,2330,2333,2335,2337,2340,2342,2344,2347,2349],{"class":442,"line":536},[440,2322,2323],{"class":461},"  {",[440,2325,481],{"class":468},[440,2327,472],{"class":461},[440,2329,486],{"class":461},[440,2331,2332],{"class":489},"Home",[440,2334,493],{"class":461},[440,2336,496],{"class":461},[440,2338,2339],{"class":468}," path",[440,2341,472],{"class":461},[440,2343,486],{"class":461},[440,2345,2346],{"class":489},"\u002F",[440,2348,493],{"class":461},[440,2350,701],{"class":461},[440,2352,2353,2355,2357,2359,2361,2364,2366,2368,2370,2372,2374,2377,2379],{"class":442,"line":542},[440,2354,2323],{"class":461},[440,2356,481],{"class":468},[440,2358,472],{"class":461},[440,2360,486],{"class":461},[440,2362,2363],{"class":489},"Products",[440,2365,493],{"class":461},[440,2367,496],{"class":461},[440,2369,2339],{"class":468},[440,2371,472],{"class":461},[440,2373,486],{"class":461},[440,2375,2376],{"class":489},"\u002Fproducts",[440,2378,493],{"class":461},[440,2380,701],{"class":461},[440,2382,2383,2385,2387,2389,2392,2394,2396,2398,2400,2402,2404,2406,2409,2412,2414,2417,2419,2421,2423,2425,2427],{"class":442,"line":559},[440,2384,2323],{"class":461},[440,2386,481],{"class":468},[440,2388,472],{"class":461},[440,2390,2391],{"class":457}," props",[440,2393,396],{"class":461},[440,2395,1119],{"class":457},[440,2397,396],{"class":461},[440,2399,1130],{"class":457},[440,2401,496],{"class":461},[440,2403,2339],{"class":468},[440,2405,472],{"class":461},[440,2407,2408],{"class":461}," `",[440,2410,2411],{"class":489},"\u002Fproducts\u002F",[440,2413,1071],{"class":461},[440,2415,2416],{"class":457},"props",[440,2418,396],{"class":461},[440,2420,1119],{"class":457},[440,2422,396],{"class":461},[440,2424,1084],{"class":457},[440,2426,1087],{"class":461},[440,2428,701],{"class":461},[440,2430,2431],{"class":442,"line":587},[440,2432,2433],{"class":457},"]\n",[440,2435,2436],{"class":442,"line":598},[440,2437,533],{"emptyLinePlaceholder":532},[440,2439,2440,2442,2444,2446,2448,2450,2452],{"class":442,"line":628},[440,2441,1916],{"class":453},[440,2443,458],{"class":457},[440,2445,493],{"class":461},[440,2447,2199],{"class":489},[440,2449,493],{"class":461},[440,2451,496],{"class":461},[440,2453,595],{"class":461},[440,2455,2456,2459,2461,2464,2466,2469,2471,2473,2477,2479,2482,2484,2486,2488],{"class":442,"line":649},[440,2457,2458],{"class":468},"  itemListElement",[440,2460,472],{"class":461},[440,2462,2463],{"class":457}," crumbs",[440,2465,396],{"class":461},[440,2467,2468],{"class":453},"map",[440,2470,458],{"class":457},[440,2472,458],{"class":461},[440,2474,2476],{"class":2475},"sHdIc","crumb",[440,2478,496],{"class":461},[440,2480,2481],{"class":2475}," index",[440,2483,2153],{"class":461},[440,2485,1057],{"class":847},[440,2487,1781],{"class":457},[440,2489,462],{"class":461},[440,2491,2492,2495,2497,2499,2501,2503,2506,2508],{"class":442,"line":655},[440,2493,2494],{"class":461},"    '",[440,2496,1898],{"class":468},[440,2498,493],{"class":461},[440,2500,472],{"class":461},[440,2502,486],{"class":461},[440,2504,2505],{"class":489},"ListItem",[440,2507,493],{"class":461},[440,2509,517],{"class":461},[440,2511,2512,2515,2517,2520,2523,2527],{"class":442,"line":665},[440,2513,2514],{"class":468},"    position",[440,2516,472],{"class":461},[440,2518,2519],{"class":457}," index ",[440,2521,2522],{"class":461},"+",[440,2524,2526],{"class":2525},"sbssI"," 1",[440,2528,517],{"class":461},[440,2530,2531,2534,2536,2539,2541,2543],{"class":442,"line":704},[440,2532,2533],{"class":468},"    name",[440,2535,472],{"class":461},[440,2537,2538],{"class":457}," crumb",[440,2540,396],{"class":461},[440,2542,1130],{"class":457},[440,2544,517],{"class":461},[440,2546,2547,2550,2552,2554,2556,2558,2560,2562,2565,2567],{"class":442,"line":728},[440,2548,2549],{"class":468},"    item",[440,2551,472],{"class":461},[440,2553,2408],{"class":461},[440,2555,683],{"class":489},[440,2557,1071],{"class":461},[440,2559,2476],{"class":457},[440,2561,396],{"class":461},[440,2563,2564],{"class":457},"path",[440,2566,1087],{"class":461},[440,2568,517],{"class":461},[440,2570,2571,2573,2576],{"class":442,"line":733},[440,2572,2161],{"class":461},[440,2574,2575],{"class":457},"))",[440,2577,517],{"class":461},[440,2579,2580,2582],{"class":442,"line":2158},[440,2581,523],{"class":461},[440,2583,526],{"class":457},[440,2585,2586,2588,2590],{"class":442,"line":2168},[440,2587,1402],{"class":461},[440,2589,2241],{"class":468},[440,2591,1376],{"class":461},[440,2593,2595],{"class":442,"line":2594},20,[440,2596,533],{"emptyLinePlaceholder":532},[440,2598,2600,2602,2604],{"class":442,"line":2599},21,[440,2601,1370],{"class":461},[440,2603,1373],{"class":468},[440,2605,1376],{"class":461},[440,2607,2609,2611,2614,2617,2619,2621,2624,2626],{"class":442,"line":2608},22,[440,2610,1381],{"class":461},[440,2612,2613],{"class":468},"nav",[440,2615,2616],{"class":847}," aria-label",[440,2618,854],{"class":461},[440,2620,2252],{"class":461},[440,2622,2623],{"class":489},"Breadcrumb",[440,2625,2252],{"class":461},[440,2627,1376],{"class":461},[440,2629,2631,2633,2635,2638,2640,2642,2644,2647,2650,2652,2655,2658,2660,2662,2664,2666,2668,2670,2672,2675,2677,2679,2681,2683,2685,2687],{"class":442,"line":2630},23,[440,2632,1391],{"class":461},[440,2634,2219],{"class":468},[440,2636,2637],{"class":545}," v-for",[440,2639,854],{"class":461},[440,2641,2252],{"class":461},[440,2643,2476],{"class":457},[440,2645,2646],{"class":461}," in ",[440,2648,2649],{"class":457},"crumbs",[440,2651,2252],{"class":461},[440,2653,2654],{"class":461}," :",[440,2656,2657],{"class":847},"key",[440,2659,854],{"class":461},[440,2661,2252],{"class":461},[440,2663,2476],{"class":457},[440,2665,396],{"class":461},[440,2667,2564],{"class":457},[440,2669,2252],{"class":461},[440,2671,2654],{"class":461},[440,2673,2674],{"class":847},"to",[440,2676,854],{"class":461},[440,2678,2252],{"class":461},[440,2680,2476],{"class":457},[440,2682,396],{"class":461},[440,2684,2564],{"class":457},[440,2686,2252],{"class":461},[440,2688,1376],{"class":461},[440,2690,2692],{"class":442,"line":2691},24,[440,2693,2694],{"class":457},"      {{ crumb.name }}\n",[440,2696,2698,2701,2703],{"class":442,"line":2697},25,[440,2699,2700],{"class":461},"    \u003C\u002F",[440,2702,2219],{"class":468},[440,2704,1376],{"class":461},[440,2706,2708,2710,2712],{"class":442,"line":2707},26,[440,2709,1462],{"class":461},[440,2711,2613],{"class":468},[440,2713,1376],{"class":461},[440,2715,2717,2719,2721],{"class":442,"line":2716},27,[440,2718,1402],{"class":461},[440,2720,1373],{"class":468},[440,2722,1376],{"class":461},[767,2724,770],{"id":2725},"как-это-проверяет-ranklint-6",[772,2727,2728,2734,2740],{},[775,2729,2730],{},[394,2731,2732],{"href":341},[371,2733,340],{},[775,2735,2736],{},[394,2737,2738],{"href":337},[371,2739,336],{},[775,2741,2742],{},[394,2743,2744],{"href":235},[371,2745,234],{},[398,2747,34],{"id":2748},"sitemap",[367,2750,2751,2752,2754,2755,2758,2759,2762],{},"Sitemap помогает обнаружить страницы, но не гарантирует индексацию. Search Central ясно говорит, что в нём должно лежать: только канонические, индексируемые URL, отвечающие 200. Страница с ",[371,2753,373],{}," в sitemap даёт противоречивый сигнал, а 404 в sitemap тратит краулинговый бюджет на каждом запросе. Сам файл обязан быть объявлен в robots.txt директивой ",[371,2756,2757],{},"Sitemap:",", и именно так его находит Яндекс, когда хост не подтверждён в панели вебмастера. Директива ",[371,2760,2761],{},"Host"," в том же robots.txt давно устарела и Яндексом не учитывается, главное зеркало определяется 301-редиректом.",[367,2764,1881,2765,2767,2768,2771,2772,2775,2776,2779,2780,2783],{},[371,2766,391],{}," отдаёт ",[371,2769,2770],{},"\u002Fsitemap.xml"," без всякой конфигурации: собирает статические роуты из ",[371,2773,2774],{},"app\u002Fpages",", приводит каждый ",[371,2777,2778],{},"loc"," к абсолютному виду относительно ",[371,2781,2782],{},"site.url"," и экранирует XML. Динамические роуты приходят из явных источников.",[431,2785,2787],{"className":433,"code":2786,"language":435,"meta":436,"style":436},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['@ranklint\u002Fnuxt'],\n  ranklint: {\n    site: { url: 'https:\u002F\u002Fexample.com', name: 'Example' },\n    sitemap: {\n      path: '\u002Fsitemap.xml',\n      autoRoutes: true,\n      cacheTtl: 3600,\n      sources: [\n        '\u002Fapi\u002Fseo\u002Fproduct-urls',\n        { loc: '\u002Fpricing', changefreq: 'weekly', priority: 0.8 },\n      ],\n    },\n  },\n})\n",[371,2788,2789,2793,2805,2823,2831,2863,2871,2886,2897,2909,2918,2930,2973,2980,2985,2989],{"__ignoreMap":436},[440,2790,2791],{"class":442,"line":443},[440,2792,539],{"class":446},[440,2794,2795,2797,2799,2801,2803],{"class":442,"line":450},[440,2796,546],{"class":545},[440,2798,549],{"class":545},[440,2800,552],{"class":453},[440,2802,458],{"class":457},[440,2804,462],{"class":461},[440,2806,2807,2809,2811,2813,2815,2817,2819,2821],{"class":442,"line":465},[440,2808,562],{"class":468},[440,2810,472],{"class":461},[440,2812,475],{"class":457},[440,2814,493],{"class":461},[440,2816,391],{"class":489},[440,2818,493],{"class":461},[440,2820,514],{"class":457},[440,2822,517],{"class":461},[440,2824,2825,2827,2829],{"class":442,"line":520},[440,2826,658],{"class":468},[440,2828,472],{"class":461},[440,2830,595],{"class":461},[440,2832,2833,2835,2837,2839,2841,2843,2845,2847,2849,2851,2853,2855,2857,2859,2861],{"class":442,"line":529},[440,2834,668],{"class":468},[440,2836,472],{"class":461},[440,2838,673],{"class":461},[440,2840,676],{"class":468},[440,2842,472],{"class":461},[440,2844,486],{"class":461},[440,2846,683],{"class":489},[440,2848,493],{"class":461},[440,2850,496],{"class":461},[440,2852,481],{"class":468},[440,2854,472],{"class":461},[440,2856,486],{"class":461},[440,2858,696],{"class":489},[440,2860,493],{"class":461},[440,2862,701],{"class":461},[440,2864,2865,2867,2869],{"class":442,"line":536},[440,2866,631],{"class":468},[440,2868,472],{"class":461},[440,2870,595],{"class":461},[440,2872,2873,2876,2878,2880,2882,2884],{"class":442,"line":542},[440,2874,2875],{"class":468},"      path",[440,2877,472],{"class":461},[440,2879,486],{"class":461},[440,2881,2770],{"class":489},[440,2883,493],{"class":461},[440,2885,517],{"class":461},[440,2887,2888,2891,2893,2895],{"class":442,"line":559},[440,2889,2890],{"class":468},"      autoRoutes",[440,2892,472],{"class":461},[440,2894,1760],{"class":1759},[440,2896,517],{"class":461},[440,2898,2899,2902,2904,2907],{"class":442,"line":587},[440,2900,2901],{"class":468},"      cacheTtl",[440,2903,472],{"class":461},[440,2905,2906],{"class":2525}," 3600",[440,2908,517],{"class":461},[440,2910,2911,2914,2916],{"class":442,"line":598},[440,2912,2913],{"class":468},"      sources",[440,2915,472],{"class":461},[440,2917,1646],{"class":457},[440,2919,2920,2923,2926,2928],{"class":442,"line":628},[440,2921,2922],{"class":461},"        '",[440,2924,2925],{"class":489},"\u002Fapi\u002Fseo\u002Fproduct-urls",[440,2927,493],{"class":461},[440,2929,517],{"class":461},[440,2931,2932,2935,2938,2940,2942,2945,2947,2949,2952,2954,2956,2959,2961,2963,2966,2968,2971],{"class":442,"line":649},[440,2933,2934],{"class":461},"        {",[440,2936,2937],{"class":468}," loc",[440,2939,472],{"class":461},[440,2941,486],{"class":461},[440,2943,2944],{"class":489},"\u002Fpricing",[440,2946,493],{"class":461},[440,2948,496],{"class":461},[440,2950,2951],{"class":468}," changefreq",[440,2953,472],{"class":461},[440,2955,486],{"class":461},[440,2957,2958],{"class":489},"weekly",[440,2960,493],{"class":461},[440,2962,496],{"class":461},[440,2964,2965],{"class":468}," priority",[440,2967,472],{"class":461},[440,2969,2970],{"class":2525}," 0.8",[440,2972,701],{"class":461},[440,2974,2975,2978],{"class":442,"line":655},[440,2976,2977],{"class":457},"      ]",[440,2979,517],{"class":461},[440,2981,2982],{"class":442,"line":665},[440,2983,2984],{"class":461},"    },\n",[440,2986,2987],{"class":442,"line":704},[440,2988,652],{"class":461},[440,2990,2991,2993],{"class":442,"line":728},[440,2992,523],{"class":461},[440,2994,526],{"class":457},[767,2996,770],{"id":2997},"как-это-проверяет-ranklint-7",[772,2999,3000,3006,3012,3018,3024],{},[775,3001,3002],{},[394,3003,3004],{"href":226},[371,3005,225],{},[775,3007,3008],{},[394,3009,3010],{"href":220},[371,3011,219],{},[775,3013,3014],{},[394,3015,3016],{"href":324},[371,3017,323],{},[775,3019,3020],{},[394,3021,3022],{"href":320},[371,3023,319],{},[775,3025,3026],{},[394,3027,3028],{"href":239},[371,3029,238],{},[398,3031,3033],{"id":3032},"изображения","Изображения",[367,3035,3036,3037,3040,3041,3043,3044,1895,3047,3050],{},"Документация Google Картинок просит описательный ",[371,3038,3039],{},"alt"," у смысловых изображений и пустой ",[371,3042,3039],{}," у декоративных. Стабильность вёрстки важна не меньше: собственные ",[371,3045,3046],{},"width",[371,3048,3049],{},"height"," позволяют браузеру зарезервировать место и удержать Cumulative Layout Shift низким, а CLS входит в Core Web Vitals.",[367,3052,3053,3054,3057,3058,3061,3062,3065,3066,3069,3070,3072,3073,396],{},"Третье правило про ",[371,3055,3056],{},"loading=\"lazy\"",". Ленивая загрузка ниже первого экрана даёт выигрыш, а ленивая загрузка hero-изображения откладывает Largest Contentful Paint на каждом визите. ",[371,3059,3060],{},"NuxtImg"," не добавляет ",[371,3063,3064],{},"loading"," сам: атрибут просто пробрасывается в ",[371,3067,3068],{},"img",", поэтому ставьте ",[371,3071,3056],{}," явно на картинки ниже первого экрана, а hero-изображению вместо этого проставляйте проп ",[371,3074,3075],{},"preload",[431,3077,3079],{"className":1356,"code":3078,"language":1358,"meta":436,"style":436},"\u003Ctemplate>\n  \u003CNuxtImg\n    src=\"\u002Fimg\u002Fhero.jpg\"\n    alt=\"Blue widget on a workbench\"\n    width=\"1200\"\n    height=\"630\"\n    sizes=\"100vw md:1200px\"\n    format=\"webp\"\n    preload\n  \u002F>\n  \u003CNuxtImg src=\"\u002Fimg\u002Fgallery-1.jpg\" alt=\"Widget from the side\" width=\"600\" height=\"400\" loading=\"lazy\" \u002F>\n\u003C\u002Ftemplate>\n",[371,3080,3081,3089,3096,3111,3125,3139,3153,3167,3181,3186,3191,3260],{"__ignoreMap":436},[440,3082,3083,3085,3087],{"class":442,"line":443},[440,3084,1370],{"class":461},[440,3086,1373],{"class":468},[440,3088,1376],{"class":461},[440,3090,3091,3093],{"class":442,"line":450},[440,3092,1381],{"class":461},[440,3094,3095],{"class":468},"NuxtImg\n",[440,3097,3098,3101,3103,3105,3108],{"class":442,"line":465},[440,3099,3100],{"class":847},"    src",[440,3102,854],{"class":461},[440,3104,2252],{"class":461},[440,3106,3107],{"class":489},"\u002Fimg\u002Fhero.jpg",[440,3109,3110],{"class":461},"\"\n",[440,3112,3113,3116,3118,3120,3123],{"class":442,"line":520},[440,3114,3115],{"class":847},"    alt",[440,3117,854],{"class":461},[440,3119,2252],{"class":461},[440,3121,3122],{"class":489},"Blue widget on a workbench",[440,3124,3110],{"class":461},[440,3126,3127,3130,3132,3134,3137],{"class":442,"line":529},[440,3128,3129],{"class":847},"    width",[440,3131,854],{"class":461},[440,3133,2252],{"class":461},[440,3135,3136],{"class":489},"1200",[440,3138,3110],{"class":461},[440,3140,3141,3144,3146,3148,3151],{"class":442,"line":536},[440,3142,3143],{"class":847},"    height",[440,3145,854],{"class":461},[440,3147,2252],{"class":461},[440,3149,3150],{"class":489},"630",[440,3152,3110],{"class":461},[440,3154,3155,3158,3160,3162,3165],{"class":442,"line":542},[440,3156,3157],{"class":847},"    sizes",[440,3159,854],{"class":461},[440,3161,2252],{"class":461},[440,3163,3164],{"class":489},"100vw md:1200px",[440,3166,3110],{"class":461},[440,3168,3169,3172,3174,3176,3179],{"class":442,"line":559},[440,3170,3171],{"class":847},"    format",[440,3173,854],{"class":461},[440,3175,2252],{"class":461},[440,3177,3178],{"class":489},"webp",[440,3180,3110],{"class":461},[440,3182,3183],{"class":442,"line":587},[440,3184,3185],{"class":847},"    preload\n",[440,3187,3188],{"class":442,"line":598},[440,3189,3190],{"class":461},"  \u002F>\n",[440,3192,3193,3195,3197,3200,3202,3204,3207,3209,3212,3214,3216,3219,3221,3224,3226,3228,3231,3233,3236,3238,3240,3243,3245,3248,3250,3252,3255,3257],{"class":442,"line":628},[440,3194,1381],{"class":461},[440,3196,3060],{"class":468},[440,3198,3199],{"class":847}," src",[440,3201,854],{"class":461},[440,3203,2252],{"class":461},[440,3205,3206],{"class":489},"\u002Fimg\u002Fgallery-1.jpg",[440,3208,2252],{"class":461},[440,3210,3211],{"class":847}," alt",[440,3213,854],{"class":461},[440,3215,2252],{"class":461},[440,3217,3218],{"class":489},"Widget from the side",[440,3220,2252],{"class":461},[440,3222,3223],{"class":847}," width",[440,3225,854],{"class":461},[440,3227,2252],{"class":461},[440,3229,3230],{"class":489},"600",[440,3232,2252],{"class":461},[440,3234,3235],{"class":847}," height",[440,3237,854],{"class":461},[440,3239,2252],{"class":461},[440,3241,3242],{"class":489},"400",[440,3244,2252],{"class":461},[440,3246,3247],{"class":847}," loading",[440,3249,854],{"class":461},[440,3251,2252],{"class":461},[440,3253,3254],{"class":489},"lazy",[440,3256,2252],{"class":461},[440,3258,3259],{"class":461}," \u002F>\n",[440,3261,3262,3264,3266],{"class":442,"line":649},[440,3263,1402],{"class":461},[440,3265,1373],{"class":468},[440,3267,1376],{"class":461},[767,3269,770],{"id":3270},"как-это-проверяет-ranklint-8",[772,3272,3273,3279,3285],{},[775,3274,3275],{},[394,3276,3277],{"href":197},[371,3278,196],{},[775,3280,3281],{},[394,3282,3283],{"href":201},[371,3284,200],{},[775,3286,3287],{},[394,3288,3289],{"href":205},[371,3290,204],{},[398,3292,3294],{"id":3293},"внутренние-ссылки","Внутренние ссылки",[367,3296,3297,3298,3300,3301,3303,3304,3306,3307,3310],{},"Search Central описывает краулинг как обнаружение по ссылкам: страница, на которую никто не ссылается, находится только через sitemap, и её важность считывается как низкая. Внутренним ссылкам нужен настоящий ",[371,3299,2223],{}," в серверном HTML, и ",[371,3302,2219],{}," его выдаёт, в отличие от ",[371,3305,1346],{}," с обработчиком ",[371,3308,3309],{},"@click",", который делает переход из кода.",[367,3312,3313,3314,3316],{},"Не менее важна консистентность. Выберите одно соглашение по завершающему слешу на весь сайт и держите на нём каждую внутреннюю ссылку, иначе каждый роут существует как два URL и сигналы дробятся. По-настоящему внешние ссылки помечайте ",[371,3315,721],{},", чтобы Nuxt не пытался разрешить их через роутер.",[431,3318,3320],{"className":1356,"code":3319,"language":1358,"meta":436,"style":436},"\u003Ctemplate>\n  \u003CNuxtLink to=\"\u002Fproducts\u002Fblue-widget\">Blue widget\u003C\u002FNuxtLink>\n  \u003CNuxtLink to=\"https:\u002F\u002Fstatus.example.com\" external target=\"_blank\" rel=\"noopener\">\n    Status page\n  \u003C\u002FNuxtLink>\n\u003C\u002Ftemplate>\n",[371,3321,3322,3330,3359,3404,3409,3417],{"__ignoreMap":436},[440,3323,3324,3326,3328],{"class":442,"line":443},[440,3325,1370],{"class":461},[440,3327,1373],{"class":468},[440,3329,1376],{"class":461},[440,3331,3332,3334,3336,3339,3341,3343,3346,3348,3350,3353,3355,3357],{"class":442,"line":450},[440,3333,1381],{"class":461},[440,3335,2219],{"class":468},[440,3337,3338],{"class":847}," to",[440,3340,854],{"class":461},[440,3342,2252],{"class":461},[440,3344,3345],{"class":489},"\u002Fproducts\u002Fblue-widget",[440,3347,2252],{"class":461},[440,3349,1396],{"class":461},[440,3351,3352],{"class":457},"Blue widget",[440,3354,1402],{"class":461},[440,3356,2219],{"class":468},[440,3358,1376],{"class":461},[440,3360,3361,3363,3365,3367,3369,3371,3374,3376,3379,3382,3384,3386,3389,3391,3393,3395,3397,3400,3402],{"class":442,"line":465},[440,3362,1381],{"class":461},[440,3364,2219],{"class":468},[440,3366,3338],{"class":847},[440,3368,854],{"class":461},[440,3370,2252],{"class":461},[440,3372,3373],{"class":489},"https:\u002F\u002Fstatus.example.com",[440,3375,2252],{"class":461},[440,3377,3378],{"class":847}," external",[440,3380,3381],{"class":847}," target",[440,3383,854],{"class":461},[440,3385,2252],{"class":461},[440,3387,3388],{"class":489},"_blank",[440,3390,2252],{"class":461},[440,3392,919],{"class":847},[440,3394,854],{"class":461},[440,3396,2252],{"class":461},[440,3398,3399],{"class":489},"noopener",[440,3401,2252],{"class":461},[440,3403,1376],{"class":461},[440,3405,3406],{"class":442,"line":520},[440,3407,3408],{"class":457},"    Status page\n",[440,3410,3411,3413,3415],{"class":442,"line":529},[440,3412,1462],{"class":461},[440,3414,2219],{"class":468},[440,3416,1376],{"class":461},[440,3418,3419,3421,3423],{"class":442,"line":536},[440,3420,1402],{"class":461},[440,3422,1373],{"class":468},[440,3424,1376],{"class":461},[767,3426,770],{"id":3427},"как-это-проверяет-ranklint-9",[772,3429,3430,3436,3442],{},[775,3431,3432],{},[394,3433,3434],{"href":235},[371,3435,234],{},[775,3437,3438],{},[394,3439,3440],{"href":255},[371,3441,254],{},[775,3443,3444],{},[394,3445,3446],{"href":239},[371,3447,238],{},[398,3449,3451],{"id":3450},"http-и-редиректы","HTTP и редиректы",[367,3453,3454],{},"Переехавший URL получает 301, и Search Central утверждает, что постоянный редирект остаётся самым сильным сигналом склейки, тогда как 302 говорит краулеру сохранить старый URL. Вторая проблема в цепочках: каждый лишний переход стоит краулингового бюджета и размывает сигнал, поэтому ведите редирект сразу на конечный адрес, а не через два промежуточных роута. Яндекс следует тем же правилам, но склеивает 301 медленнее, часто за несколько циклов обхода.",[367,3456,3457],{},"Остальная часть этого блока про гигиену, которая видна только в ответе: смешанный контент на HTTPS-странице, удалённый товар, который отдаёт 200 с пустым телом вместо 404, отсутствующий мета-тег viewport при mobile-first индексации и время до первого байта, которое растёт до тех пор, пока не упадёт скорость обхода.",[431,3459,3461],{"className":433,"code":3460,"language":435,"meta":436,"style":436},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  routeRules: {\n    '\u002Fold-pricing': { redirect: { to: '\u002Fpricing', statusCode: 301 } },\n    '\u002Fblog\u002F**': { swr: 3600 },\n  },\n  app: {\n    head: {\n      meta: [{ name: 'viewport', content: 'width=device-width, initial-scale=1' }],\n    },\n  },\n})\n",[371,3462,3463,3467,3479,3488,3532,3554,3558,3567,3576,3617,3621,3625],{"__ignoreMap":436},[440,3464,3465],{"class":442,"line":443},[440,3466,539],{"class":446},[440,3468,3469,3471,3473,3475,3477],{"class":442,"line":450},[440,3470,546],{"class":545},[440,3472,549],{"class":545},[440,3474,552],{"class":453},[440,3476,458],{"class":457},[440,3478,462],{"class":461},[440,3480,3481,3484,3486],{"class":442,"line":465},[440,3482,3483],{"class":468},"  routeRules",[440,3485,472],{"class":461},[440,3487,595],{"class":461},[440,3489,3490,3492,3495,3497,3499,3501,3504,3506,3508,3510,3512,3514,3516,3518,3520,3523,3525,3528,3530],{"class":442,"line":520},[440,3491,2494],{"class":461},[440,3493,3494],{"class":468},"\u002Fold-pricing",[440,3496,493],{"class":461},[440,3498,472],{"class":461},[440,3500,673],{"class":461},[440,3502,3503],{"class":468}," redirect",[440,3505,472],{"class":461},[440,3507,673],{"class":461},[440,3509,3338],{"class":468},[440,3511,472],{"class":461},[440,3513,486],{"class":461},[440,3515,2944],{"class":489},[440,3517,493],{"class":461},[440,3519,496],{"class":461},[440,3521,3522],{"class":468}," statusCode",[440,3524,472],{"class":461},[440,3526,3527],{"class":2525}," 301",[440,3529,511],{"class":461},[440,3531,701],{"class":461},[440,3533,3534,3536,3539,3541,3543,3545,3548,3550,3552],{"class":442,"line":529},[440,3535,2494],{"class":461},[440,3537,3538],{"class":468},"\u002Fblog\u002F**",[440,3540,493],{"class":461},[440,3542,472],{"class":461},[440,3544,673],{"class":461},[440,3546,3547],{"class":468}," swr",[440,3549,472],{"class":461},[440,3551,2906],{"class":2525},[440,3553,701],{"class":461},[440,3555,3556],{"class":442,"line":536},[440,3557,652],{"class":461},[440,3559,3560,3563,3565],{"class":442,"line":542},[440,3561,3562],{"class":468},"  app",[440,3564,472],{"class":461},[440,3566,595],{"class":461},[440,3568,3569,3572,3574],{"class":442,"line":559},[440,3570,3571],{"class":468},"    head",[440,3573,472],{"class":461},[440,3575,595],{"class":461},[440,3577,3578,3581,3583,3585,3587,3589,3591,3593,3596,3598,3600,3602,3604,3606,3609,3611,3613,3615],{"class":442,"line":587},[440,3579,3580],{"class":468},"      meta",[440,3582,472],{"class":461},[440,3584,475],{"class":457},[440,3586,478],{"class":461},[440,3588,481],{"class":468},[440,3590,472],{"class":461},[440,3592,486],{"class":461},[440,3594,3595],{"class":489},"viewport",[440,3597,493],{"class":461},[440,3599,496],{"class":461},[440,3601,499],{"class":468},[440,3603,472],{"class":461},[440,3605,486],{"class":461},[440,3607,3608],{"class":489},"width=device-width, initial-scale=1",[440,3610,493],{"class":461},[440,3612,511],{"class":461},[440,3614,514],{"class":457},[440,3616,517],{"class":461},[440,3618,3619],{"class":442,"line":598},[440,3620,2984],{"class":461},[440,3622,3623],{"class":442,"line":628},[440,3624,652],{"class":461},[440,3626,3627,3629],{"class":442,"line":649},[440,3628,523],{"class":461},[440,3630,526],{"class":457},[767,3632,770],{"id":3633},"как-это-проверяет-ranklint-10",[772,3635,3636,3642,3648,3654,3660,3666],{},[775,3637,3638],{},[394,3639,3640],{"href":251},[371,3641,250],{},[775,3643,3644],{},[394,3645,3646],{"href":243},[371,3647,242],{},[775,3649,3650],{},[394,3651,3652],{"href":155},[371,3653,154],{},[775,3655,3656],{},[394,3657,3658],{"href":159},[371,3659,158],{},[775,3661,3662],{},[394,3663,3664],{"href":163},[371,3665,162],{},[775,3667,3668],{},[394,3669,3670],{"href":171},[371,3671,170],{},[398,3673,3675],{"id":3674},"запуск-локально-и-в-ci","Запуск локально и в CI",[367,3677,3678],{},"Всё перечисленное можно проверить до деплоя. Запустите приложение, направьте на него ranklint, и краулер обойдёт сайт, прогонит все 43 правила и выйдет с кодом 1, когда найдётся проблема уровня error. Без конфига аудит идёт по минимальному конфигу, выведенному из origin переданного URL, и для первого прохода этого достаточно.",[431,3680,3684],{"className":3681,"code":3682,"language":3683,"meta":436,"style":436},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm run dev\nnpx ranklint audit --url http:\u002F\u002Flocalhost:3000\n","bash",[371,3685,3686,3697],{"__ignoreMap":436},[440,3687,3688,3691,3694],{"class":442,"line":443},[440,3689,3690],{"class":2286},"npm",[440,3692,3693],{"class":489}," run",[440,3695,3696],{"class":489}," dev\n",[440,3698,3699,3702,3705,3708,3711],{"class":442,"line":450},[440,3700,3701],{"class":2286},"npx",[440,3703,3704],{"class":489}," ranklint",[440,3706,3707],{"class":489}," audit",[440,3709,3710],{"class":489}," --url",[440,3712,3713],{"class":489}," http:\u002F\u002Flocalhost:3000\n",[431,3715,3717],{"className":3681,"code":3716,"language":3683,"meta":436,"style":436},"npx ranklint audit --url https:\u002F\u002Fexample.com --reporter markdown --json-output report.json\n",[371,3718,3719],{"__ignoreMap":436},[440,3720,3721,3723,3725,3727,3729,3732,3735,3738,3741],{"class":442,"line":443},[440,3722,3701],{"class":2286},[440,3724,3704],{"class":489},[440,3726,3707],{"class":489},[440,3728,3710],{"class":489},[440,3730,3731],{"class":489}," https:\u002F\u002Fexample.com",[440,3733,3734],{"class":489}," --reporter",[440,3736,3737],{"class":489}," markdown",[440,3739,3740],{"class":489}," --json-output",[440,3742,3743],{"class":489}," report.json\n",[367,3745,3746,3747,396],{},"В пайплайне полезно связать аудит и diff: аудит валит джобу на новых error-проблемах, а diff сравнивает текущий отчёт с отчётом базовой ветки, чтобы в ревью было видно только то, что сломало это изменение. Настройка для GitHub Actions и GitLab CI, включая закреплённый комментарий в пулл-реквесте и загрузку SARIF, лежит в ",[394,3748,60],{"href":61},[767,3750,770],{"id":3751},"как-это-проверяет-ranklint-11",[772,3753,3754,3759,3764],{},[775,3755,3756,3757],{},"Полный справочник правил с дефолтными severity: ",[394,3758,122],{"href":118},[775,3760,3761,3762],{},"Обход, репортеры и флаги: ",[394,3763,56],{"href":57},[775,3765,3766,3767],{},"Базовые отчёты, артефакты и пресеты для пайплайнов: ",[394,3768,60],{"href":61},[3770,3771,3772],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":436,"searchDepth":450,"depth":450,"links":3774},[3775,3778,3781,3784,3787,3790,3793,3796,3799,3802,3805,3808],{"id":400,"depth":450,"text":401,"children":3776},[3777],{"id":769,"depth":465,"text":770},{"id":813,"depth":450,"text":814,"children":3779},[3780],{"id":952,"depth":465,"text":770},{"id":987,"depth":450,"text":988,"children":3782},[3783],{"id":1275,"depth":465,"text":770},{"id":1316,"depth":450,"text":1317,"children":3785},[3786],{"id":1477,"depth":465,"text":770},{"id":1512,"depth":450,"text":1513,"children":3788},[3789],{"id":1851,"depth":465,"text":770},{"id":1874,"depth":450,"text":1875,"children":3791},[3792],{"id":2175,"depth":465,"text":770},{"id":2192,"depth":450,"text":2193,"children":3794},[3795],{"id":2725,"depth":465,"text":770},{"id":2748,"depth":450,"text":34,"children":3797},[3798],{"id":2997,"depth":465,"text":770},{"id":3032,"depth":450,"text":3033,"children":3800},[3801],{"id":3270,"depth":465,"text":770},{"id":3293,"depth":450,"text":3294,"children":3803},[3804],{"id":3427,"depth":465,"text":770},{"id":3450,"depth":450,"text":3451,"children":3806},[3807],{"id":3633,"depth":465,"text":770},{"id":3674,"depth":450,"text":3675,"children":3809},[3810],{"id":3751,"depth":465,"text":770},"Индексируемость, canonical, hreflang, JSON-LD, хлебные крошки, sitemap и ссылки: что нужно Nuxt-сайту и как это проверяет ranklint.","md",null,{},{"title":350,"description":3811},"p1V1chTLQnuARH_yUkWvDkIPP1xKj5rvFMBRH12QDdk",[3818,3820],{"title":340,"path":341,"stem":342,"description":3819,"children":-1},"валидность по Schema.org-схемам; { schemas } — свои схемы",{"title":359,"path":355,"stem":356,"description":3821,"children":-1},"Все релизы ranklint: ломающие изменения, новое и исправления, от новых к старым, со ссылками на коммиты.",1791750384163]