Skip to content

VitePress 生成站点地图

VitePress 默认支持为您的网站生成 sitemap.xml 文件。要启用它,请将以下内容添加到您的 .vitepress/config.js 文件中。

基础配置

ts
import { defineConfig } from 'vitepress'

export default defineConfig({
  sitemap: {
    hostname: 'https://example.com'
  }
})

如果您想在 sitemap.xml 中使用 <lastmod> 标签,您可以启用 lastUpdated 选项。

可用选项

网站地图支持由 sitemap 模块提供。您可以将其支持的任何选项传递给配置文件中的 sitemap 选项。这些选项将直接传递给 SitemapStream 构造函数。有关更多详细信息,请参阅 [sitemap](https://www.npmjs.com/package/sitemap#options-you-can-pass)文档。

示例:

ts
import { defineConfig } from 'vitepress'

export default defineConfig({
  sitemap: {
    hostname: 'https://example.com',
    lastmodDateOnly: false
  }
})

transformItems 钩子

您可以使用 sitemap.transformItems 钩子在将项目写入 sitemap.xml 文件之前修改站点地图项目。该钩子将使用一个包含站点地图项目的数组进行调用,并期望返回一个包含站点地图项目的数组。

示例:

ts
import { defineConfig } from 'vitepress'

export default defineConfig({
  sitemap: {
    hostname: 'https://example.com',
    transformItems: (items) => {
      // add new items or modify/filter existing items
      items.push({
        url: '/extra-page',
        changefreq: 'monthly',
        priority: 0.8
      })
      return items
    }
  }
})

另一种方法

安装依赖

环境和依赖版本

  • node 18.x
  • pnpm 7.x
  • vitepress 1.0.0-alpha.51
  • sitemap 7.1.1
sh
pnpm add -D sitemap

修改配置文件

docs/.vitepress/config.mts

ts
import { createWriteStream } from 'node:fs'
import { resolve } from 'node:path'
import { SitemapStream } from 'sitemap'
import { defineConfig, PageData } from 'vitepress'

const links: { url: string; lastmod: PageData['lastUpdated'] }[] = []

export default defineConfig({
  // 其他配置项...

  /* 站点地图 */
  transformHtml: (_, id, { pageData }) => {
    if (!/[\\/]404\.html$/.test(id))
      links.push({
        url: pageData.relativePath.replace(/((^|\/)index)?\.md$/, '$2')+ '.html',
        lastmod: pageData.lastUpdated
      })
  },
  buildEnd: async ({ outDir }) => {
    // hostname 为线上域名
    const sitemap = new SitemapStream({ hostname: 'https://nickyam.com/' })
    const writeStream = createWriteStream(resolve(outDir, 'sitemap.xml'))
    sitemap.pipe(writeStream)
    links.forEach((link) => sitemap.write(link))
    sitemap.end()
    await new Promise((r) => writeStream.on('finish', r))
  }
})

Powered by VitePress