首页 > 其他分享 >nextjs 动态生成sitemap.xml 文件

nextjs 动态生成sitemap.xml 文件

时间:2024-11-12 17:50:09浏览次数:1  
标签:xml const name detail add nextjs routes entry sitemap

在 app 目录下创建文件 sitemap.js, 默认导出 sitemap方法

import fs from "fs";
import path from "path";

const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || "https://www.adog.life";
const baseDir = "src/app";
const dynamicDirs = [
  "blog",
  "videos",
  "newsletter",
  "demos",
  "vectordatabases",
  "devtools",
  "comparisons",
  "[locale]"
];
const excludeDirs = ["api", "rss"];
const excludeFiles = ["[name]", "redirect"];
const dynamicDetailDirs = [
  {
    base: "devtools",
    detail: "detail",
    jsonFile: "ai-assisted-developer-tools.json",
    key: "tools"
  },
  { base: "vectordatabases", detail: "detail", jsonFile: "vectordatabases.json", key: "databases" }
];

function getRoutes() {
  const fullPath = path.join(process.cwd(), baseDir);
  let routes = new Set(); // Use a Set to store unique routes

  function addRoutesRecursively(currentPath, relativePath = "") {
    const entries = fs.readdirSync(currentPath, { withFileTypes: true });

    entries.forEach((entry) => {
      const entryPath = path.join(currentPath, entry.name);
      const entryRelativePath = path.join(relativePath, entry.name);

      if (entry.isDirectory()) {
        addRoutesRecursively(entryPath, entryRelativePath);
      } else if (entry.isFile()) {
        if (
          (entry.name === "page.jsx" || entry.name === "page.tsx" || entry.name.endsWith(".mdx")) &&
          !excludeFiles.some((exclude) => entryRelativePath.includes(exclude))
        ) {
          const routePath = `/${relativePath.replace(/\\/g, "/")}`;
          routes.add(routePath.replace(/\/page$/, "")); // Add to Set
        }
      }
    });
  }

  // Read the entries of the base directory
  const entries = fs.readdirSync(fullPath, { withFileTypes: true });

  entries.forEach((entry) => {
    if (entry.isDirectory() && !excludeDirs.includes(entry.name)) {
      routes.add(`/${entry.name}`); // Add to Set

      if (dynamicDirs.includes(entry.name)) {
        const subDir = path.join(fullPath, entry.name);
        addRoutesRecursively(subDir, entry.name);
      }
    }
  });

  // Manually add dynamic routes for /devtools/detail and /vectordatabases/detail
  dynamicDetailDirs.forEach(({ base, detail, jsonFile, key }) => {
    const jsonFilePath = path.join(process.cwd(), "schema/data", jsonFile);
    if (fs.existsSync(jsonFilePath)) {
      const jsonData = JSON.parse(fs.readFileSync(jsonFilePath, "utf-8"));
      const detailNames = jsonData[key].map((item) => item.name);

      detailNames.forEach((name) => {
        const encodedName = encodeURIComponent(name);
        routes.add(`/${base}/${detail}/${encodedName}`);
      });
    }
  });

  // Add RSS feed routes
  // routes.add("/rss/feed.json");
  // routes.add("/rss/feed.xml");

  routes.add("/");

  // Convert Set to Array and log the routes for debugging
  const uniqueRoutes = Array.from(routes);
  // console.log("Generated routes:", uniqueRoutes);
  const important = ["/", "/signup", "/login", "/download"];

  return uniqueRoutes
    .map((r) => r.replace(/\/\[[^\]]*\]|\/\(.*?\)/g, ""))
    .filter(Boolean)
    .map((route) => {
      return {
        url: `${baseUrl}${route}`,
        lastModified: new Date(),
        changeFrequency: "daily",
        priority: important.includes(route) ? 1 : 0.5
      };
    });
}

function sitemap() {
  return getRoutes();
}

export default sitemap;

标签:xml,const,name,detail,add,nextjs,routes,entry,sitemap
From: https://www.cnblogs.com/da-datang/p/18542346

相关文章

  • php xml相关操作
    <?phpclassUtils{/***将数据转为XML*/publicstaticfunctiontoXml($array){$xml='<xml>';forEach($arrayas$k=>$v){$xml.='<'.$k.'><![CDATA['.$v.']]>......
  • 安装influxdb2(解决 https://repos.influxdata.com/stable//main/repodata/repomd.xml:
    influxdb分1.x和2.x不要搞错cat/etc/os-release获取操作系统https://docs.influxdata.com/influxdb/v2/install/?t=Linux1.官网安装#UbuntuandDebian#AddtheInfluxDatakeytoverifydownloadsandaddtherepositorycurl--silent--location-O\https://rep......
  • XMLHttpRequest以及Promise对象的使用
    AJAX原理通过[XHR]XMLHttpRequest对象来和服务器进行交互,axios库的底层也是通过XMLHttpRequest来和服务器进行交互,只是将实现细节进行了封装,让操作更加简洁可以用于某些只需和服务器进行少次交互的静态网站进行使用,减少代码的体积如何使用XMLHttpRequest创建对象配置请......
  • Package libxml-2.0 was not found in the pkg-config search path
    1、问题Packagelibxml-2.0wasnotfoundinthepkg-configsearchpath2、检查是否有库文件,nofind/-name"libxml-2.0.pc"echo$PKG_CONFIG_PATH这个变量啥也没有3、尝试解决wgetftp://xmlsoft.org/libxml2/libxml2-2.9.2.tar.gztar-xvflibxml2-2.9.2.tar.gzcdlibxml2-......
  • MyBatis如何关闭一级缓存(分注解和xml两种方式)
    @目录问题:为什么有缓存什么场景下必须需要关闭一级缓存关闭一级缓存方法(针对使用MyBatis场景)第1种:注解形式(可指定仅仅某个Mapper关闭注解)第2种:sql动态拼接传入的随机数问题:为什么有缓存mybatis默认开启一级缓存什么场景下必须需要关闭一级缓存场景:执行2次相同sql,但是第一次......
  • XML文件——增删改查
    XML文件——增删改查1将数据库表student_table的增删改查用XML来实现:2其中,conditionMap存储条件语句,where"xxx"="xxx"(whereconditionMap.begin()->first==conditionMap.begin()->second)34#include<iostream>5#include"tinyxml.h&quo......
  • 代码之眼,陈欣的xml解密之路
         第一章在未来的世界里,科技已经发展到了令人难以想象的地步。人工智能、量子计算和生物技术交织在一起,创造了一个全新的社会形态。在这个世界中,有一个名为“代码守护者”的组织,专门负责维护全球信息系统的安全和稳定。 陈欣是一名年轻的女程序员,她在代码守......
  • 3.2 MyBatis XML 循环语句
    MyBasis批量插入(foreach)比如批量插入user,我们先创建DAO方法WhatisDAO?DAO(DataAccessObject)模型就是写一个类,把访问数据库的代码封装起来,DAO在数据库与业务逻辑(Service)之间。Dao是数据访问层,Dao的作用是封装对数据库的访问:增删改查,不涉及业务逻辑,只是达到按某个条件获得......
  • 开源全站第一个Nextron(NextJS+electron)项目--NextTalk:一款集成chatgpt的实时聊天工
    NextTalk简介该项目是一个基于Nextron(NextJS+Electron)的桌面端实时聊天工具。但由于使用了NextJS中的ssr及apiroute功能,该程序只能在开发环境运行。关于生产版本:我将其网页端部分分离,并用Pake将其打包成桌面端,生产体验安装包我放在了release里,目前只打包了windows版......
  • nextjs 实战开发1 Mercury 二级域名分发系统| 曲速引擎 Warp Drive
    开发目标开发一个免费的二级域名分发系统创建项目root@ubuntu:~/dev-nextjs/mercury_frontend#pnpmcreatenext-app@latest.版本:pnpm-v9.12.2版本:node-vv20.16.0版本:next15.0.2为了开发方便,我们要将脚手架的package.json进行修改,nextdev-H0.0.0.0-p80,这样当我们运......