From 5f792d4b02e8bfe5d956205a53cde07ab6b6f3d1 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sat, 6 Aug 2022 15:38:59 +0100 Subject: [PATCH] feat: add generated sitemap --- nuxt.config.ts | 6 ++---- src/modules/sitemap.ts | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 src/modules/sitemap.ts diff --git a/nuxt.config.ts b/nuxt.config.ts index 663d317f..bb6dfab3 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -1,4 +1,3 @@ -import { useNuxt } from '@nuxt/kit' import { defineNuxtConfig } from 'nuxt' export default defineNuxtConfig({ @@ -19,9 +18,7 @@ export default defineNuxtConfig({ app: { head: { - htmlAttrs: { - lang: 'en', - }, + htmlAttrs: { lang: 'en' }, meta: [ { name: 'msapplication-TileColor', content: '#1a202c' }, { name: 'theme-color', content: '#1a202c' }, @@ -93,5 +90,6 @@ export default defineNuxtConfig({ 'vue-plausible', '~/modules/critters', '~/modules/components-chunk', + '~/modules/sitemap', ], }) diff --git a/src/modules/sitemap.ts b/src/modules/sitemap.ts new file mode 100644 index 00000000..f095e85d --- /dev/null +++ b/src/modules/sitemap.ts @@ -0,0 +1,41 @@ +import { writeFile } from 'fs/promises' +import { gzipSync } from 'zlib' +import { defineNuxtModule, useNuxt } from '@nuxt/kit' +import { join } from 'pathe' + +export default defineNuxtModule({ + meta: { + name: 'sitemap', + }, + setup() { + const nuxt = useNuxt() + const routes: string[] = [] + nuxt.hook('nitro:init', nitro => { + nitro.hooks.hook('prerender:route', route => { + if (!route.route.includes('/api')) { + routes.push(route.route) + } + }) + nitro.hooks.hook('close', async () => { + const timestamp = new Date().toISOString() + const sitemap = [ + ``, + ``, + ...routes.map( + route => + `https://roe.dev${route}${timestamp}` + ), + ``, + ].join('') + await writeFile( + join(nitro.options.output.publicDir, 'sitemap.xml'), + sitemap + ) + await writeFile( + join(nitro.options.output.publicDir, 'sitemap.xml.gz'), + gzipSync(sitemap) + ) + }) + }) + }, +}) -- 2.51.2