Вопрос или проблема
Я генерирую sitemap.xml
для своего сайта на базе Nuxt 3
с использованием Nuxt Content
, и всё работает отлично, я получаю правильную карту сайта после запуска npm run generate
или nuxt generate
. Однако я не могу добавить значение по умолчанию для lastmod
для динамически создаваемых маршрутов. Я создал пример для воспроизведения в CodeSandBox.
Мой файл /content/imprint/index.md
выглядит так:
---
title: "Импринт"
description: "Информация о импринте / регистрации"
navigation:
linkTitle: "Импринт"
tags: ["convert", "compliance", "json"]
head:
meta:
- name: 'keywords'
sitemap:
loc: /imprint
lastmod: 2024-08-31
changefreq: monthly
priority: 1
---
И я получаю следующую информацию в моем sitemap.xml
так:
<url>
<loc>https://localhost:3003/imprint</loc>
<lastmod>2024-08-31</lastmod>
<changefreq>monthly</changefreq>
<priority>1</priority>
<xhtml:link rel="alternate" href="https://localhost:3003/imprint" hreflang="x-default" />
<xhtml:link rel="alternate" href="https://localhost:3003/imprint" hreflang="en" />
</url>
<url>
<loc>https://localhost:3003/tags/convert</loc>
<xhtml:link rel="alternate" href="https://localhost:3003/tags/convert" hreflang="x-default" />
<xhtml:link rel="alternate" href="https://localhost:3003/tags/convert" hreflang="en" />
</url>
<url>
<loc>https://localhost:3003/tags/compliance</loc>
<xhtml:link rel="alternate" href="https://localhost:3003/tags/compliance" hreflang="x-default" />
<xhtml:link rel="alternate" href="https://localhost:3003/tags/compliance" hreflang="en" />
</url>
<url>
<loc>https://localhost:3003/tags/json</loc>
<xhtml:link rel="alternate" href="https://localhost:3003/tags/json" hreflang="x-default" />
<xhtml:link rel="alternate" href="https://localhost:3003/tags/json" hreflang="en" />
</url>
Как мы видим, поскольку я определил lastmod
для своей страницы imprint/index.md
, я получил lastmod
только для этого URL
, но для всех тегов или динамических маршрутов, которые создаются в sitemap.xml
, значение lastmod
или changeFreq
не добавляется по умолчанию.
Я хочу знать, как я могу добавить значение по умолчанию lastmod
для всех динамических маршрутов tags
во время генерации sitemap.xml
? Если значение присутствует в файле, то добавьте его напрямую, если нет, то добавьте текущую дату и время, lastmod: new Date(),
Я попробовал добавить значения по умолчанию в свой nuxt.config.js
:
sitemap: {
hostname: process.env.NUXT_PUBLIC_SITE_URL,
gzip: true,
trailingSlash: true,
defaults: {
changefreq: "daily",
priority: 1,
lastmod: new Date(),
},
},
Но это не дало никакого результата, и я не получил lastmod
для /tags
. Как убедиться, что lastmod
добавляется для всех URL
, генерируемых в sitemap.xml
, включая динамические маршруты?
Я уже пробовал несколько вещей:
sitemap: {
hostname: process.env.NUXT_PUBLIC_SITE_URL,
trailingSlash: true,
lastmod: new Date(),
defaults: {
lastmod: new Date()
}
},
Также добавил логику для пользовательских маршрутов:
sitemap: {
filter ({ routes }) {
return routes.map(route => {
route.url = `${route.url}/`
route.lastmod = new Date()
return route
})
}
}
Я создал пример для воспроизведения в CodeSandBox.
Следующий код – мой nuxt.config.js
:
Click to toggle contents of `nuxt.config.js`
export default {
compatibilityDate: "2024-08-31",
modules: [
"@nuxtjs/tailwindcss",
"unplugin-fonts/nuxt",
"@nuxtjs/i18n",
"@nuxtjs/color-mode",
"@nuxt/image",
"@nuxt/content",
"@nuxtjs/sitemap",
],
ssr: true,
target: 'static',
site: {
url: process.env.BASE_URL || 'http://localhost:3000/',
name: "Тестовое приложение",
trailingSlash: true,
defaults: {
changefreq: "daily",
priority: 1,
lastmod: new Date(),
},
},
// Для поддержки и отображения .md файлов из /content с использованием @nuxt/content
content: {
// Для выделения синтаксиса кода, используя тематику
highlight: {
theme: {
default: "aurora-x",
dark: "everforest-dark",
sepia: "monokai",
},
langs: ["json", "xml", "java", "shell"],
},
markdown: {
remarkPlugins: ["remark-reading-time"], // Чтобы получить время чтения для каждого .md файла в /content
anchorLinks: false, // Не подчеркивать и не выделять заголовки h2, h3, h4 и т.д.
}
},
// Для поддержки темного/светлого режима с использованием @nuxtjs/color-mode
colorMode: {
classSuffix: "",
preference: "system",
fallback: "dark",
},
app: {
head: {
link: [
{
rel: "icon",
type: "image/x-icon",
href: `/img/favicon.ico`,
},
],
},
},
buildModules: [
{
vue: {
config: {
assetDirs: ["assets", "public"],
},
},
},
],
runtimeConfig: {
apiSecret: "123",
public: {},
},
components: [
{
path: "~/components",
pathPrefix: false,
},
],
build: {
postcss: {
postcssOptions: {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
},
},
},
i18n: {
locales: [
{
code: "en",
files: ["en.json", "en-extended.json"],
},
],
lazy: true,
langDir: "./locales",
defaultLocale: "en",
},
plugins: [{ src: "@/plugins/aos", ssr: false, mode: "client" }],
};
Ответ или решение
Чтобы добавить значение по умолчанию для lastmod
для динамически создаваемых маршрутов в вашем файле sitemap.xml
, нужно внести несколько изменений в ваш файл конфигурации nuxt.config.js
.
-
Настройка значений по умолчанию: Вы правильно указали настройки по умолчанию в разделе
sitemap
, но чтобы они были применены ко всем маршрутам, вам нужно откорректировать фильтр маршрутов в конфигурации sitemap. -
Использование фильтра: Вы можете создать функцию фильтрации, которая будет проходить по всем маршрутам. Если
lastmod
не задан для определенного маршрута, вы можете назначить ему текущее время.
Вот пример кода, который вы можете использовать в вашем nuxt.config.js
:
export default {
// Другие настройки...
sitemap: {
hostname: process.env.NUXT_PUBLIC_SITE_URL,
gzip: true,
trailingSlash: true,
defaults: {
changefreq: "daily",
priority: 1,
lastmod: new Date(), // Здесь вы можете установить значение по умолчанию для lastmod
},
filter({ routes }) {
return routes.map(route => {
// Проверяем, задан ли lastmod в созданном маршруте, если нет - задаем текущее значение
if (!route.lastmod) {
route.lastmod = new Date().toISOString().split('T')[0]; // Преобразование в формат YYYY-MM-DD
}
return route;
});
}
},
// Остальная часть вашего кода...
}
Разбор решения:
- В этом коде мы используем свойство
filter
, чтобы пройтись по каждому маршруту (routes
). - Мы проверяем, существует ли
lastmod
для текущего маршрута. Еслиlastmod
не указан, задаем ему текущее значение даты в форматеYYYY-MM-DD
. - Также вы можете задать фиксированное значение для
lastmod
в объектеdefaults
, что позволит использовать это значение где-то, где оно не зарезервировано.
Примечания:
- Убедитесь, что ваша локальная переменная
process.env.NUXT_PUBLIC_SITE_URL
определена, когда вы запускаете генерацию сайта. - Также проверьте, что ваш сервер корректно отдает файл
sitemap.xml
после выполненияnpm run generate
.
Этот подход должен позволить вам добавить значение lastmod
по умолчанию для всех динамических маршрутов в вашем файле sitemap.xml
. Попробуйте применить эти изменения и запустите команду генерации снова, чтобы проверить, работает ли это.