爱意满满的作品展示区。
djyde

一个基于 GitHub Issue 的博客系统

  •  1
     
  •   djyde ·
    djyde · Feb 23, 2022 · 5205 views
    This topic created in 1550 days ago, the information mentioned may be changed or developed.

    Desktop - 1 (1)

    很多人用 GitHub issue 当作自己的博客,于是我想到可以用 Next.js 通过 GitHub API 生成一个基于 GitHub issue 的博客。

    然而这样做的问题是 GitHub API 有请求 rate limit, 通过 access token 请求的 rate limit 是 5000/小时,因此对于博客网站来说,如果每次有用户访问就请求一次,当访问量上来后,很快就会达到请求上限。

    如果换一种思路,用 Next.js 的 getStaticProps 来在 build time 就把静态页面生成出来,就能解决这个问题。然后这样的结果是每次修改 issue, 都需要重新构建部署。

    还好 Next.js 有一个特殊的 data fetching 机制叫 ISR, 也就是按需重新生成静态页面。比如,如果我在获取 issue 信息的页面的 getStaticProps 中返回一个 revalidate, 就可以让部署在 Vercel 上的 Next.js 页面按照一个频率自动更新这个静态页面:

    export async function getStaticProps() {
      const res = await fetch('https://api.github.com/xxx')
      const posts = await res.json()
    
      return {
        props: {
          posts,
        },
        // Next.js will attempt to re-generate the page:
        // - When a request comes in
        // - At most once every 1 minutes
        revalidate: 60, // In seconds
      }
    }
    

    于是,基于这个机制,我写了 Sairin, 你可以通过一个按钮直接创建一个基于 GitHub issue 的博客,并部署到 Vercel:

    Deploy with Vercel

    在部署前你需要申请一个 GitHub personal access token 在创建项目时填入

    image

    输入一个项目名,和你申请的 GitHub access token, 点击 deploy, Vercel 会帮你创建一个 repo, 并部署 Sairin.

    部署完成后,就可以进入 Vercel 帮你创建的 repo, 在 issue 里写下你的第一篇博客文章:

    image

    需要注意的是,在文章的开头,你需要写入 frontmatter, 来指定这篇文章的路径:

    ---
    path: my-first-post
    ---
    
    正文内容
    

    这样就代表你可以通过 https://your-domain.com/my-first-post 访问你的这篇文章。

    完成文章后,就可以发表。发表的方式是在这篇 issue 加入一个 published 的 label:

    image

    等待一分钟,再次访问你的博客地址,就可以看到发布的文章。


    Sairin 支持 RSS 和自定义主题,详细的文档可以参考 https://github.com/djyde/sairin

    这是用 Sairin 生成的 Sairin 自己的博客 http://blog.sairinjs.com/

    16 replies    2022-03-10 12:43:37 +08:00
    xinyana
        1
    xinyana  
       Feb 23, 2022
    有想法,够简洁
    huruji
        2
    huruji  
       Feb 23, 2022
    可以支持现有的仓库吗
    czyt
        3
    czyt  
       Feb 23, 2022
    可以支持 cloudflared pages 么
    djyde
        4
    djyde  
    OP
       Feb 23, 2022
    @czyt 可以,在环境变量里把 REPO 改成现有的仓库,例如 `user/repo`
    djyde
        5
    djyde  
    OP
       Feb 23, 2022
    > 上一条回复错了。

    @huruji #2 可以,在环境变量里把 REPO 改成现有的仓库,例如 `user/repo`
    cheung
        6
    cheung  
       Feb 23, 2022
    学习学习学习学习
    seedscoder
        7
    seedscoder  
       Feb 24, 2022
    使用 GitHub 登录,出现 `This user account is blocked. Contact [email protected] for more information.`
    czyt
        8
    czyt  
       Feb 24, 2022
    我用 cloudflare pages 托管 hugo 的了
    tsuad
        9
    tsuad  
       Feb 24, 2022
    真不错.已 Star.
    私有仓库也行吗? 希望加上评论.那就完美了
    djyde
        10
    djyde  
    OP
       Feb 24, 2022
    @tsuad #9 私有仓库也没问题。评论正在做。
    cheung
        11
    cheung  
       Feb 24, 2022
    无需部署到 vercel ,是需要注释什么吗?
    mark2014
        12
    mark2014  
       Feb 24, 2022
    博客主题很棒
    WebKit
        13
    WebKit  
       Feb 25, 2022
    path 可以根据 title 生成就好了。
    codehz
        14
    codehz  
       Feb 25, 2022 via Android
    为什么不能换个思路,检测到 issue 创建再触发文章生成呢
    twfb
        15
    twfb  
       Mar 9, 2022
    参考楼主创意 写了个脚本 根据 issue 自动生成文章
    twfb
        16
    twfb  
       Mar 10, 2022
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1116 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 18:07 · PVG 02:07 · LAX 11:07 · JFK 14:07
    ♥ Do have faith in what you're doing.