From 9bbbb80e7565961deaffb8cc8590558c72cb2060 Mon Sep 17 00:00:00 2001 From: Riyyi Date: Tue, 8 Apr 2025 23:24:00 +0200 Subject: [PATCH] Implement sitemap.xml and robots.txt --- content.config.ts | 19 ++- nuxt.config.ts | 3 + package-lock.json | 269 +++++++++++++++++++++++++++++++++- package.json | 2 + public/robots.txt | 1 - src/pages/articles/[slug].vue | 5 +- 6 files changed, 285 insertions(+), 14 deletions(-) delete mode 100644 public/robots.txt diff --git a/content.config.ts b/content.config.ts index 0fc2a9c..84698fb 100644 --- a/content.config.ts +++ b/content.config.ts @@ -1,18 +1,21 @@ import { defineContentConfig, defineCollection, z } from '@nuxt/content' +import { asSitemapCollection } from "@nuxtjs/sitemap/content" // Lookup resolved from path: rootDir/content // see: https://github.com/nuxt/content/issues/3161 export default defineContentConfig({ collections: { - content: defineCollection({ - type: "page", - source: "**/*.md", - schema: z.object({ - date: z.date(), - img: z.string(), - tags: z.array(z.string()), + content: defineCollection( + asSitemapCollection({ + type: "page", + source: "**/*.md", + schema: z.object({ + date: z.date(), + img: z.string(), + tags: z.array(z.string()), + }) }) - }) + ) } }); diff --git a/nuxt.config.ts b/nuxt.config.ts index 18ad859..c685197 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -38,6 +38,8 @@ export default defineNuxtConfig({ modules: [ "@nuxt/content", "@nuxt/eslint", + "@nuxtjs/robots", + "@nuxtjs/sitemap", "@pinia/nuxt", "pinia-plugin-persistedstate/nuxt", "unplugin-icons/nuxt" @@ -52,6 +54,7 @@ export default defineNuxtConfig({ secure: process.env.NODE_ENV !== "development" // only send over HTTPS } }, + site: { url: "https://riyyi.com", name: "Personal Website" }, srcDir: "src/", ssr: false, typescript: { diff --git a/package-lock.json b/package-lock.json index 64f838a..214aaba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,8 @@ "@iconify-json/fa-solid": "^1.2.1", "@nuxt/content": "^3.4.0", "@nuxt/eslint": "^1.2.0", + "@nuxtjs/robots": "^5.2.9", + "@nuxtjs/sitemap": "^7.2.10", "@types/bootstrap": "^5.2.10", "@vue/language-server": "^2.1.10", "@vue/typescript-plugin": "^2.1.10", @@ -1642,6 +1644,136 @@ "vfile": "^6.0.3" } }, + "node_modules/@nuxtjs/robots": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@nuxtjs/robots/-/robots-5.2.9.tgz", + "integrity": "sha512-JJykE1llIByw8vqhrn4abSPyAcEFnfVOkIaD2/XLwkhNeZHzAQT2/p+ZhqwtaSMyWq8pnW1y0ei7gQYdCqOu+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^3.16.2", + "consola": "^3.4.2", + "defu": "^6.1.4", + "nuxt-site-config": "^3.1.9", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "sirv": "^3.0.1", + "std-env": "^3.9.0", + "ufo": "^1.5.4" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@nuxtjs/robots/node_modules/@nuxt/kit": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.16.2.tgz", + "integrity": "sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw==", + "dev": true, + "license": "MIT", + "dependencies": { + "c12": "^3.0.2", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.3", + "errx": "^0.1.0", + "exsolve": "^1.0.4", + "globby": "^14.1.0", + "ignore": "^7.0.3", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "mlly": "^1.7.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "semver": "^7.7.1", + "std-env": "^3.8.1", + "ufo": "^1.5.4", + "unctx": "^2.4.1", + "unimport": "^4.1.3", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxtjs/sitemap": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@nuxtjs/sitemap/-/sitemap-7.2.10.tgz", + "integrity": "sha512-7w1Ys2XIE/QVTJn5dbt2p/hrmDoGO9Ay1S3o6LI5M/MDRzKPvnXi5ByRUcc7Sfa3LUpLad5/w4IOQ4lyxhq9Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nuxt/devtools-kit": "^2.3.2", + "@nuxt/kit": "^3.16.2", + "chalk": "^5.4.1", + "defu": "^6.1.4", + "h3-compression": "^0.3.2", + "nuxt-site-config": "^3.1.9", + "ofetch": "^1.4.1", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "radix3": "^1.1.2", + "semver": "^7.7.1", + "sirv": "^3.0.1", + "ufo": "^1.5.4" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@nuxtjs/sitemap/node_modules/@nuxt/kit": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.16.2.tgz", + "integrity": "sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw==", + "dev": true, + "license": "MIT", + "dependencies": { + "c12": "^3.0.2", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.3", + "errx": "^0.1.0", + "exsolve": "^1.0.4", + "globby": "^14.1.0", + "ignore": "^7.0.3", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "mlly": "^1.7.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "semver": "^7.7.1", + "std-env": "^3.8.1", + "ufo": "^1.5.4", + "unctx": "^2.4.1", + "unimport": "^4.1.3", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxtjs/sitemap/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@oxc-parser/binding-linux-x64-gnu": { "version": "0.56.5", "cpu": [ @@ -5873,6 +6005,19 @@ "uncrypto": "^0.1.3" } }, + "node_modules/h3-compression": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/h3-compression/-/h3-compression-0.3.2.tgz", + "integrity": "sha512-B+yCKyDRnO0BXSfjAP4tCXJgJwmnKp3GyH5Yh66mY9KuOCrrGQSPk/gBFG2TgH7OyB/6mvqNZ1X0XNVuy0qRsw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/codedredd" + }, + "peerDependencies": { + "h3": "^1.6.0" + } + }, "node_modules/h3/node_modules/cookie-es": { "version": "1.2.2", "dev": true, @@ -8425,6 +8570,110 @@ "nuxt-component-meta": "bin/nuxt-component-meta.mjs" } }, + "node_modules/nuxt-site-config": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/nuxt-site-config/-/nuxt-site-config-3.1.9.tgz", + "integrity": "sha512-YB69GX0st8drv1d5xypweseiEWeR22tfGdyVH3U4R+mpUSz8paBx48ArKC6MgV22DKItoQm51LVoapF5pl5bEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^3.16.2", + "nuxt-site-config-kit": "3.1.9", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "sirv": "^3.0.1", + "site-config-stack": "3.1.9", + "ufo": "^1.5.4" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/nuxt-site-config-kit": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/nuxt-site-config-kit/-/nuxt-site-config-kit-3.1.9.tgz", + "integrity": "sha512-bcmpajYJgkNzA0jTq6CmmhKF2wHZUUKeVx/CIGI8lwWuAD81EBUZN0T4iKvVDo54g9UBrUUl8/5GhD65YBBG0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^3.16.2", + "pkg-types": "^2.1.0", + "site-config-stack": "3.1.9", + "std-env": "^3.9.0", + "ufo": "^1.5.4" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/nuxt-site-config-kit/node_modules/@nuxt/kit": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.16.2.tgz", + "integrity": "sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw==", + "dev": true, + "license": "MIT", + "dependencies": { + "c12": "^3.0.2", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.3", + "errx": "^0.1.0", + "exsolve": "^1.0.4", + "globby": "^14.1.0", + "ignore": "^7.0.3", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "mlly": "^1.7.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "semver": "^7.7.1", + "std-env": "^3.8.1", + "ufo": "^1.5.4", + "unctx": "^2.4.1", + "unimport": "^4.1.3", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/nuxt-site-config/node_modules/@nuxt/kit": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.16.2.tgz", + "integrity": "sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw==", + "dev": true, + "license": "MIT", + "dependencies": { + "c12": "^3.0.2", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.3", + "errx": "^0.1.0", + "exsolve": "^1.0.4", + "globby": "^14.1.0", + "ignore": "^7.0.3", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "mlly": "^1.7.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "semver": "^7.7.1", + "std-env": "^3.8.1", + "ufo": "^1.5.4", + "unctx": "^2.4.1", + "unimport": "^4.1.3", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, "node_modules/nuxt/node_modules/estree-walker": { "version": "3.0.3", "dev": true, @@ -10419,6 +10668,22 @@ "dev": true, "license": "MIT" }, + "node_modules/site-config-stack": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/site-config-stack/-/site-config-stack-3.1.9.tgz", + "integrity": "sha512-ed53+wLi+36SGqidU+YUpl7f1OHClPLmvUJ/aYZny1dCBnXvOsuFottrMkXDIK2N5UaMED9mz8KrRZTk94ARCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ufo": "^1.5.4" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": "^3" + } + }, "node_modules/skin-tone": { "version": "2.0.0", "dev": true, @@ -10620,7 +10885,9 @@ } }, "node_modules/std-env": { - "version": "3.8.1", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "license": "MIT" }, "node_modules/streamx": { diff --git a/package.json b/package.json index 134b0fc..3440957 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,8 @@ "@iconify-json/fa-solid": "^1.2.1", "@nuxt/content": "^3.4.0", "@nuxt/eslint": "^1.2.0", + "@nuxtjs/robots": "^5.2.9", + "@nuxtjs/sitemap": "^7.2.10", "@types/bootstrap": "^5.2.10", "@vue/language-server": "^2.1.10", "@vue/typescript-plugin": "^2.1.10", diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index 8b13789..0000000 --- a/public/robots.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/pages/articles/[slug].vue b/src/pages/articles/[slug].vue index 81aa21d..654f392 100644 --- a/src/pages/articles/[slug].vue +++ b/src/pages/articles/[slug].vue @@ -69,8 +69,5 @@ const { data: article } = await useAsyncData( () => queryCollection("content").path("/articles/" + params.slug).first() ); -useSeoMeta({ - title: article.value?.title, - description: article.value?.description -}) +useSeoMeta(article.value?.seo || {});