ibucoin

EeveNav导航站的搭建

主要是针对自己的一个小需求,希望能自己整理一下收集的网站地址,并做一个简单的整理。

为什么是Astro?

市面上成熟的导航站非常多,特别还有很多开源的AI导航站可以部署,但是就是杂且乱。选用Astro为技术栈,主要是功能可控,想要什么添加什么。内容驱动,由md来显示内容,则无需数据库,Cloudflare 就能够直接部署,不需要再去烦恼服务器的问题,静态网站也十分的稳定。 之前使用过Astro做过blog,算是一个初步的入门了解,这次主要是再更进一步的编写代码。

详解整体结构

整体结构 从整体结构来看,主要就是Header,中间Content分成左边和右边的导航部分,底部一个Footer。 代码地址:https://github.com/ibucoin/EeveNav

Sidebar讲解

从图片中的Sidebar来说,我们主要是需要获取到文章的分类和标签,然后并进行的对应的显示。

export async function getCategories() {
  const posts = await getCollection("blog");
  // 获取分类,返回分类名称和数量,即name和count
 
  const categories = posts.reduce(
    (acc, post) => {
      const category = post.data.category as string;
 
      if (!acc[category]) {
        acc[category] = { name: category, count: 0 } as Category;
      }
 
      acc[category].count++;
 
      return acc;
    },
    {} as Record<string, Category>,
  );
 
  return Object.values(categories);
}
export async function getTags() {
  const posts = await getCollection("blog");
 
  // 获取标签,只返回标签名称,去重
  const uniqueTags = new Set();
 
  posts.forEach((post) => {
    if (post.data.tags) {
      post.data.tags.forEach((tag) => uniqueTags.add(tag));
    }
  });
 
  return Array.from(uniqueTags);
}
 

以上两个函数主要工作就是通过getCollection获取posts,然后进行筛选处理出需要的数据。

标签页和分类页的实现

当我们通过标签或者分类进行跳转的时候,主要是进行了一个筛选。如果是动态页面,我们可以通过数据库很简单的实现这个操作,但是在astro要怎么做呢? 举个例子,我的地址是 categories/工具资源/ , 我需要筛选出带工具资源的所有文章和介绍链接。 我们需要先建立一个文件, /categories/[category]/[…page].astro ,这个的路由含义就在于category 响应 工具资源, page响应后面的分页

export async function getStaticPaths({ paginate }) {
  const allPosts = await getCollection("blog");
 
  // 获取所有唯一的分类
 
  const uniqueCategories = [
    ...new Set(allPosts.map((post) => post.data.category)),
  ];
 
  // 为每个分类生成一个页面
 
  return uniqueCategories.flatMap((category) => {
    const filteredPosts = allPosts.filter(
      (post) => post.data.category === category,
    );
 
    const result = paginate(filteredPosts, {
      params: { category },
 
      pageSize: 20,
 
      props: { category },
 
      // 自定义路由格式
 
      getPageNumbers: ({ totalPages }) =>
        Array.from({ length: totalPages }, (_, i) => i + 1),
    });
 
    return result;
  });
}
 
const { page } = Astro.props;
 

通过getStaticPaths,我们可以生成静态的路由表。通过paginate,我们对文章进行了一个分页处理,为每一个分类建立了一个路由。 通过const { page } = Astro.props,我们获取到了相关的参数,就可以做页面的渲染了。

基本上主要的知识点就在于静态路由分页的生成,其他的也还是在做页面的搭建工作