Добавление значения по умолчанию lastmod для динамических маршрутов при генерации sitemap.xml в Nuxt.

Вопрос или проблема

Я генерирую 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.

  1. Настройка значений по умолчанию: Вы правильно указали настройки по умолчанию в разделе sitemap, но чтобы они были применены ко всем маршрутам, вам нужно откорректировать фильтр маршрутов в конфигурации sitemap.

  2. Использование фильтра: Вы можете создать функцию фильтрации, которая будет проходить по всем маршрутам. Если 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. Попробуйте применить эти изменения и запустите команду генерации снова, чтобы проверить, работает ли это.

Оцените материал
Добавить комментарий

Капча загружается...