Nuxt2 基于Axios接口数据动态生成多语言sitemap站点地图
多语言站点地图生成实现方案
整个实现不需要额外引入复杂的XML处理依赖,直接基于Axios + Node.js原生文件模块就能搞定,步骤如下:
前置准备
如果项目还没安装Axios,先执行安装命令:npm i axios
核心实现逻辑
接口返回的内容本身就是符合sitemap规范的标准XML,不需要二次解析转换,只要按语言标识分别发起请求,拿到响应内容直接写入对应文件即可,避免解析再转义导致的格式错误。
- 新建生成脚本
generate-sitemap.js,代码如下:
const axios = require('axios'); const fs = require('fs/promises'); const path = require('path'); // 站点地图接口地址 const SITEMAP_API = 'http://mysite/api/sitemap'; // 输出目录,替换为你项目中存放静态资源、构建后会部署到站点根目录的文件夹,比如常规项目的public目录 const OUTPUT_DIR = path.resolve(__dirname, './public'); // 三个版本站点地图的配置 const sitemapTaskList = [ { outputFileName: 'sitemap.xml', // 默认版本不传语言标识,按接口默认返回内容写入 headers: {} }, { outputFileName: 'sitemap-en.xml', // 英语版传EN标识,请求头字段名替换为你和后端约定的实际字段,比如Accept-Language、X-Site-Lang等 headers: { 'X-Lang': 'EN' } }, { outputFileName: 'sitemap-fr.xml', // 法语版传FR标识 headers: { 'X-Lang': 'FR' } } ] async function batchGenerateSitemaps() { // 自动创建输出目录,目录已存在也不会报错 await fs.mkdir(OUTPUT_DIR, { recursive: true }); for (const task of sitemapTaskList) { try { const response = await axios.get(SITEMAP_API, { headers: task.headers, // 关键配置:指定响应类型为文本,避免Axios自动把XML内容按JSON解析导致格式错乱 responseType: 'text' }); const targetFilePath = path.join(OUTPUT_DIR, task.outputFileName); // 直接将接口返回的XML内容写入文件 await fs.writeFile(targetFilePath, response.data, 'utf8'); console.log(`[sitemap生成成功] ${targetFilePath}`); } catch (error) { console.error(`[sitemap生成失败] ${task.outputFileName}`, error.message); // 如果要求生成失败时中断构建流程,放开下行代码即可 // process.exit(1); } } } batchGenerateSitemaps();
配置自动执行
把脚本配置到项目的构建流程里,每次构建前自动生成最新的站点地图,不需要手动执行,修改package.json的scripts字段即可,示例:
{ "scripts": { "prebuild": "node generate-sitemap.js", "build": "你项目原有的构建命令,比如vite build、next build" } }
注意事项
- 代码里的请求头字段名不要硬抄,要和后端约定的语言标识传参字段对齐,否则拿不到对应语言的内容
- 如果接口有缓存,请求时可以拼接时间戳参数绕过缓存,把请求地址改为
`${SITEMAP_API}?t=${Date.now()}`即可 - 输出目录一定要配置正确,要保证生成的三个xml文件构建后会被放到站点根目录,否则搜索引擎抓取不到
内容的提问来源于stack exchange,提问作者biri
相关产品推荐
相关产品推荐

