yarn add next-sitemap next-sitemap требует базового файла конфигурации ( next-sitemap.config.js ) в соответствии с вашим проектом root
✅
next-sitemapбудет загружать переменные среды из файлов.envпо умолчанию.
/** @type {import('next-sitemap').IConfig} */
module . exports = {
siteUrl : process . env . SITE_URL || 'https://example.com' ,
generateRobotsTxt : true , // (optional)
// ...other options
}Добавьте следующую Sitemap в качестве сценария PostBuild
{
"build" : " next build " ,
"postbuild" : " next-sitemap "
} Вы также можете использовать пользовательский файл конфигурации вместо next-sitemap.config.js . Просто пройдите --config <your-config-file>.js , чтобы создать команду (пример: Custom-Config-file)
{
"build" : " next build " ,
"postbuild" : " next-sitemap --config awesome.config.js "
} При использовании PNPM вам необходимо создать файл .npmrc в корне вашего проекта, если вы хотите использовать шаг PostBuild:
//.npmrc
enable-pre-post-scripts=true
Из next-sitemap v2.x и далее, sitemap.xml будет индексной картой SiteMap. Он будет содержать URL -адреса всех других сгенерированных конечных точек карты сайта.
Индексная генерация Sitemap может быть отключена, установив generateIndexSitemap: false в файле конфигурации следующей сайты. (Это полезно для небольших/хобби-сайтов, которые не требуют индексной карты сайта) (пример: no-index-sitemaps)
Определите свойство sitemapSize в next-sitemap.config.js чтобы разделить большую карту сайта на несколько файлов.
/** @type {import('next-sitemap').IConfig} */
module . exports = {
siteUrl : 'https://example.com' ,
generateRobotsTxt : true ,
sitemapSize : 7000 ,
} Выше всего минимальная конфигурация для разделения большой карты сайта. Когда количество URL-адресов в карте сайта составляет более 7000, next-sitemap создаст файлы SiteMap (например, SiteMap-0.xml, SiteMap-1.xml) и индекс (например, sitemap.xml).
| свойство | описание | тип |
|---|---|---|
| SiteUrl | Базовый URL вашего сайта | нить |
| вывод (необязательно) | Next.js вывода режимов. Проверьте документацию. | standalone , export |
| changeFreq (необязательно) | Изменение частоты. По умолчанию daily | нить |
| Приоритет (необязательно) | Приоритет. По умолчанию 0.7 | число |
| sitemapbasefilename (необязательно) | Имя сгенерированного файла SiteMap перед расширением файла. По умолчанию "sitemap" | нить |
| AlternateRefs (необязательно) | Обозначите многоязычную поддержку с помощью уникального URL. По умолчанию [] | AlternateRef [] |
| sitemapize (необязательно) | Разделите большую карту сайта на несколько файлов, указав размер карты сайта. По умолчанию 5000 | число |
| Autolastmod (необязательно) | Добавить <lastmod/> Property. По умолчанию true | истинный |
| исключить (необязательно) | Массив относительных путей (поддержанный шаблон подстановочного знака) исключить из листинга на sitemap.xml или sitemap-*.xml . Например: ['/page-0', '/page-*', '/private/*'] .Помимо этой опции next-sitemap также предлагает опцию пользовательского transform , которая может быть использована для исключения URL-адресов, которые соответствуют конкретным шаблонам | нить[] |
| Sourcedir (необязательно) | Next.js строить каталог. По умолчанию .next | нить |
| на открытом воздухе (необязательно) | Все сгенерированные файлы будут экспортированы в этот каталог. По умолчанию public | нить |
| преобразование (необязательно) | Функция преобразования, которая работает для каждого relative-path в карте сайта. Возвращение null значения из функции преобразования приведет к исключению этого конкретного path из сгенерированного списка карты сайта. | асинхронная функция |
| Дополнительные пути (необязательно) | Асинхронная функция, которая возвращает список дополнительных путей, которые будут добавлены в список сгенерированных сайтов. | асинхронная функция |
| GENERATEINDEXSITEMAP | Генерировать индексные сайты. По умолчанию true | логический |
| GeneraterObotStxt (необязательно) | Создайте файл robots.txt и перечислите сгенерированные карты сайта. По умолчанию false | логический |
| robotstxtoptions.transformrobotstxt (необязательно) | Пользовательские роботы.txt Трансформатор Функция. (Пример: Custom-Robots-TXT-Transformer) По умолчанию: async(config, robotsTxt)=> robotsTxt | асинхронная функция |
| robotstxtoptions.policies (необязательно) | Политики для генерации robots.txt .По умолчанию: [{ userAgent: '*', allow: '/' }] | IRobotpolicy [] |
| robotstxtoptions.additionalsitemaps (необязательно) | Параметры для добавления дополнительных сайтов в robots.txt host inpit | нить[] |
| robotstxtoptions.includenonindexsitemaps (необязательно) | Начиная с v2.4x, сгенерированные robots.txt будут содержать только URL -адрес index sitemap и пользовательские конечные точки от robotsTxtOptions.additionalSitemaps .Это необходимо предотвратить дубликат URL -адреса (один раз через Index -Sitemap -> sitemap -url и один раз через robots.txt -> host) Установите эту опцию true , чтобы добавить все сгенерированные конечные точки карты сайта в robots.txtПо умолчанию false (рекомендуется) | логический |
Пользовательское преобразование обеспечивает метод расширения для добавления, удаления или исключения path или properties из набора URL. Функция преобразования работает для каждого relative path в карте сайта. И используйте key : объект value , чтобы добавить свойства в XML.
Возвращение null значения из функции преобразования приведет к исключению этой конкретной relative-path из сгенерированного списка сайта.
/** @type {import('next-sitemap').IConfig} */
module . exports = {
transform : async ( config , path ) => {
// custom function to ignore the path
if ( customIgnoreFunction ( path ) ) {
return null
}
// only create changefreq along with path
// returning partial properties will result in generation of XML field with only returned values.
if ( customLimitedField ( path ) ) {
// This returns `path` & `changefreq`. Hence it will result in the generation of XML field with `path` and `changefreq` properties only.
return {
loc : path , // => this will be exported as http(s)://<config.siteUrl>/<path>
changefreq : 'weekly' ,
}
}
// Use default transformation for all other cases
return {
loc : path , // => this will be exported as http(s)://<config.siteUrl>/<path>
changefreq : config . changefreq ,
priority : config . priority ,
lastmod : config . autoLastmod ? new Date ( ) . toISOString ( ) : undefined ,
alternateRefs : config . alternateRefs ?? [ ] ,
}
} ,
} additionalPaths Эта функция может быть полезна, если у вас есть большой список страниц, но вы не хотите отображать их все и использовать запасную сторону: true. Результаты выполнения этой функции будут добавлены в общий список путей и обработаны с помощью sitemapSize . Вы можете свободно добавлять динамические пути, но в отличие от additionalSitemap , вам не нужно разделять список путей на разные файлы в случае, если есть много путей для одного файла.
Если ваша функция возвращает путь, который уже существует, то она просто будет обновлена, дублирование не произойдет.
/** @type {import('next-sitemap').IConfig} */
module . exports = {
additionalPaths : async ( config ) => {
const result = [ ]
// required value only
result . push ( { loc : '/additional-page-1' } )
// all possible values
result . push ( {
loc : '/additional-page-2' ,
changefreq : 'yearly' ,
priority : 0.7 ,
lastmod : new Date ( ) . toISOString ( ) ,
// acts only on '/additional-page-2'
alternateRefs : [
{
href : 'https://es.example.com' ,
hreflang : 'es' ,
} ,
{
href : 'https://fr.example.com' ,
hreflang : 'fr' ,
} ,
] ,
} )
// using transformation from the current configuration
result . push ( await config . transform ( config , '/additional-page-3' ) )
return result
} ,
} Набор URL может содержать дополнительные сайты, определенные Google. Это Google News Map, карта сайта изображений или видео карта сайта. Вы можете добавить значения для этих карт сайта, обновляя запись в функции transform или добавив ее с помощью additionalPaths . Вы должны вернуть запись карты сайта в обоих случаях, так что это лучшее место для обновления вывода. Этот пример добавит изображение и тег новостей в каждую запись, но IRL вы, конечно, используете его с каким -то условием или в результате additionalPaths .
/** @type {import('next-sitemap').IConfig} */
const config = {
transform : async ( config , path ) => {
return {
loc : path , // => this will be exported as http(s)://<config.siteUrl>/<path>
changefreq : config . changefreq ,
priority : config . priority ,
lastmod : config . autoLastmod ? new Date ( ) . toISOString ( ) : undefined ,
images : [ { loc : 'https://example.com/image.jpg' } ] ,
news : {
title : 'Article 1' ,
publicationName : 'Google Scholar' ,
publicationLanguage : 'en' ,
date : new Date ( ) ,
} ,
}
} ,
}
export default config Вот пример конфигурации next-sitemap.config.js со всеми параметрами
/** @type {import('next-sitemap').IConfig} */
module . exports = {
siteUrl : 'https://example.com' ,
changefreq : 'daily' ,
priority : 0.7 ,
sitemapSize : 5000 ,
generateRobotsTxt : true ,
exclude : [ '/protected-page' , '/awesome/secret-page' ] ,
alternateRefs : [
{
href : 'https://es.example.com' ,
hreflang : 'es' ,
} ,
{
href : 'https://fr.example.com' ,
hreflang : 'fr' ,
} ,
] ,
// Default transformation function
transform : async ( config , path ) => {
return {
loc : path , // => this will be exported as http(s)://<config.siteUrl>/<path>
changefreq : config . changefreq ,
priority : config . priority ,
lastmod : config . autoLastmod ? new Date ( ) . toISOString ( ) : undefined ,
alternateRefs : config . alternateRefs ?? [ ] ,
}
} ,
additionalPaths : async ( config ) => [
await config . transform ( config , '/additional-page' ) ,
] ,
robotsTxtOptions : {
policies : [
{
userAgent : '*' ,
allow : '/' ,
} ,
{
userAgent : 'test-bot' ,
allow : [ '/path' , '/path-2' ] ,
} ,
{
userAgent : 'black-listed-bot' ,
disallow : [ '/sub-path-1' , '/path-2' ] ,
} ,
] ,
additionalSitemaps : [
'https://example.com/my-custom-sitemap-1.xml' ,
'https://example.com/my-custom-sitemap-2.xml' ,
'https://example.com/my-custom-sitemap-3.xml' ,
] ,
} ,
} Вышеупомянутая конфигурация будет генерировать Sitemaps на основе вашего проекта и robots.txt , как этот.
# *
User-agent: *
Allow: /
# test-bot
User-agent: test-bot
Allow: /path
Allow: /path-2
# black-listed-bot
User-agent: black-listed-bot
Disallow: /sub-path-1
Disallow: /path-2
# Host
Host: https://example.com
# Sitemaps
Sitemap: https://example.com/sitemap.xml # Index sitemap
Sitemap: https://example.com/my-custom-sitemap-1.xml
Sitemap: https://example.com/my-custom-sitemap-2.xml
Sitemap: https://example.com/my-custom-sitemap-3.xml next-sitemap теперь предоставляет два API для генерации сайтов на стороне сервера. Это поможет динамически генерировать index-sitemap (ы) и sitemap путем поиска данных из CMS или пользовательского источника.
getServerSideSitemapIndex : генерирует индексные сайты на основе предоставленных URL -адресов и возвращает application/xml -ответ. Поддерживает Next13+ Route. {TS, JS} файл.
getServerSideSitemapIndexLegacy . getServerSideSitemap : генерирует карту сайта на основе поля и возвращает application/xml -ответ. Поддерживает Next13+ Route. {TS, JS} файл.
getServerSideSitemapLegacy .Вот пример сценария для генерации индексной Sitemap на стороне сервера.
Создать app/server-sitemap-index.xml/route.ts file.
// app/server-sitemap-index.xml/route.ts
import { getServerSideSitemapIndex } from 'next-sitemap'
export async function GET ( request : Request ) {
// Method to source urls from cms
// const urls = await fetch('https//example.com/api')
return getServerSideSitemapIndex ( [
'https://example.com/path-1.xml' ,
'https://example.com/path-2.xml' ,
] )
} Создайте pages/server-sitemap-index.xml/index.tsx файл.
// pages/server-sitemap-index.xml/index.tsx
import { getServerSideSitemapIndexLegacy } from 'next-sitemap'
import { GetServerSideProps } from 'next'
export const getServerSideProps : GetServerSideProps = async ( ctx ) => {
// Method to source urls from cms
// const urls = await fetch('https//example.com/api')
return getServerSideSitemapIndexLegacy ( ctx , [
'https://example.com/path-1.xml' ,
'https://example.com/path-2.xml' ,
] )
}
// Default export to prevent next.js errors
export default function SitemapIndex ( ) { } Теперь, next.js обслуживает динамический индекс-sitemap от http://localhost:3000/server-sitemap-index.xml .
Перечислите страницу Dynamic Sitemap в robotsTxtOptions.additionalSitemaps и исключите этот путь из статического списка SiteMap.
// next-sitemap.config.js
/** @type {import('next-sitemap').IConfig} */
module . exports = {
siteUrl : 'https://example.com' ,
generateRobotsTxt : true ,
exclude : [ '/server-sitemap-index.xml' ] , // <= exclude here
robotsTxtOptions : {
additionalSitemaps : [
'https://example.com/server-sitemap-index.xml' , // <==== Add here
] ,
} ,
} Таким образом, next-sitemap будет управлять Sitemaps для всех ваших статических страниц, а ваш динамический index-sitemap будет перечислен на robots.txt.
Вот пример сценария для генерации сайтов на стороне сервера.
Создать app/server-sitemap.xml/route.ts file.
// app/server-sitemap.xml/route.ts
import { getServerSideSitemap } from 'next-sitemap'
export async function GET ( request : Request ) {
// Method to source urls from cms
// const urls = await fetch('https//example.com/api')
return getServerSideSitemap ( [
{
loc : 'https://example.com' ,
lastmod : new Date ( ) . toISOString ( ) ,
// changefreq
// priority
} ,
{
loc : 'https://example.com/dynamic-path-2' ,
lastmod : new Date ( ) . toISOString ( ) ,
// changefreq
// priority
} ,
] )
} Создать pages/server-sitemap.xml/index.tsx файл.
// pages/server-sitemap.xml/index.tsx
import { getServerSideSitemapLegacy } from 'next-sitemap'
import { GetServerSideProps } from 'next'
export const getServerSideProps : GetServerSideProps = async ( ctx ) => {
// Method to source urls from cms
// const urls = await fetch('https//example.com/api')
const fields = [
{
loc : 'https://example.com' , // Absolute url
lastmod : new Date ( ) . toISOString ( ) ,
// changefreq
// priority
} ,
{
loc : 'https://example.com/dynamic-path-2' , // Absolute url
lastmod : new Date ( ) . toISOString ( ) ,
// changefreq
// priority
} ,
]
return getServerSideSitemapLegacy ( ctx , fields )
}
// Default export to prevent next.js errors
export default function Sitemap ( ) { } Теперь next.js обслуживает динамическую карту сайта от http://localhost:3000/server-sitemap.xml .
Перечислите страницу Dynamic Sitemap в robotsTxtOptions.additionalSitemaps и исключите этот путь из статического списка SiteMap.
// next-sitemap.config.js
/** @type {import('next-sitemap').IConfig} */
module . exports = {
siteUrl : 'https://example.com' ,
generateRobotsTxt : true ,
exclude : [ '/server-sitemap.xml' ] , // <= exclude here
robotsTxtOptions : {
additionalSitemaps : [
'https://example.com/server-sitemap.xml' , // <==== Add here
] ,
} ,
} Таким образом, next-sitemap будет управлять Sitemaps для всех ваших статических страниц, и ваша динамическая карта сайта будет указана на robots.txt.
Добавьте следующую строку кода в next-sitemap.config.js для хорошего автозаполнения TypeScript! ?
/** @type {import('next-sitemap').IConfig} */
module . exports = {
// YOUR CONFIG
} 
Все PRS приветствуются :)