yarn add next-sitemap next-sitemap requiere un archivo de configuración básico ( next-sitemap.config.js ) en su proyecto Root
✅
next-sitemapcargará las variables de entorno de los archivos.envde forma predeterminada.
/** @type {import('next-sitemap').IConfig} */
module . exports = {
siteUrl : process . env . SITE_URL || 'https://example.com' ,
generateRobotsTxt : true , // (optional)
// ...other options
}Agregue el siguiente equipo como su guión posterior al edificio
{
"build" : " next build " ,
"postbuild" : " next-sitemap "
} También puede usar un archivo de configuración personalizado en lugar de next-sitemap.config.js . Simplemente pase --config <your-config-file>.js para construir el comando (ejemplo: personalizado-config-file)
{
"build" : " next build " ,
"postbuild" : " next-sitemap --config awesome.config.js "
} Al usar PNPM, debe crear un archivo .npmrc en la raíz de su proyecto si desea usar un paso posterior al edificio:
//.npmrc
enable-pre-post-scripts=true
Desde next-sitemap v2.x en adelante, sitemap.xml será el mapa del sitio del índice. Contendrá URL de todos los otros puntos finales de mapa del sitio generados.
La generación de mapa del sitio del índice se puede desactivar configurando generateIndexSitemap: false en el archivo de configuración de Siguiente Sitemap. (Esto es útil para sitios pequeños/de pasatiempos que no requieren un mapa del sitio de índice) (Ejemplo: SITEMAPS NO-Index)
Defina la propiedad sitemapSize en next-sitemap.config.js para dividir el mapa del sitio grande en múltiples archivos.
/** @type {import('next-sitemap').IConfig} */
module . exports = {
siteUrl : 'https://example.com' ,
generateRobotsTxt : true ,
sitemapSize : 7000 ,
} Arriba está la configuración mínima para dividir un mapa del sitio grande. Cuando el número de URL en un mapa del sitio es más de 7000, next-sitemap creará archivos Sitemap (por ejemplo, SitEmap-0.xml, SitEmap-1.xml) e índice (por ejemplo, SitEmap.xml).
| propiedad | descripción | tipo |
|---|---|---|
| siteurl | URL base de su sitio web | cadena |
| salida (opcional) | Next.js Modos de salida. Verifique la documentación. | standalone , export |
| ChangeFreq (opcional) | Cambiar frecuencia. Predeterminado daily | cadena |
| prioridad (opcional) | Prioridad. Predeterminado 0.7 | número |
| SitEmapBaseFileName (opcional) | El nombre del archivo de mapa del sitio generado antes de la extensión del archivo. Predeterminado "sitemap" | cadena |
| alternateRefs (opcional) | Denote el soporte de varios idiomas por URL única. Por defecto [] | Alternatreef [] |
| Sitemapsize (opcional) | Divida el mapa del sitio grande en múltiples archivos especificando el tamaño del mapa del sitio. Predeterminado 5000 | número |
| Autolastmod (opcional) | Agregue la propiedad <lastmod/> . Predeterminado true | verdadero |
| excluir (opcional) | Matriz de rutas relativas (patrón comodín compatible) para excluir del listado en sitemap.xml o sitemap-*.xml . por ejemplo: ['/page-0', '/page-*', '/private/*'] .Además de esta opción next-sitemap también ofrece una opción transform personalizada que podría usarse para excluir las URL que coinciden con patrones específicos | cadena[] |
| Sourcedir (opcional) | Next.js Build Directory. Predeterminado .next | cadena |
| Outdir (opcional) | Todos los archivos generados se exportarán a este directorio. public predeterminado | cadena |
| transformar (opcional) | Una función de transformación, que se ejecuta para cada relative-path en el mapa del sitio. Devolver el valor null de la función de transformación dará como resultado la exclusión de esa path específica de la lista de mapa del sitio generado. | función async |
| Papath adicional (opcional) | Función Async que devuelve una lista de rutas adicionales que se agregarán a la lista de mapa del sitio generado. | función async |
| generarindexsitemap | Generar los mapas de sitios índices. Predeterminado true | booleano |
| generadorBotStxt (opcional) | Genere un archivo robots.txt y enumere los sitios sitios generados. Predeterminado false | booleano |
| RobotStXtOptions.TransformRobotStxt (opcional) | Robots personalizados. Función del transformador txt. (Ejemplo: Custom-Robots-txt-transformer) Predeterminado: async(config, robotsTxt)=> robotsTxt | función async |
| RobotStXtOptions.Policies (opcional) | Políticas para generar robots.txt .Por defecto: [{ userAgent: '*', allow: '/' }] | IROBOTPOLICY [] |
| RobotStXtOptions.AdditionSitSeMaps (opcional) | Opciones para agregar Sitemaps adicionales a robots.txt Entrada de host | cadena[] |
| RobotStXtOptions.includenonIndexsiteMaps (opcional) | Desde V2.4x en adelante, Generated robots.txt solo contendrá URL de index sitemap y puntos finales proporcionados a medida de robotsTxtOptions.additionalSitemaps .Esto es para evitar el envío de URL duplicada (una vez a través de Index SitEmap -> Sitemap -url y una vez a través de robots.txt -> host) Establezca esta opción true para agregar todos los puntos finales de mapa del sitio generados a robots.txtfalse predeterminado (recomendado) | booleano |
La transformación personalizada proporciona un método de extensión para agregar, eliminar o excluir path o properties de un conjunto de URL. La función de transformación se ejecuta para cada relative path en el mapa del sitio. Y use el objeto key : value para agregar propiedades en el XML.
Devolver el valor null de la función de transformación dará como resultado la exclusión de ese relative-path específico de la lista de mapa del sitio generado.
/** @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 Esta función puede ser útil si tiene una gran lista de páginas, pero no desea representarlas a todas y usar Fallback: True. El resultado de la ejecución de esta función se agregará a la lista general de rutas y se procesará con sitemapSize . Usted es libre de agregar rutas dinámicas, pero a diferencia de additionalSitemap , no necesita dividir la lista de rutas en diferentes archivos en caso de que haya muchas rutas para un archivo.
Si su función devuelve una ruta que ya existe, simplemente se actualizará, la duplicación no sucederá.
/** @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
} ,
} El conjunto de URL puede contener siteos adicionales definidos por Google. Estos son el mapa del sitio de Google News, el mapa del sitio de imágenes o el mapa del sitio de video. Puede agregar los valores para estos Sitemaps actualizando la entrada en la función transform o agregándola con additionalPaths . Debe devolver una entrada de mapa del sitio en ambos casos, por lo que es el mejor lugar para actualizar la salida. Este ejemplo agregará una imagen y una etiqueta de noticias a cada entrada, pero, por supuesto, la usaría con alguna condición o dentro del resultado 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 Aquí hay un ejemplo de configuración next-sitemap.config.js con todas las opciones
/** @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' ,
] ,
} ,
} La configuración anterior generará Sitemaps en función de su proyecto y un 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 ahora proporciona dos API para generar Sitemaps del lado del servidor. Esto ayudará a generar dinámicamente index-sitemap (s) y sitemap (s) de Sitemap (s) obteniendo datos de CMS o fuente personalizada.
getServerSideSitemapIndex : genera sitios de sitios índices basados en URL proporcionadas y devuelve la respuesta application/xml . Admite el archivo Next13+. {TS, JS}.
getServerSideSitemapIndexLegacy . getServerSideSitemap : genera Sitemap basado en el campo Entiva y devuelve la respuesta application/xml . Admite el archivo Next13+. {TS, JS}.
getServerSideSitemapLegacy en su lugar.Aquí hay un script de muestra para generar el Sitemap Index en el lado del servidor.
Crear el archivo app/server-sitemap-index.xml/route.ts .
// 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' ,
] )
} Crear pages/server-sitemap-index.xml/index.tsx archivo.
// 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 ( ) { } Ahora, next.js está sirviendo el SITEMap de índice dinámico de http://localhost:3000/server-sitemap-index.xml .
Enumere la página Dynamic Sitemap en robotsTxtOptions.additionalSitemaps y excluya esta ruta de la lista de mapa del sitio estático.
// 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
] ,
} ,
} De esta manera, next-sitemap administrará los Sitemaps para todas sus páginas estáticas y su index-sitemap dinámico se enumerará en Robots.txt.
Aquí hay un script de muestra para generar Sitemaps en el lado del servidor.
Crear archivo app/server-sitemap.xml/route.ts .
// 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
} ,
] )
} Crear pages/server-sitemap.xml/index.tsx archivo.
// 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 ( ) { } Ahora, next.js está sirviendo el mapa del sitio dinámico de http://localhost:3000/server-sitemap.xml .
Enumere la página Dynamic Sitemap en robotsTxtOptions.additionalSitemaps y excluya esta ruta de la lista de mapa del sitio estático.
// 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
] ,
} ,
} De esta manera, next-sitemap administrará los Sitemaps para todas sus páginas estáticas y su mapa del sitio dinámico se enumerará en robots.txt.
Agregue la siguiente línea de código en su next-sitemap.config.js para un buen mecanografiado autocompletado! ?
/** @type {import('next-sitemap').IConfig} */
module . exports = {
// YOUR CONFIG
} 
Todos los PR son bienvenidos :)